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的内存优化是性能优化中很重要 ...
随机推荐
- 20145312 《Java程序设计》第十周学习总结
20145312 <Java程序设计>第十周学习总结 学习笔记 Chapter 17反射与类加载器 17.1 运用反射 .class文档反应了类基本信息,因而从Class等API取得类信息 ...
- P(Y|X) 和 P(X,Y)
P ( x | y ):在Y发生的条件下,X发生的概率.P ( x , y )P(x,y)说明该事件与两个因素有关,比如设是因素A,B.P(x,y)=P{因素A处于x状态,因素B处于y状态}确切地说P ...
- 输入n,求1~n累加
最开始可能会使用for循环来计算,现在直接使用等差数据计算和公式:s=(a0+n)*n/2 long sum(int n) { long ret=0: ret = (1+n)* n /2: retur ...
- creator cocos2d-js-min.js 文件廋身 变小 太大解决方法
使用的 cocos creator 1.2 版本, 菜单栏 项目 -- 项目设置 -- 模块设置 里面 把不要的模块去掉
- bat(续五)-获取批处理文件所在路径
获取批处理文件所在路径 在开发时,经常需要使用批处理运行一些程序,java程序 犹其是这样,往往需要运行时根路径.Hardcode一个路径总是令自己觉得不自在,例如一个java程序从一台 ...
- tornado异步(1)
1. 同步 我们用两个函数来模拟两个客户端请求,并依次进行处理: # coding:utf-8 def req_a(): """模拟请求a""&quo ...
- [小问题笔记(六)] 解决JS已执行,输出内容乱码问题. 顺带总结编码相关知识
问题: JS输出的内容出现了乱码.如图: 分析:既然年和月的数字可以正常显示,证明js加载和执行都没有问题 解决:把js引用处的编码方式改成当前页面编码一致.charset="gb2312& ...
- java高级特性(2)--循序渐进地培养面向对象的思维方式
在我踏入软件行业后,一直苦于没有前辈指点.我常年困惑于两个问题:一是怎样培养面向对象设计的思维能力?二是怎样进行架构设计,有无方法? 因为我做了那么多年项目,却很少看到有漂亮的面向对象思维写出来的代码 ...
- Enter键禁止表单提交
Enter键禁止表单提交js代码: //禁用Enter键表单自动提交 document.onkeydown = function (event) { var target, code, tag; if ...
- 定时模块app_timer用法及常见问题—nRF5 SDK模块系列二
app_timer是大家经常用到的一个库,app_timer的功能就是定时,也就是说,你在某一时刻启动一个app timer并设定超时时间,超时时间一到,app_timer就会回调timeout ha ...