参考:http://blog.163.com/lnwanggang@yeah/blog/static/16533216220110143151173/
1.使用静态类型
当使用JavaScript很重要的优化是使用静态类型替代动态类型。Unity使用一种技术叫做类型推理的技术来自动转换JavaScript为静态类型脚本。
var foo = 5;
上面例子中的foo将自动被推断为一个整数值。因此,Unity可能使用大量的编辑时间进行优化,而不使用耗时的动态名称变量查找等。这就是为什么Unity的JavaScript执行平均速度是其他JavaScript的20倍的原因之一。
唯一的问题是有时不是所有的东西都能做类型推断,Unity将会为这些变量重新使用动态类型。通过这样,编写JavaScript代码很简单,但也会使代码运行速度变慢。
看个例子:
function Start ()
{
var foo = GetComponent(MyScript);
foo.DoSomething();
}
这里foo将是动态类型,因此呼叫函数DoSomething必须要较长的时间,因为foo的类型未知,它必须弄明白是否支持DoSomething函数,如果支持,调用函数。
function Start ()
{
var foo : MyScript = GetComponent(MyScript);
foo.DoSomething();
}
这里我们强制foo为指定类型,你将获得更好的性能。
2.使用#pragma strict
现 在问题是,你通常不会意识到你在使用动态类型。#pragma strict可以解决这个问题!简单的添加#pragma strict在脚本顶部,之后Unity将禁用脚本的动态类型,强制你使用静态类型。如果有一个类型未知,Unity将报告编译错误。下面,foo将在编 译时报错:
#pragma strict
function Start ()
{
var foo = GetComponent(MyScript);
foo.DoSomething();
}
3.缓存组件查找
另一个优化是组件缓存。这种优化需要一些代码并且不是总有必要。但是如果你的代码真的很大,并且你需要尽可能的性能提升,它会是很好的优化。
当你通过GetComponent获取一个组件或一个变量时,Unity必须从游戏物体里找到正确的组件。这时你便能通过一个缓存组件引用到一个私有变量。
将:
function Update () {
transform.Translate(0, 0, 5);
}
转换为:
private var myTransform : Transform;
function Awake () {
myTransform = transform;
}
function Update () {
myTransform.Translate(0, 0, 5);
}
后面的代码运行较快,因为Unity不用在每一帧寻找变换组件。同样,支持脚本组件。你可以使用GetComponent获取组件或其他快捷属性。
4.使用内置数组
内 置数组是非常快的。ArrayList或Array类很容易使用,你能轻易添加元件。但是他们有完全不同的速度。 内置数组有固定长度,并且大多时候你会事先知道最大长度然后填充它。内置数组最好的一点是他们直接嵌入结构数据类型在一个紧密的缓存里,而不需要任何额外 类型信息或其他开销。因此,在缓存中遍历它是非常容易的,因为每个元素都是对齐的。
private var positions : Vector3[];
function Awake () {
positions = new Vector3[100];
for (var i=0;i<100;i++)
positions[i] = Vector3.zero;
}
5.如果没有必要不要调用函数
最简单,最好的优化是执行最少的工作。如,当一个敌人在远处时,让他处于睡眠状态,大多时候是可行的。直到玩家靠近,可以这样处理:
function Update ()
{
// Early out if the player is too far away.
if (Vector3.Distance(transform.position, target.position) > 100)
return;
perform real work work...
}
这 并不是很好的方法,虽然Unity不得不在每一帧访问update函数。更好的方法是禁用这个行为直到玩家靠近。有3中方法做这个:使用 OnBecameVisible和OnBecameInvisible。这些调用与渲染系统相联系。一旦摄像机看到物体,OnBecameVisible 将被调用,不看他时,OnBecameInvisible被调用。这有时很有用。但是对于AI来讲通常是没有用的,因为你背转敌人,敌人就变成不可用了。
function OnBecameVisible () {
enabled = true;
}
function OnBecameInvisible ()
{
enabled = false;
}
2.使用触发器。一个简单的球形触发器能引发惊人效果。你可以调用OnTriggerEnter/Exit,当进入你想要的作用范围。
function OnTriggerEnter (c : Collider)
{
if (c.CompareTag("Player"))
enabled = true;
}
function OnTriggerExit (c : Collider)
{
if (c.CompareTag("Player"))
enabled = false;
}
3.使用协同程序。Update的问题是他在每帧都发生。很可能只需要5秒钟检查一次玩家的距离。这可以节约大量的处理周期。
分享到:
相关推荐
unity3d 性能 脚本优化
Unity3D 日志优化 使用参考 Unity3D 日志优化 使用参考 Unity3D 日志优化 使用参考 https://blog.csdn.net/nicepainkiller/article/details/84958804 ...
Unity3d 性能优化 OnBecameVisible/OnBecameInvisible
《Unity3d碰撞器映射到2D碰撞器_物理引擎性能优化》,对应博文的测试工程。 《Unity3d碰撞器映射到2D碰撞器_物理引擎性能优化》,对应博文的测试工程。 《Unity3d碰撞器映射到2D碰撞器_物理引擎性能优化》,对应博文...
Unity3D教程:性能优化2
Unity3D - 图形性能优化:渲染统计窗口
unity性能优化(pdf).rar
draw call产生原因及优化方式,静态,动态批处理,Texture Atlasing-纹理合并,骨骼合并,减少实时光照和实时阴影,NGUI中UI元素的深度。 附带工程源码,在unity中打开直观体验
PoolManager manages instances more efficiently to increase performance, organize the scene hierachy and is simple to implement. When an instance is ...https://www.assetstore.unity3d.com/#/content/1010
unity3d T4M地形转换插件 游戏性能优化插件 最新版
对Unity项目进行性能优化的一些总结 流程: 1.(如果项目较大,资源文件较多)下载Unity官方AssetChecker进行检测 2.针对1的结果先对资源文件进行优化(音频、模型、贴图)
1.手动减少场景中物体的数量 2.Occlusion Culling(遮挡剔除) 3.摄像机Clipping Planes 1.Lightmap(光照贴图) 2
public class CameraSwap : MonoBehaviour{void Update (){//pressing 0, 1, 2, and 3
Unity3D资源 PoolManager 7.0.1 游戏对象池/缓存池性能优化插件 要求Unity2017.2.0或以上版本
Unity3D奥斯丁演示数万单位同屏实例工程,利用ECS框架进行开发,可以有效提高软件的性能Unity3D奥斯丁演示数万单位同屏实例工程,利用ECS框架进行开发,可以有效提高软件的性能
Unity3d 中文脚本使用手册 目录 一、 脚本概览............................................................................................................................ 1 概览:常用操作....................
这是非常强大的和高度优化的性能。 文件 Android演示应用程序 演示: - 聊天消息列表演示 - 水平画廊演示 - 垂直画廊演示 - GridView演示 - PageVew演示 - TreeVew演示 - 与稠粘头演示的TreeView - ...
一个关于profiler如何使用的教程文档,帮助开发者在开发过程中优化自己的软件一个关于profiler如何使用的教程文档,帮助开发者在开发过程中优化自己的软件一个关于profiler如何使用的教程文档,帮助开发者在开发过程...
Unity3D基础面试题,前端面试题,主要是一些Unity客户端基础知识点,可以巩固一下,还包括一些C#相关的知识点、Unity生命周期、Unity性能优化、Unity核心类和一些常用方法,都是开发过程中会用到的知识点。
前阵子刚刚集成xlua到项目,...因为与c#交互会少很多,而且一般都是耗性能的地方才放c#,即使网上有各种lua框架性能的评测,其实我感觉意义都不太大,如果真要频繁调用,那不管xlua还是tolua你都要考虑方案去优化的。