关于项目优化杂谈

在已经过去的两个月中花了3周,总结了下龙2中的优化内容,目标是为了新的项目做前期的规划;涉及相关的项目中细节内容,不详说,说下哪些可以规避的问题

一.工具类开发

1.查找重复或冗余未使用的资源
2.查找超过1024尺寸的图片工具并加入每日检查
3.添加对于资源检查的工具
对于美术资源的检测,对于资源的规范性的检测,可以减少一些资源是否合理的检测代码。

二.最小的Dome测试

1.对于引入第三库的测试
2.某个设备崩溃的定位
3.快速验证某个方案是否可行
从某种角度就是排除法定位问题,其实快速测试的验证

三.表格的膨胀

随着内容的推进,表格的数量越来越多,表内的数段和行数也越多,会有表格遍历的性能问题,其次是加载和内容的速度影响。
1.方式是用到时加载,之前的项目都是游戏启动的时候加载。但现在目前不能采用这个方式。不然会带来启动时间变长。
2.启动的时候,加载表的索引的,在读表的时候正在加载表格,在一段时间后卸载
3.对于复杂的表或者行数多的表,使用常驻索引表。减少遍历的消耗

四.字符串的噩梦

字符串的拼接带来的性能问题,一直被困扰。
解决方案有两种适用两种不同的情况
1.每秒变化的文字,例如倒计时显示的文字,C#unsafe memcpy
2.文字拼接。string.Formate()或者stringBuilder
【Unity优化】Unity字符串String优化
Unity3D研究院之字符串拼接0GC(一百零四)

总结思路:

1.使用C# unsafe memcpy,是实现C语言的内存拷贝函数,内存占用会多一些;
2.用StringBuilder,也有性能问题上,但处于能接受的范围,一个是扩容,一个是toString()的。
3.还有一种方式String.Concat,如果不能确定最终长度,但是能够确定字符串的个数,可以将它们放在一个数组中,并调用String.Concat进行连接
项目的在初始分配一个较大的StringBuilder(256)。完美解决StringBuilder拼接的问题。

补充还有一份详细的讲解

重谈字符串连接性能上
重谈字符串连接性能中
重谈字符串连接性能下

五.代码优化

比如一些函数,之前使用觉得并没有问题,但随着内容推进,是性能的瓶颈了。如AddComponent,耗时巨大,会导致瞬卡。看源码,因为使用泛型,所以是把所有的组件遍历一遍,然后找到对应的类。这是也我觉得很意外的地方,Unity还有提高的地方。

1.有些代码写法,有一点性能提升。例如,如果需要判断包含并且要使用value值,则把myDictionary.Contains(oneKey)改为myDictionary.TryGetValue(oneKey, out myValue),可减少冗余的哈希次数;字典的key枚举用int代替
2.协程的使用上;协程执行Update接口,需要使用WaitForSeconds时,最好先将变量生成好,不要每次创建,会产生开销(开启关闭用函数名,方便查找引用)。
3.游戏中尽量不使用AddComponent,可以先在prefab上添加好Component。如果必须动态添加的话,使用XComponentHelper,优化销毁和检查引用的耗时

六.UE优化

这个有点老生常谈了,UWA关于的这样的方面的内容不少。
1.动静分离
2.合理规划图集
3.对象尽量避免高频使用setActive,会带来大GC问题,推荐使用setscale或者canvasgroup,但是使用setscale需要注意动画问题。(SetActiveByScale:scale 和alpha为0的时候就不会再画了,区别就是脚本还有没有在runtime)
4.异步加载或者分帧加载。
5.预制尽量小,对于复杂的预制进行拆分

七.网络优化

我之前没关注过的部分,随便写一定,欢迎交流
1.协议优化,网络包体减少,数据结构和字段类型
2.网络协议使用Pool,回收内存。减少内存分配及减少GC
3.客户端协议注册改为代码生成(避免调用GetAllTypes 及访问.BaseType 导致IL2CPP加载大量数据)

八.渲染优化

个人知识体系很少触及的部分,说一些优化点
1.游戏渲染分级,适配不同类型的机型用户,根据手机设备显示合适的渲染效果
2.植被系统,对于草的数据结构体优化,草的分布密度,是否弃用Gupinstance
3.阴影的优化在多人情况下测试,对于不同渲染基本调整方案
4.shader精度优化

总结

有些问题,是借助工具定位。Heap Explorer,可以看到项目中表格占用5M的内存空间,String确实是占用最多的。有些的内容,需要提前规划清楚,有些问题只有在性能优化测试的时候,才发现暴漏问题的。看了这些优化的内容,理解其中思路。这是一个综合考虑做出的选择,是最恰当的。才能清楚自己有哪些实确很少涉及。自己的完全不懂这一内容。

——————

参考

Understanding Automatic Memory Management
Memory Management Reference

文章目录
  1. 1. 一.工具类开发
  2. 2. 二.最小的Dome测试
  3. 3. 三.表格的膨胀
  4. 4. 四.字符串的噩梦
    1. 4.0.1. 总结思路:
      1. 4.0.1.0.1. 补充还有一份详细的讲解
  • 5. 五.代码优化
  • 6. 六.UE优化
  • 7. 七.网络优化
  • 8. 八.渲染优化
  • 9. 总结
    1. 9.1. 参考
  • |