Unity 3D中C#的性能优化小陷阱
本篇内容主要来自Unity官方手册:
一般性能优化一些地方为本人瞎编杜撰,请酌情参考。如有错误,欢迎指出。
Unity里C#编程虽然既简单还很爽,但是性能小陷阱还不少。我总强迫自己让代码最优,因此很留意这些细节。这里我记录了一下最近发现的一下优化点。
协程 别嵌套
协程( Coroutine )固然爽,我用起来可得心应手了,刷刷刷,平滑动画,等待加载,定时启动……
官方的意见是:
- 在可能的情况下,最好将一系列操作压缩到尽可能少协程。虽然嵌套协程非常适合代码清晰度和维护,但由于协程跟踪对象,它们会产生更高的内存开销。
- 如果一个协同程序几乎每帧都运行并且在长时间运行的操作中不会新产生,那么用一个
Update
或者LateUpdate
回调替换它通常更具可读性。对于长期运行或无限循环的协同程序尤其如此。
object == null 很昂贵
UnityEngine.Object子类的实例与null进行比较的成本比与纯C#类的比较要昂贵得多。因此,请避免在紧密循环或每帧运行的代码中进行这些空比较。
颜色字符串转换用ColorUtility
对于HTML格式的颜色字符串(#RRGGBBAA
)到Unity内Color的转换,比起自己写代码,内置的ColorUtility API 更好,内存分配更少。
数据结构自带的常量并不会节约GC
这个我也挺迷惑的。数据结构自带的常量其实是属性里写好的返回值。
例如Vector3.zero的属性体为:get { return new Vector3(0,0,0); }
因此 Vector3.zero 并不会比 new Vector3(0,0,0) 更快。
Find和FindObjectOfType很慢
随着场景物体增加,这个方法只会越来越慢。
Camera.main 实际上用的类似的方式( FindObjectWithTag ),要用的话还是先缓存一个变量。
其他的之后想起再补充……
还有一些代码快了,人也苦了的优化点
交错数组更快?
一般的多维数组是:int[ , ] arrray = new int[x, y];
交错数组是像这样:int[][] arrray = new int[x][ ];
此外,多维数组据用array.length 获取全部元素数量,array.Get Length(0)获取某个维度的长度,而交错数组则通过array.length 获取第一维长度,array[0].length获取下一维某元素的长度。
理论上多维数组应该更快,但是按照编译结果,交错数组反而快不少。(说明)
虽然交错数组是可能是快些,不过很多情况下会让代码很绕人(例如上面获取长度的解释你看懂了吗 : D ),所以要使用还要权衡一下。
方法调用能少就少
所有语言通用,但是没有方法的代码是没有灵魂的。
Unity 3D中C#的性能优化小陷阱的更多相关文章
- .NET性能优化小技巧
.NET 性能优化小技巧 Intro 之前做了短信发送速度的提升,在大师的指导下,发送短信的速度有了极大的提升,学到了一些提升 .NET 性能的一些小技巧 HttpClient 优化 关于使用 Htt ...
- Unity 3D中的阴影设置
在Unity 3D中,经常需要用到光照阴影,即Directional Light的Shadow,Shadow分为Hard Shadow和Soft Shadow.区别是Soft Shadow的阴影边缘比 ...
- 在Unity 3D中加入Image图片
在Unity 3D中加入Image图片,我在刚开始是加不进去的,为什么呢?因为没有图片,图如下: 原因就是我们没有把图片设置为Script,图片的格式还是默认的那个,这只能作为贴图使用.我们将图片进行 ...
- Unity 3D中不得不说的yield协程与消息传递
1. 协程 在Unity 3D中,我们刚开始写脚本的时候肯定会遇到类似下面这样的需求:每隔3秒发射一个烟花.怪物死亡后20秒再复活之类的.刚开始的时候喜欢把这些东西都塞到Update里面去,就像下面这 ...
- vue中关于v-for性能优化---track-by属性
vue中关于v-for性能优化---track-by属性 最近看了一些react,angular,Vue三者的对比文章,对比来说Vue比较突出的是轻量级与易上手. 对比Vue与angular,Vue有 ...
- Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析
Java生鲜电商平台-SpringCloud微服务架构中网络请求性能优化与源码解析 说明:Java生鲜电商平台中,由于服务进行了拆分,很多的业务服务导致了请求的网络延迟与性能消耗,对应的这些问题,我们 ...
- 小师妹学JVM之:JDK14中JVM的性能优化
目录 简介 String压缩 分层编译(Tiered Compilation) Code Cache分层 新的JIT编译器Graal 前置编译 压缩对象指针 Zero-Based 压缩指针 Escap ...
- Unity3D性能优化小tips——把this.transform缓存缓存起来
Unity3D开发时中有一个小tips,这在官方的文档里其实有提及的,但不那么显眼,这里小说一下: 在MonoBehaviour进行编程时,我们经常会用this.transform, this.gam ...
- 摘:JavaScript性能优化小知识总结
原文地址:http://www.codeceo.com/article/javascript-performance-tips.html JavaScript的性能问题不容小觑,这就需要我们开发人员在 ...
随机推荐
- [转载]1.3 UiPath变量的介绍和使用
一.变量 变量主要用于存储数据,它在RPA中扮演重要的数据传递角色,是RPA编程不可或缺的一部分.它包括变量名称和变量的值,变量的值支持多种数据类型,包括从通用值,文本,数字,数据表,时间和日期,Ui ...
- 路径操作OS模块和Path类(全)一篇够用!
路径操作 路径操作模块 os模块 os属性 os.name # windows是nt, linux是posix os.uname() # *nix支持 sys.platform #sys模块的属性, ...
- phpstorm设置内存限制的方法
phpstorm设置内存限制的方法有时候用phpstorm写代码 1个文件代码多的话会很卡 那就要修改内存限制 E:\Program Files (x86)\JetBrains\PhpStorm 20 ...
- 重写(OverRide)/重载(Overload)
方法的重写规则 参数列表必须完全与被重写方法的相同: 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同): ...
- JavaScrip 基础
JavaScript 基础 前段的三剑客之一JS,来来来,看看它是什么鬼!到底如何让网页动起来的呢,今天就搞他一下. 一.JavaScript的简单介绍 javascript是一门动态弱类型的解释型编 ...
- QKD 一些术语的含义
密钥率:每个信道使用的比特数. 系统开销:不能用来提取最终密钥的信号百分比. SNU:散粒噪声单元 RNG:随机数发生器 QRNG:量子随机数发生器 TRNG:真正的随机数生成器 PRNG:伪随机数发 ...
- 资深架构师Sum的故事:正则!入门就是这样简单
| 故事背景 职场如战场!Sum带领三个小队友用了两周,成功把代理功能给干出来了.如果说产品经理是最魔鬼的指挥官,那测试就是最魔鬼的教官.这两周,让Sum深深领略了什么是X市的日出. 不过话又说回来, ...
- idea2017建立jsp工程及tomcat等配置
1:建立工程,选择Java Enterprise,可能需要选择tomcat路径和jdk路径: =============================== 以下作为第二种方式参考: 1:创建新工程 ...
- 宋宝华:Linux设备驱动框架里的设计模式之——模板方法(Template Method)
本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前言 <设计模式>这本经典 ...
- ESP8266 使用AT指令
ESP8266 使用AT指令 问题:串口调试工具输入AT指令没返回结果 分析板子有两种模式 下载模式(默认) 运行模式 解决办法: 方法一:按下板子上的 RST 键位 方法二:使用 [安信可串口调试工 ...