Unity3D中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简介 1. Unity界面 Shift + Space : 放大界面 Scene界面按钮渲染模式2D...
    MYves阅读 8,472评论 0 22
  • 目录 概述1.1 Vector3的定义1.2 主要优化的是什么? xLua对Vector3的优化2.1 xLua创...
    云木unity阅读 18,391评论 1 11
  • 今天突然来了兴致,想看一下爽文 之前因为天道图书馆在国外很受欢迎,所以看了一下感觉还可以 现在每天都会看一下,天道...
    小橙子爱你哟阅读 190评论 0 1
  • 明天是五一劳动节,相信大家都很兴奋! 不过,让我们更兴奋的是今天! 因为,我们金属诱惑俱乐部一周年啦! 北京、重庆...
    原子乔木阅读 312评论 0 0
  • 有时候开始翻翻别人朋友圈的时候 在想自己究竟是要点什么 姑娘做幼师找个家里做生意的男朋友 平时闲来和女孩子们约会吃...
    4948c28a5457阅读 374评论 0 0