Unity 2017 Game Optimization 读书笔记(1)Scripting Strategies Part 1
1.Obtain Components using the fastest method
Unity有多种Getcomponet的方法:
GetComponent(string),
GetComponent<T>()
GetComponent(typeof(T))
哪种效率最高会跟随Unity版本的变化而变化,对于Unity 2017,本书作者的测试是GetComponent<T>()方法最给力,和GetComponent(typeof(T))差不太多。至于GetComponent(string),可定是最差了,跟其他俩个方法有很大的差距,很容易理解,毕竟是用的是神坑的string作为参数啊
2.Remove empty callback definitions
Awake(), Start(), Update()等Unity自带的方法在没使用时删除掉。因为即使是空方法,Unity也需要在生命周期的对应时间点去调用函数,依然会有开销。关于Unity的生命周期,可以查看对应介绍https://docs.unity3d.com/Manual/ExecutionOrder.html
特别需要注意的是Start 和 Update方法。因为当创建一个脚本时,Unity为它默认的添加了这俩个方法。
例如Start()方法,虽然是在Instantiate时只调用一次,但是当同时有大量脚本需要调用各自的start方法时,就有可能会带来Scene初始化变慢,浪费CPU导致帧率下降和卡顿。
举个栗子,两个物体碰撞时,我们可能会搞个特效出来,再显示个伤害数字文本,再播个小音效等等,这一瞬间会对CPU做出很多变化,这一帧一下子要干一堆事。但是只有这一帧整个生命周期包括Start,Update该做的都做完了才能进行下一帧,此时就可能导致帧率下降。
作者做了个测试,30000个脚本,两组对照组,一组没有空的函数,一组有空的Start 和 Update,结果显而易见。
特别需要警惕的是一个GameObject可能会有多个component,如果componet都有没必要的空函数,后果很残忍。
要解决这个很简单,删掉空函数就ok了,各家IDE工具也都支持正则,下边这个正则就可以找到所有的空Update函数。对于OnGUI() OnEnable()等等其他函数都是同样道理。
Update要谨慎使用,Update函数常见的使用不当的情形:(水平有限,这段有点怎么翻译都难翻译出原味儿,直接看英文吧还是)
1.重复计算并不常用或根本没用过的value
2.承担了过多本可以共享结果的工作
3.对于一些工作其实没必要这么高的调用频率
3. Cache Component references
在Unity编程中,重复计算是一个常见的问题,特别是对于GetComponent()这种函数消耗更大(原理在之后的第八章会讲,是因为Native内存)
比如下边这个例子,每次计算Damage,都要重复获取rigidbody等5个脚本的引用,这对CPU很不友好,如果要是这函数是在Update函数里每帧都调用,那简直是灾难。
我们可以用一丢丢内存(32 or 64bits)来换取这部分性能,为将来的使用缓存这些引用。除非有极其严格的内存瓶颈,毫无疑问这种方式更nice,将会节省很多CPU资源。同样的道理对于计算Value也同样适用,计算一次缓存下来避免多次计算,都可以提高效率。
Unity 2017 Game Optimization 读书笔记(1)Scripting Strategies Part 1相关推荐
- Unity 2017 Game Optimization 读书笔记 Scripting Strategies Part 5
一. Disable unused scripts and objects 场景中激活的物体或者脚本越多,开销越大.对于很多并没有产生作用的脚本和物体,可以隐藏掉从而提升性能,比如FPS游戏中视野外的 ...
- Unity 2017 Game Optimization 读书笔记(4)Scripting Strategies Part 4
1.Avoid Find() and SendMessage() at runtime SendMessage() 方法和 GameObject.Find() 相关的一系列方法都是开销非常大的.Sen ...
- Unity 2017 Game Optimization 读书笔记(3)Scripting Strategies Part 3
1.Avoid retrieving string properties from GameObjects 通常来讲,从C#的object中获取string 属性没有额外的内存开销,但是从Unity中 ...
- Unity 2017 Game Optimization 读书笔记(2)Scripting Strategies Part 2
1. Share calculation output 和上一个Tip很像,可以缓存计算结果或者各种信息,避免多次重复的计算,例如在场景里查找一个物体,从文件读取数据,解析Json等等. 容易忽略的点 ...
- Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (6)
1. Use less texture data 这条优化技巧非常直接,减少texture的数据量,减少分辨率或者降低位数,虽然可能会降低渲染质量.但是通常使用16-bit textures并不会明显 ...
- Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (5) Shader优化
Shader optimization Fill Rate和 Memory Bandwidth开销最大的地方就是Fragment Shader.开销多大取决于Fragment Shader的复杂程度: ...
- Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (4)
Optimizing Unity UI 本章讲探讨一些能够提升UGUI性能的优化方法. 1.Use more Canvases 一个Canvas的主要任务就是管理它层级下的所有UI元素,并且通过Dra ...
- Unity 2017 Game Optimization 读书笔记 Dynamic Graphics (3)
Rendering performance enhancements Enable/Disable GPU Skinning 开启GPU Skinning可以减轻CPU或GPU中Front End部分 ...
- Unity 2017 Game Optimization 读书笔记 The Benefits of Batching
batching(合批) 和大量的描述一个3D物体的数据有关系,比如meshes,verices,edges,UV coordinates 以及其他不同类型的数据.在Unity中谈论batching, ...
最新文章
- 10-18 JS基础复习笔记
- 面向对象笔记2 原型链 解释
- 什么才是真正的富贵?
- datatype未定义是什么意思_TypeError:无法读取未定义的属性'then'
- arm linux sms,基于arm处理器的手机短消息加密系统 encryption system for sms based on arm.pdf...
- 优秀的设计UI界面按钮素材,让点击率飙升
- “我很迷茫很焦虑,需要你的建议”|她在百度内网发了个求助帖
- python 多线程 线程池的四种实现方式
- vscode是付费的吗_Vscode
- 三次Hermite插值
- 手把手教你使用R语言做竞争风险模型并绘制列线图
- PHP在线网课问答题库搜索,推荐一个大学mooc网课答案题库在线查询公众号
- 两步解决WIN7 下IE经常未响应的假死现象
- java 引入微信sdk_手把手教您开发JAVA微信SDK-新手接入
- 对ADMEMS架构设计方法论的一点随笔
- matlab2016a配置vs2013编译器
- Shipyard的几个概念
- 信号处理中的反傅里叶变换(IFFT)原理
- 3ds_max入门教程
- c#设计模式(3)—— 利用观察者模式模拟推送消息
热门文章
- 前端 圆形进度图_CSS3+JS实现静态圆形进度条
- react使用link跳转传递参数_React-Typescript之路由跳转(使用this.props.history.push)
- delphi ascii字符数组_344. 反转字符串
- Moving stones(暴力+思维)
- Kate and imperfection CodeForces - 1333F(思维+数学)
- 编写mysql的工具_自己编写的数据库工具类
- mysql dba 试题_mysql dba面试题及答案.docx
- 学了C++不会STL,简直少了左膀右臂
- 图论--SCC强连通缩点--Tarjan
- [图神经网络] 图节点Node表示---GCN