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的内存优化是性能优化中很重要 ...
随机推荐
- Jquery7 表单选择器
学习要点: 1.常规选择器 2.表单选择器 3.表单过滤器 表单作为 HTML 中一种特殊的元素,操作方法较为多样性和特殊性,开发者不但可以使用之前的常规选择器或过滤器,也可以使用 jQuery 为表 ...
- 如何打开linux内核中dev_dbg的开关
比如要打开某个驱动中的dev_dbg,那么需要在驱动文件.c中这些行"<linux/device.h>"或者"<linux /platfom_devic ...
- jar包中使用log4j2不起作用
某程序中有使用到log4j2,将该程序打包成jar,使用以下命令执行时,发现log4j不输出 java -cp Tool.jar com.zhen.nameOnce.Log4jTest 且报以下错误 ...
- init() 方法
1 /** * servlet init()在web应用程序启动之后,第一个请求到达Servlet之前调用. * 问题1:如果init()中需要处理大量的工作,那么servlet在处理第一个请求需要花 ...
- IIS和ASP.NET MVC 管道处理模型
转载自 博客园 青羽 http://www.cnblogs.com/tenghoo/archive/2009/11/04/IIS_And_ASPNET_Http_Runtime_Pipeline.h ...
- nginx页面不能正常访问排除方法
nginx页面不能访问 nginx页面不能访问 检查服务端服务是否启动成功 在服务端使用wget和curl测试下返回的是否正常 浏览器wget或者curl等软件访问不了Ngixn页面 1. 检查服务端 ...
- Spring Cloud实战
Spring Cloud实战(一)-Spring Cloud Config Server https://segmentfault.com/a/1190000006149891 https://seg ...
- Android真机调试——远程主机强迫关闭了一个现有的连接。
以前用真机调试程序的时候,Android Studio 出现如下的错误 [2016-11-12 10:37:36 - DeviceMonitor] Adb connection Error:远程主机强 ...
- 为cloudstack搭建ceph文件系统
1. 安装dell服务器, raid卡需要采用直通模式(non-raid); 各磁盘独立运行. 网络依赖硬件不同,使用万兆网卡或者两个千兆网卡做bonding6. 2. 配置host map(1 ...
- Educational Codeforces Round 42 (Rated for Div. 2)F - Simple Cycles Edges
http://codeforces.com/contest/962/problem/F 求没有被两个及以上的简单环包含的边 解法:双联通求割顶,在bcc中看这是不是一个简单环,是的话把整个bcc的环加 ...