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的性能问题不容小觑,这就需要我们开发人员在 ...
随机推荐
- 从V神到以太坊——以太坊发展简史
以太坊的出现,让人们的认识从比特币飞跃到了区块链本身.使得区块链技术在非金融领域的普遍应用成为可能,同时,也被认为是区块链2.0时代的标志,是区块链技术发展史上重要的里程碑. 以太坊的故事,要从比特币 ...
- 「Usaco2012 Dec」第一(字典树+拓扑排序)
(我恨字符串) 惯例化简题目:给定n个字符串,可以改变字符的相对大小(在字典序中的大小),问:字符串i是否能成为最小的字符串(字典序) 解题过程: 首先你可以预处理出来26的全排列然后暴力然后你只要用 ...
- HtmlSpanner 使用小结 -- 安卓解析html
如何利用 HtmlSpanner解析 HTML格式 的字符串: 1. GitHub 下载HtmlSpanner项目 https://github.com/NightWhistler/HtmlSpann ...
- pycharm的部分个性化设置及快捷键
pycharm的个性化设置 下面记录了一些最基础的个性化设置,想要更多的修改设置,可以参考其他博文. file --> settings --> editor -->general ...
- ios jquery css('left')无法读取属性解决的方法
ios jquery css('left')无法读取属性解决的方法 <pre>$(this).position().left因为display:none状态下是读取不了 $(this).o ...
- Kubernetes(k8s)集群安装
一:简介 二:基础环境安装 1.系统环境 os Role ip Memory Centos 7 master01 192.168.25.30 4G Centos 7 node01 192.168.25 ...
- T-SQL Part X: UNION, EXCEPT and INTERSECT
MSDN上关于EXCEPT和INTERSECT的文档.MSDN上关于UNION的文档. 值得注意的是,UNION其实有两种,一种是普通的UNION,另外一种是UNION ALL.加上EXCEPT和IN ...
- 学习记录:《C++设计模式——李建忠主讲》5.“对象性能”模式
对象性能模式:面向对象很好地解决了抽象地问题,但是必不可免地要付出一定地代价.对于通常情况来讲,面向对象地成本大都可以忽略不计,但某些情况,面向对象所带来地成本必须谨慎处理. 典型模式:单件模式(Si ...
- ubuntu server 1604 关机和重启
命令有很多,记住以下两三个就够了 重启: sudo reboot (这个短,易记) sudo shutdown -r now 统一的shutdown形式 关机:sudo shutdown -P no ...
- windows下搭建dubbo 环境(dubbo-admin和服务提供者消费者)
---恢复内容开始--- 一. dubbo-admin管理控制台 从 https://github.com/apache/dubbo-admin clone项目到本地. 修改dubbo-admin- ...