profiler unity内存是什么东西
1个回答
展开全部
一方面是避免内存泄漏,另一方面是减少内存分配。
避免内存泄漏,需要细心的去进行黑盒白盒检查,一般都是设计上的不合理造成的。同时可以善用 Destroy() 方法,强制释放非托管内存。最好弄清楚 Unity 的资源管理机制,这方面网上教程很多,我就不做搬运工了。
减少内存分配,并不是说任何时候都不分配。在关卡进行时要将内存分配尽量减少,以降低 GC 的频率。可以用 Profiler 找出是所有分配了内存的地方,再根据经验判断是否要进行优化。我以前粗略的整理过一些会产生 GC 的操作,可供参考:
生成一个新的委托,例如将方法做为参数传入
对 List 进行 foreach
用枚举做 Key 进行字典查找(可能是默认比较器 GetHashCode 时装箱引起的,提供自定义的比较器应该能解决)
访问 animation 等组件
获取 SkinedMeshRenderer.bones 或 Mesh.uvs 之类的属性
yield return 0 (建议全部替换为 yield return null)
调用 GetComponentInChildren(建议自己实现一个无GC版本)
避免内存泄漏,需要细心的去进行黑盒白盒检查,一般都是设计上的不合理造成的。同时可以善用 Destroy() 方法,强制释放非托管内存。最好弄清楚 Unity 的资源管理机制,这方面网上教程很多,我就不做搬运工了。
减少内存分配,并不是说任何时候都不分配。在关卡进行时要将内存分配尽量减少,以降低 GC 的频率。可以用 Profiler 找出是所有分配了内存的地方,再根据经验判断是否要进行优化。我以前粗略的整理过一些会产生 GC 的操作,可供参考:
生成一个新的委托,例如将方法做为参数传入
对 List 进行 foreach
用枚举做 Key 进行字典查找(可能是默认比较器 GetHashCode 时装箱引起的,提供自定义的比较器应该能解决)
访问 animation 等组件
获取 SkinedMeshRenderer.bones 或 Mesh.uvs 之类的属性
yield return 0 (建议全部替换为 yield return null)
调用 GetComponentInChildren(建议自己实现一个无GC版本)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询