找回密码
 立即注册
查看: 506|回复: 6

Unity一个优化的想法,麻烦康康行不行?

[复制链接]
发表于 2021-12-17 19:31 | 显示全部楼层 |阅读模式
你是不是想说“LOD”?
<hr/>还是得找出自己为什么卡的原因,不然这么瞎猜着折腾也不是个办法
发表于 2021-12-17 19:41 | 显示全部楼层
你是不是想说“LOD”?
<hr/>还是得找出自己为什么卡的原因,不然这么瞎猜着折腾也不是个办法
发表于 2021-12-17 19:46 | 显示全部楼层
2020.2.22更新
很多大佬对我说的SetActive性能问题提出质疑,我去了解了下发现频繁调用确实会有性能问题,因为里面涉及到了脏数据标记,遍历组件,更新Node操作,最佳解决方案应该就是把他移到屏幕之外,需要时再设置位置回到屏幕中。
<hr/>想法本身是没问题的,但是细节上可能没有思考的很到位
不能一直删除,实例化,而是需要把需要删除的游戏物理缓存并SetActive(false),实例化的时候找到对应缓存的物体然后再让他显示出来,即SetActive(true),如此循环即可
不知道具体怎么做的话可以百度Unity对象池
发表于 2021-12-17 19:52 | 显示全部楼层
然后你会惊讶的发现更卡了

因为你所谓的卡,大概率是因为掉帧
掉帧要么你CPU运算量太大,或者GPU运算量太大了
前者涉及到复杂的业务逻辑,后者涉及到当前屏幕内的渲染压力
这两块的优化我们先不谈
先说你的想法解决的是什么问题

动态加载 或者 叫 流式加载

你说的这个东西 业内有方案 叫 动态加载 或者 叫 流式加载
这个东西的目的是 - 节省内存空间,并不能降低运算量
但是问题是会增加CPU的工作量 , 因为不断加载卸载
反而会进一步增加运算量
并且这个加载还有一个巨大的问题就是会反复构造对象,会引起大量GC,造成更大的开销
这是需要仔细设计和考虑的
运行时动态分配内存空间是要尽量避免的,
分配内存的时间开销非常之高,并且GC的开销也非常高
如果你在代码中有运行时创建对象,最好的做法是先创建好,然后利用可见,或者从相机外移动到相机内来管理
而大大量重复的对象,可以提前放到列表中,反复使用
动态加载或者流式加载一般用于大世界的加载卸载,而且用的时候也会用一些trick来降低可能出现的卡顿感,例如战神的进门
楼主这种一个小场景 大量物体,肯定是不要用这种方式

遮挡剔除

而还有一个类似的方案叫遮挡剔除估计更符合你想要的结果
这个方案的目的是把场景中被遮挡的的物体不可见 来减少CPU的运算
但是这个不可见,不是删除, 还依旧保持在内存中
这个方案在物品多的时候 会降低一部分CPU的运算量 这个要自己去权衡
因为遮挡剔除的计算也需要运算量,而且假如场景中都是静态物体
遮挡剔除起到的作用还是比较有限的
最后很多引擎都自己集成的有,unity自然也自带遮挡剔除,
不过需要你手动开启

视锥剔除

还有一个方案叫视锥剔除
这个就和你说的几乎一样了,唯一的不同在于他仅仅是不可见
和遮挡剔除的差别在于视锥剔除是剔除摄像机外的物体
unity默认自带视锥剔除,这个貌似是自动的

考虑遮挡剔除+Lod的方案

然后在回到CPU和GPU上
我们看一个场景卡,首先是要分析为什么卡
一般内存不够不会造成卡顿, 卡顿都是因为CPU或者GPU开销太大
因为引擎一般都会自己做裁剪,所以只要关注摄像机内的性能优化就好了
例如做LOD就可以有效提高帧数, LOD就是利用空间换时间
在加上之前介绍的遮挡剔除,基本上能简单的缓解一部分
再往后的优化可能就要更深入的分析了
发表于 2021-12-17 19:57 | 显示全部楼层
你可以用unity自带的性能检测,看看卡顿是内存过多还是cpu压力大,然后相对平衡一下,不是时间换空间就是空间换时间,看你的描述是不是类似于跑酷那种的,如果是的话你这个想法没问题,跑酷的跑道出现的做法和你的想法类似。如有不对的地方欢迎讨论
发表于 2021-12-17 20:05 | 显示全部楼层
当然可以,否则跑酷游戏就很难存在了
发表于 2021-12-17 20:14 | 显示全部楼层
subsence 和dot了解一下
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-23 01:29 , Processed in 0.147132 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表