Unity内存优化技术测试案例
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。
CSDN视频网址:http://edu.csdn.net/lecturer/144
Unity引擎优化技术,无非涉及到三点:CPU优化,GPU优化,内存优化。
先谈谈内存优化:大概可以分成三大部分:
1、 Unity3D内部的内存
2、 Mono的托管内存
3、 引入的DLL或者第三方DLL所需要的内存。
其中Unity3D内部的内存包括如下:
- 资源:纹理、网格、音频等等
- GameObject和各种组件。
- 引擎内部逻辑需要的内存:渲染器,物理系统,粒子系统等等
using UnityEngine; public class CachedMB : MonoBehaviour { Transform _transform; public Transform transform { get { return _transform ?? (_transform = base.transform); } } //for testing public Transform uncachedTransform { get { return base.transform; } } Rigidbody _rigidbody; public Rigidbody rigidbody { get { return _rigidbody ?? (_rigidbody = base.GetComponent<Rigidbody>()); } } Camera _camera; public Camera camera { get { return _camera ?? (_camera = base.GetComponent<Camera>()); } } Light _light; public Light light { get { return _light ?? (_light = base.GetComponent<Light>()); } } private Animation _animation; public Animation animation { get { return _animation ?? (_animation = base.GetComponent<Animation>()); } } private ConstantForce _constantForce; public ConstantForce constantForce { get { return _constantForce ?? (_constantForce = base.GetComponent<ConstantForce>()); } } private Renderer _renderer; public Renderer renderer { get { return _renderer ?? (_renderer = base.GetComponent<Renderer>()); } } private AudioSource _audio; public AudioSource audio { get { return _audio ?? (_audio = base.GetComponent<AudioSource>()); } } private GUIText _guiText; public GUIText guiText { get { return _guiText ?? (_guiText = base.GetComponent<GUIText>()); } } private GUITexture _guiTexture; public GUITexture guiTexture { get { return _guiTexture ?? (_guiTexture = base.GetComponent<GUITexture>()); } } private NetworkView _networkView; public NetworkView networkView { get { return _networkView ?? (_networkView = base.GetComponent<NetworkView>()); } } private Collider _collider; public Collider collider { get { return _collider ?? (_collider = base.GetComponent<Collider>()); } } private HingeJoint _hingeJoint; public HingeJoint hingeJoint { get { return _hingeJoint ?? (_hingeJoint = base.GetComponent<HingeJoint>()); } } private ParticleEmitter _particleEmitter; public ParticleEmitter particleEmitter { get { return _particleEmitter ?? (_particleEmitter = base.GetComponent<ParticleEmitter>()); } } private ParticleSystem _particleSystem; public ParticleSystem particleSystem { get { return _particleSystem ?? (_particleSystem = base.GetComponent<ParticleSystem>()); } } private GameObject _gameObject; public GameObject gameObject { get { return _gameObject ?? (_gameObject = base.gameObject); } } private string _tag; public string tag { get { return _tag ?? (_tag = base.tag); } set { _tag = value; base.tag = value; } } private string _name; public string name { get { return _name ?? (_name = base.name); } set { _tag = value; base.tag = value; } } }
接下来开始写测试代码案例:
using UnityEngine; using System.Collections; using System.Diagnostics; using System.IO; using System.Collections.Generic; public class CacheTest : CachedMB { const int ITERATIONS = 1000000; // Use this for initialization Transform cached; IEnumerator Start() { cached = uncachedTransform; for (; ; ) { yield return null; if (!Input.GetKeyDown(KeyCode.T)) continue; var sw1 = Stopwatch.StartNew(); { Transform trans1; for (int i = 0; i < ITERATIONS; i++) trans1 = GetComponent<Transform>(); } sw1.Stop(); var sw2 = Stopwatch.StartNew(); { Transform trans2; for (int i = 0; i < ITERATIONS; i++) trans2 = transform; } sw2.Stop(); var sw3 = Stopwatch.StartNew(); { Transform trans3; for (int i = 0; i < ITERATIONS; i++) trans3 = cached; } sw3.Stop(); var sw4 = Stopwatch.StartNew(); { Transform trans4; for (int i = 0; i < ITERATIONS; i++) trans4 = uncachedTransform; } sw4.Stop(); UnityEngine.Debug.LogWarning(ITERATIONS + " iterations"); UnityEngine.Debug.LogWarning("GetComponent " + sw1.ElapsedMilliseconds + "ms"); UnityEngine.Debug.LogWarning("MonoBehaviour " + sw4.ElapsedMilliseconds + "ms"); UnityEngine.Debug.LogWarning("CachedMB " + sw2.ElapsedMilliseconds + "ms"); UnityEngine.Debug.LogWarning("Manual Cache " + sw3.ElapsedMilliseconds + "ms"); } } }
执行结果如下所示:
通过显示的结果,我们知道,GetComponent是比较耗费时间的,在游戏开发中尤其是在每帧调用中少用。Manual Cache是耗费时间最少的,应该在游戏开发中尽量多用。
Unity内存优化技术测试案例的更多相关文章
- Unity内存优化
[Unity内存优化] 1.在Update方法或循环中,少用string类,因为string类的每次操作都会调用new生成新字符串对象.用StringBuilder代替string,StringBui ...
- Unity内存优化(贴图层面)
聊聊近况: 距离上一篇文章已经过了好久,主要原因是我懒了.公司项目也到了开始优化的阶段,上网找的资料,看过了就忘.还是想把它整理一下,写出来.其实我说的东西,网上都有,我只是搬运工而已. 贴图压缩: ...
- Unity内存优化之视频讲解
视频为中文讲解,mp4格式,大小3.05GB 目录 扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop135452397.taobao.com/ 联系店主
- Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术
转自冯乐乐的 <Unity Shader 入门精要> 移动平台的特点 为了尽可能一处那些隐藏的表面,减少overdraw(即一个像素被绘制多次),PowerVR芯片(通常用于ios设备和某 ...
- Unity教程之再谈Unity中的优化技术
这是从 Unity教程之再谈Unity中的优化技术 这篇文章里提取出来的一部分,这篇文章让我学到了挺多可能我应该知道却还没知道的知识,写的挺好的 优化几何体 这一步主要是为了针对性能瓶颈中的”顶点 ...
- 【Unity技巧】Unity中的优化技术
http://blog.csdn.net/candycat1992/article/details/42127811 写在前面 这一篇是在Digital Tutors的一个系列教程的基础上总结扩展而得 ...
- Unity堆内存优化
unity中减少堆内存分配以减少垃圾回收处理:只有局部变量且为值类值的变量是从stack栈中分配内存,其它所有情况都是从heap堆中分配内在.* 缓存获取到的数据.* 频繁被调用的函数中尽量少的分配空 ...
- Unity中的优化技术
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/candycat1992/article/ ...
- 【MDCC技术大咖秀】Android内存优化之OOM
大神分析的很全面,所以就转过来保存一份,转自:http://www.csdn.net/article/2015-09-18/2825737/1 以下为正文: Android的内存优化是性能优化中很重要 ...
随机推荐
- RDB
在运行情况下, Redis 以数据结构的形式将数据维持在内存中, 为了让这些数据在 Redis 重启之后仍然可用, Redis 分别提供了 RDB 和 AOF 两种持久化模式. 在 Redis 运行时 ...
- Lucene TF-IDF 相关性算分公式
转自: http://lutaf.com/210.htm Lucene在进行关键词查询的时候,默认用TF-IDF算法来计算关键词和文档的相关性,用这个数据排序 TF:词频,IDF:逆向文档频率,TF- ...
- 5.scala中的对象
排版乱?请移步原文获得更好的阅读体验 1.单例对象 scala中没有静态类或者静态方法,都是通过object实现的,它表示某个类的单例对象.如object People是class People的单例 ...
- ubuntu16.04后续工作
一.ruijie https://blog.csdn.net/u012217085/article/details/24369335 https://blog.csdn.net/Lv_Victor/a ...
- Ice Cream Tower
2017-08-18 21:53:38 writer:pprp 题意如下: Problem D. Ice Cream Tower Input file: Standard Input Output f ...
- ubuntu install git vim Plug manage
在UBUNTU采用163或是阿里云来更新源,最新的更新源地址可以在网上查阅, 阿里源 deb http://mirrors.aliyun.com/ubuntu/ bionic main restric ...
- Maven打可执行包的pom.xml配置
单独打出可执行包,然后将依赖包打入lib文件价中 <build> <plugins> <plugin> <groupId>org.apache.mave ...
- springboot获取配置文件中的内容
代码: GrilApplication.java @SpringBootApplication public class GrilApplication { public static void ma ...
- js计算之递归
看以下js代码: var w = [{ label: '你好', node: [ { label: '你好啊', node: [{ label: "还好", node: [] }, ...
- ElasticSearch + Canal 开发千万级的实时搜索系统【转】
公司是做社交相关产品的,社交类产品对搜索功能需求要求就比较高,需要根据用户城市.用户ID昵称等进行搜索. 项目原先的搜索接口采用SQL查询的方式实现,数据库表采用了按城市分表的方式.但随着业务的发展, ...