【读书笔记】《Unity3D高级编程: 主程手记》02:常用的优化方式
本文是《Unity3D高级编程: 主程手记》的读书笔记(后面统一简称主程手记),主程手记是一本很全面的Unity进阶的书记,值得所有Unity开发都买一本读一读。博主这里将一些自己经常用得上的内容重新做了遍归纳总结,做成读书笔记也方便自己查阅。
1. List和Dictionary的优化方式
List本质就是数组,Dictionary的本质是两个数组,一个数组报错索引,一个数组保存数据。
对于List,在创建时可以预估数量给予一个默认长度,能很好节约内存和GC。
对于Dictionary,必须要考虑哈希碰撞的问题,数组越大,哈希碰撞得概率就很小。所以在实际使用时,Key用值类型更好,也可以根据预估数量给予一个默认长度。GetHashCode()也是比较隐形的性能消耗。
2. 字符串问题
在看主程手记这本书前,博主一直不知道字符串如此离谱,字符串的运用就跟吃饭喝水一样寻常,代价就是字符串也像吃饭喝水一样疯狂吃内存。主要原因就是,C#语言中,字符串没有任何缓存机制,每次都需要重新分配string内存。这里有三种办法:
自建缓存机制。
原书中提出可以用Dictionary缓存一些标志性的字符串,每次使用时先查询字典,有则使用,没有则将其加入字典。
使用native方法。
是类似于C++的指针的方法来处理string类,书里给出了参考代码,这里不做赘述。
使用开源的第三方插件
3. 善用struct
从未想过struct
如此美妙,因为struct
是值类型,在赋值时是数据的拷贝,每个变量有独立的存储空间。因为struct
的内存分配在栈上而且是连续的,所以分配和释放都很快,善用struct
能很好的提升CPU的缓存命中率。这里有些使用技巧的总结:
- 适用于数据量小的情况。
- 适用于频繁创建和销毁的场景中。
4. 协程
协程是Unity中特殊的用法,其作用是能够在程序执行过程中暂停或恢复方法,达到类似多线程的效果,但是其本质还是主线程之中。携程的基本用法这里省略掉,着重写一下协程的问题和优化。
协程会产生CG,尤其是创建和停止时,会创建大量的临时对象,增加GC负担,优化协程的方法很简单,不用协程就可以了,使用UniTask即可。
5. 对象池
尽可能的使用对象池,这样可以减少内存池分配的次数和内存碎片,还能避免内存卸载带来的性能消耗。书中给出了实例代码,这里挖个坑后续补上自己的代码。