|
然后你会惊讶的发现更卡了
因为你所谓的卡,大概率是因为掉帧
掉帧要么你CPU运算量太大,或者GPU运算量太大了
前者涉及到复杂的业务逻辑,后者涉及到当前屏幕内的渲染压力
这两块的优化我们先不谈
先说你的想法解决的是什么问题
动态加载 或者 叫 流式加载
你说的这个东西 业内有方案 叫 动态加载 或者 叫 流式加载
这个东西的目的是 - 节省内存空间,并不能降低运算量
但是问题是会增加CPU的工作量 , 因为不断加载卸载
反而会进一步增加运算量
并且这个加载还有一个巨大的问题就是会反复构造对象,会引起大量GC,造成更大的开销
这是需要仔细设计和考虑的
运行时动态分配内存空间是要尽量避免的,
分配内存的时间开销非常之高,并且GC的开销也非常高
如果你在代码中有运行时创建对象,最好的做法是先创建好,然后利用可见,或者从相机外移动到相机内来管理
而大大量重复的对象,可以提前放到列表中,反复使用
动态加载或者流式加载一般用于大世界的加载卸载,而且用的时候也会用一些trick来降低可能出现的卡顿感,例如战神的进门
楼主这种一个小场景 大量物体,肯定是不要用这种方式
遮挡剔除
而还有一个类似的方案叫遮挡剔除估计更符合你想要的结果
这个方案的目的是把场景中被遮挡的的物体不可见 来减少CPU的运算
但是这个不可见,不是删除, 还依旧保持在内存中
这个方案在物品多的时候 会降低一部分CPU的运算量 这个要自己去权衡
因为遮挡剔除的计算也需要运算量,而且假如场景中都是静态物体
遮挡剔除起到的作用还是比较有限的
最后很多引擎都自己集成的有,unity自然也自带遮挡剔除,
不过需要你手动开启
视锥剔除
还有一个方案叫视锥剔除
这个就和你说的几乎一样了,唯一的不同在于他仅仅是不可见
和遮挡剔除的差别在于视锥剔除是剔除摄像机外的物体
unity默认自带视锥剔除,这个貌似是自动的
考虑遮挡剔除+Lod的方案
然后在回到CPU和GPU上
我们看一个场景卡,首先是要分析为什么卡
一般内存不够不会造成卡顿, 卡顿都是因为CPU或者GPU开销太大
因为引擎一般都会自己做裁剪,所以只要关注摄像机内的性能优化就好了
例如做LOD就可以有效提高帧数, LOD就是利用空间换时间
在加上之前介绍的遮挡剔除,基本上能简单的缓解一部分
再往后的优化可能就要更深入的分析了 |
|