`

Unity3d_性能优化

 
阅读更多

 

参考: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_V3.X.rar_unity_unity 教程_unity3d_unity入门教程

    10. **资源打包与优化**:学习Asset Bundle的概念,了解如何将资源打包并动态加载,以优化游戏性能和下载大小。 11. **发布与部署**:最后,了解如何将项目打包成适用于不同平台(如Windows、Android、iOS等)的...

    Unity圣典_unity圣典_unity_Unity圣典_

    这本书涵盖了从基础概念到高级技术的广泛内容,包括Unity引擎的安装与设置、场景构建、游戏对象、组件、脚本、物理系统、动画、图形渲染、光照、音频、UI系统、资源管理、性能优化以及多人在线游戏开发等多个方面。...

    C_Game_Examples.zip_unity3D 游戏_unity3D游戏 c#_unity3d_unity3d小游戏

    9. **资源管理**:Unity3D有完善的资源管理系统,可以对纹理、音频、模型等进行打包、加载和卸载,以优化内存使用和性能。 10. **网络同步**:对于多人在线游戏,Unity3D提供了网络API,支持客户端-服务器模式,...

    unity3D_5.0街机格斗源码

    6. **性能优化**:利用Unity3D提供的各种工具和技术手段进行性能调优,确保游戏运行流畅。 #### 五、学习资源推荐 1. **官方文档**:Unity3D官方网站提供了详细的文档和教程,是学习Unity3D的最佳资源。 2. **在线...

    unity3d_NGUI

    这通常意味着该资源可能已经过优化,以适应那个版本的Unity3D,并且可能包含针对该版本的一些特定功能或优化。 “常用的UNITY UI组件”意味着这个资源包含了NGUI的基本和常用组件,如按钮(Button)、文本(Text)、...

    优化基于Unity开发的3D移动游戏.rar_mighty3eo_unity_unity 3d骨骼_unity 优化_优化基于U

    综上所述,优化3D移动游戏的关键在于平衡视觉效果和性能,通过对纹理、物体、骨骼、代码以及资源等方面的精细调整,实现高效、流畅的游戏体验。这篇文档提供的正是这样一套实践策略,帮助开发者更好地理解和应用这些...

    Unity-and-Java-communication.rar_unity_unity socket_unity3d_unit

    Java的NIO(非阻塞I/O)库也可以用于优化Socket通信,提高性能。 在实际开发中,Unity3D与Java间的Socket通信可能会遇到网络延迟、数据包丢失等问题,因此需要实现心跳机制以检测连接状态,以及错误处理机制来确保...

    NinjiaTwins_DECOMPILE_twins_unity3d_

    通过反编译,我们可以看到资源是如何被组织和加载的,这对于理解游戏性能优化和资源管理策略至关重要。 其次,C#脚本是Unity3D的核心部分,负责游戏的逻辑控制。反编译这些脚本可以揭示游戏的AI行为、交互逻辑、...

    Unity3d_项目_足球Game

    为了保证游戏在各种设备上流畅运行,性能优化是必不可少的。这包括减少场景加载时间、优化渲染效果、降低CPU和GPU的负载等。 九、测试与发布 在项目完成后,需要进行多轮测试,确保游戏无bug且功能完整。最后,根据...

    MeshTest_del_unity3d_

    《Unity3D中的Mesh编辑与应用探析》 在Unity3D这个强大的游戏开发引擎中,模型的编辑和处理是一项核心任务,对于游戏场景的构建和角色设计至关重要。"MeshTest_del_unity3d_"这一项目,正是一个专注于研究和实践可...

    unity3d 性能 脚本优化

    ### Unity3D性能脚本优化 #### 核心概念与实践 **1. 避免不必要的组件获取** 在Unity3D中,频繁地调用`GetComponent`函数来获取组件实例会消耗额外的性能。为了提升效率,推荐在`Awake`或`Start`方法中缓存这些...

    kbengine_unity3d_tolua_demo-master.zip_DEMO_kbengine_tolua练习_uni

    通过kbengine、Unity3D和tolua的结合,开发者可以构建出具有高性能、易扩展性的游戏应用。kbengine提供稳定的服务器端支持,Unity3D负责丰富的视觉效果,tolua则作为两者间的粘合剂,实现了高效的数据交互。这个DEMO...

    Unity3D_34_高尔夫球推杆游戏DEMO

    10. **调试与优化**:开发过程中,开发者还需要掌握如何在Unity中进行调试和性能优化,例如使用Profiler工具分析性能瓶颈,调整物理参数以达到更佳的游戏体验。 通过《Unity3D_34_高尔夫球推杆游戏DEMO》,无论是...

    ontrigger-ItemStatsMod-1.4.0_mods_unity3d_risk_源码

    同时,由于是在游戏运行时进行物品统计,性能优化也是关键,避免因过多的计算和渲染导致游戏卡顿。 总结,"ontrigger-ItemStatsMod-1.4.0_mods_unity3d_risk_源码"展示了Unity3D在游戏开发中的强大功能和灵活性,...

    Barrel_Explosive_obj_unity3d_3dmax_blender_

    标题 "Barrel_Explosive_obj_unity3d_3dmax_blender_" 暗示这是一个关于爆炸桶(Barrel_Explosive)的3D模型资源,它支持多种格式,包括Unity3d的fbx格式以及3D建模软件3ds Max和Blender的obj格式。这个资源是为游戏...

    Polygon_unity3d_多边形shard_

    总结来说,“Polygon_unity3d_多边形shard_”这个主题涵盖了Unity3D中使用多边形进行3D图形创建、交互、编辑以及性能优化等多个方面,是一个综合性的游戏开发技术。理解和掌握这些知识点对于创建具有复杂几何形状和...

    Unity3D 日志优化 写入本地性能优化

    Unity3D 日志优化 使用参考 Unity3D 日志优化 使用参考 Unity3D 日志优化 使用参考 https://blog.csdn.net/nicepainkiller/article/details/84958804 ...

    HTFrameworkDemo-master_unity3d_

    3. **C#编程**: Unity3D主要使用C#编程语言,这是一种面向对象的语言,具有高效、简洁的语法,适合游戏开发的实时性能需求。 4. **Git仓库**: "HTFrameworkDemo-master"的结构表明这是从Git版本控制系统中导出的,...

    steamVR 插件 for Unity3d_V1.2.3.zip

    6. **Optimization**: 开发VR应用时,性能优化至关重要,因为低帧率会导致晕动症。利用Unity3D的性能分析工具和优化技巧,如LOD(级别细节)系统,可以确保内容在目标硬件上流畅运行。 7. **VRTK (Virtual Reality ...

    ConnTester-2.0.1f1_raknet_unity3d_ConnTester_connect_Tester_

    "ConnTester-2.0.1f1_raknet_unity3d_ConnTester_connect_Tester_"是一个专为Unity3D设计的源代码项目,它利用了RakNet库进行网络连接测试,帮助开发者验证和优化网络连接性能。接下来,我们将深入探讨这个项目的...

Global site tag (gtag.js) - Google Analytics