Unity3d_性能优化

Unity Spine动画如何选定数(时间)播放 引入Spine.Unity public SkeletonAnimation ani; 首先把timeScale设为0,相当于暂停动画ani.timeScale = 0; 如果需要循环从某一播放,可将loop设置为true; 从对应轨道获取动画var repeat=ani.AnimationState.GetCurrent(0); 设置目标开始时间repeat.AnimationStart = 3.5f; 设置目标结束时间repeat.AnimationEnd = 3.5f; 上方单位为秒。如果需要设置特 阅读详情

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教程:性能优化 1、使用静态类型化     在JavaScript中,使用静态类型化(Static Typing)来代替动态类型化(Dynamic Typing)对性能的优化非常重要。unity 使用一种叫做类型推导(Type  Inference)的技术,自动把JavaScript转化为静态类型代码(Statically Typed Code),而不需要你做其他任何工作。     var foo 阅读详情

相关推荐

Unity3D性能优化 - Update() 的使用

个人认为在脚本方面采用面向对象的调用开发,每次在Update里面写代码的时候,你要考虑,是否值得这么做,因为我们都知道update是每一侦都会执行的,那么如果有些代码并不是每次都需要调用的,你就不应该放到update里面检测某个条件成立,然后再执行,这样就类似C语言的过程式编程了。 不知道大家是否完全了解了官方这里http://docs.unity3d.com/Documentation/Scr

Chiuan的专栏 1万+

Unity 找到原因了,如果你在Update里Instantiate一个prefab,上面的脚本会在这个update后执行start,然后执行lateupdate,这的update会被跳过

找到原因了,如果你在Update里Instantiate一个prefab,上面的脚本会在这个update后执行start,然后执行lateupdate,这的update会被跳过

kuangben2000的博客 741

Klocwork安装

简单介绍一下Klocwork在windows下的安装,操作系统是win7,Klocwork的版本是10.0。 第一步:由于Klocwork的安装程序已十分成熟,所以在安装之前不需要什么准备共走。双击Klocwork的安装包,会出现下图的安装引导界面,点击Next按钮。 第二步:下图是协议界面,点击Next按钮。 第三步:选择Klocwork的安装目录,点击Next按钮 第四步:

旮旯 9880

Unity性能优化教程

https://makaka.org/unity-tutorials/optimization

DESIDERIO的博客 3059

想要Unity项目丝滑流畅,千万别这么做了

以下操作每秒发生 60-90 次!实际上,这取决于你设备的性能,所以范围可能会变化。Unity 生命周期Unity 生命周期图***Unity 生命周期***当我们谈论性能时,我们指的是这个过程以及完成这个过程需要多长时间。

2401_82584055的博客 4294

Unity - 2D游戏严重问题解决

目的:解决unity2D中游戏严重问题 这个问题的出现一开始我并不知道什么原因,于是在unity-profiler中寻找答案。 一开始我发现这个问题 然后我在网站上搜索”Animator.Update“现象 找到了:http://answers.unity3d.com/questions/689612/ 答案却不能解决我的问题。 后来开始自己建场景测试,经过多番

心之所至的博客 1万+

unity3d性能优化

要实现unity3d性能优化,方法很简单,这里为大家带来几点常见的优化方案。 1、角色优化 要做到对Unity角色的优化,我们在确定角色的时候就要为角色使用一个Skinned Mesh Renderer,这里大家需要注意的是必须是使用一个SkinnedMesh Renderer,因为Unity对角色采用优化的时候是对其使用可见的裁剪和更新的方法进行优化,而这种优化必须是在角色使用一个Sk

luyuncsd123的专栏 4191

Unity3D性能优化——工具篇

Quote from:https://zhuanlan.zhihu.com/p/39529241性能优化游戏项目开发中一个重要且必须的元素。用户和项目的需求在并且会持续增长。而即便在硬件设备高速发展的今天,游戏特效、画质、场景复杂度的需求也都向着榨干硬件性能的趋势提升,无论研发团队有多么丰富的经验积累,性能优化永远是一个非常棘手而又无法绕开的问题。实际上,通过百度、谷歌、知乎可以搜到大把关于Un...

Cool-浩 2万+

Unity3D性能优化

1. 程序方面   01、务必删除脚本中为空或不需要的默认方法;   02、只在一个脚本中使用OnGUI方法;   03、避免在OnGUI中对变量、方法进行更新、赋值,输出变量建议在Update内;   04、同一脚本中频繁使用的变量建议声明其为全局变量,脚本之间频繁调用的变量或方法建议声明...

chuifuhuo6864的博客 122

Unity3d性能优化

Unity3d性能优化 所有游戏性能优化,大体上分为三个部分:CPU优化、内存优化、GPU优化。u3d里面有现成的分析性能工具Profiler(Window->Profiler),不过它的内存分析功能较弱,可使用其他的内存分析工具(如MemoryProfiler)。 界面左侧显示我们游戏一个方面的信息,包含cpu使用情况,gpu使用情况,渲染,内存使用情况,声音,物理和网络等等,可通过A...

mymagic1990的博客 1000

Unity3D 性能优化

Unity3D 性能优化 一、程序方面 01、务必删除脚本中为空或不需要的默认方法; 02、只在一个脚本中使用OnGUI方法; 03、避免在OnGUI中对变量、方法进行更新、赋值,输出变量建议在Update内; 04、同一脚本中频繁使用的变量建议声明其为全局变量,脚本之间频繁调用的变量或方法建议声明为全局静态变量或方法; 05、不要去频繁获取组件,将其声明为全局变量; 06、数组

茶向 366

Unity3D性能优化总结

一、程序方面   01、务必删除脚本中为空或不需要的默认方法;   02、只在一个脚本中使用OnGUI方法;   03、避免在OnGUI中对变量、方法进行更新、赋值,输出变量建议在Update内;   04、同一脚本中频繁使用的变量建议声明其为全局变量,脚本之间频繁调用的变量或方法建议声明为全局静态变量或方法;   05、不要去频繁获取组件,将其声明为全局变量;   06、数组、集合类

Jingle的专栏 6855

Spine动画加载优化思路 之 Spine动画加载问题

优化Spine堆内存分配。

UWA—简单优化,优化简单! 2535

Laya 优化Spine渲染性能16倍

Spine Description Spine is more powerful than Dragonbones, with various output formats such as IK, FFD, mesh Meshes, Bounding Boxes Spine is smaller than frame animation, with relatively lower art cost and less work Spine Tool Class Copy it into your proj

曾用名:极客柒 2807

解决Unity发布到安卓平台率降低问题

1、首先在打开edit的project settings,Quality栏中VSync Count改为don't sync。完成前两步虽然改善了刚开始率问题,但是在手机端运行一段时间后率又降低了。完成以上三步,基本上率就会一直保持啦。3、最后关闭player栏的optimized frame pacing。2、由于安卓的默认率是三十,所以要在start函数里添加。将率设置为项目原率,我这里是280。

m0_63261863的博客 3735

Open3D (C++) KD tree的使用【2025最新版】

Open3D (C++) KD tree的使用,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 1534

Nexys4 DDR + OV7670 摄像头实时监控系统

简介:开发板Nexys4 DDR, 摄像头OV7670,是CMOS 图像传感器,最高分辨率640*480.将摄像头OV7670通过开发板的PMOD的IO接口相连,用VHDL/verilog进行编程,本实验用了两种语言分别编程通过,通过编程,摄像头采集的图像可以通过VGA传输实时的显示在显示屏上。代码适用于Xilinx系列开发板,altera系列需要修改部分代码。整体思路:首先图像传感器OV7670采集图像通过PMOD口输入到内存RAM中,然后从RAM中实时提取像素并通过VGA实时显示在显示屏上。开发板时钟100M,经过分频,给OV7670驱动和VGA的时钟分别为50M和25M,内存RAM是通过XIlinx开发软件的vivado中的开源IP核调用,设置存储位宽和深度,用来存储一的图像数据,最后提取RAM中的这一阵像素到VGA上并显示。

上一篇: BuildPipeline.BuildAssetBundle 编译资源包
下一篇: 控制输入系统 - Input 类实例讲解
性感花脸
博客等级 码龄20年 26粉丝 37原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值