0. 为什么需要这份规范
在大多数因 Niagara 导致性能问题的项目中,常见现象并不是"GPU 模拟太慢",而是:
- 渲染线程长时间阻塞在等待 Niagara 系统创建渲染缓冲(
WaitForGatherDynamicMeshElements); - 单帧内大量
CreateRHIBuffer调用; - 关卡里同一资产被复制粘贴几十上百个实例;
- 视野外、远距离的 Ambient 系统没有被正确剔除,每帧仍在渲染线程上分配显存缓冲。
在大多数因 Niagara 导致性能问题的项目中,常见现象并不是"GPU 模拟太慢",而是:
WaitForGatherDynamicMeshElements);CreateRHIBuffer 调用;当枚举和结构体为字典索引时,调用Contain方法是会拆箱装箱,则会出现GC。解决方案:
https://blog.csdn.net/qq_36576410/article/details/87909947
https://answer.uwa4d.com/question/59f716c0727b4a5d10c6dfef
https://stackoverflow.com/questions/50303424/why-is-dictionary-containskey-tostring-causing-gc-alloc
https://forum.unity.com/threads/solved-question-about-dictionary-any-vs-dictionary-containskey.589939/
并不是峰值就是问题点,因为Unity记录的数据只是300帧内的,是一个相对的数据。这个峰值只是在提示我们出现了问题。
数据越多我们更加难得去找到问题,所以我们需要减少数量去记录。与此同时,我们也可以使用排除法,就是一步一步的关闭一些系统,来做profile,然后做对比。
专注是一种不被无关紧要的任务和漫无目的的追逐分心的技能
最好的方式获得组件:
GetComponent<T>()
C#为托管语言,也就是托管代码,意思是他是运行在通用语言运行(CLR)环境中的,而不是编译他到指定的操作系统中去运行。
Unity 有三个内存分区: