Unity3D项目脚本优化分析与研究
2017-03-08宋传磊刘俊婷张光亮侯世中
宋传磊+刘俊婷+张光亮+侯世中
【摘要】 本文就U3D项目中脚本优化进行分析研究。分别从常规优化、使用靜态类型、使用#pragma strict指令、缓存组件查询、使用内建数组和尽量减少函数调用等六个方面,通过实例提出了具体的优化方案,优化方案的使用在很大程度上提高了项目脚本性能。
【关键词】 U3D 优化 数组 函数调用
一个U3D项目能够很好的运行,较完美的展现项目细节内容,项目的性能优化将起到核心的作用。项目的性能优化涉及的范围很广,是一项纷繁复杂的过程。伴随着软硬件性能的提升,如何对项目进行优化进而展现更多细节,已经成为开发者急需思考的问题。本文将针对JavaScript和C#脚本文件,从常规优化、使用静态类型、使用#pragma strict、缓存组件查询、使用内建数组以及尽量少调用函数等6个方面进行阐述[1]。
一、常规优化
1、数组大小在循环结构中的应用。很多程序设计语言,包括JS脚本语言,对于数组的大小(长度)可以通过length属性获取。如果将数组的大小作为循环控制条件,应该提前将数组的大小取得并赋给一个中间变量,在循环控制条件中使用该中间变量。这种优化方式对数组的大小只进行一次求值,很大程度上减少了处理机重复计算数组大小的次数。2、Update和OnGUI优化。在JS和C#脚本中Update和OnGUI函数体每帧都要执行一次,针对不同的具体项目,如果连续几帧时间片代码的执行不会产生新的对象变化,可以估算帧时间片的大小,使用Time对象的frameCount属性来跳跃时间片执行循环体[2]。3、使用InvokeRepeating函数实现定时。在JS和C#脚本中虽然Start函数在程序的执行过程中只执行一次,但是可以使用InvokeRepeating函数实现定时调用用户自定函数。这样避免了使用Update函数重复执行。
二、深度优化
1、使用静态类型。在Unity中采用逻辑推理技术自动完成JavaScript动态脚本到静态脚本的转换,无需程序员做任何设置。因此,在编写JavaScript时,使用静态类型代替动态类型是既方便又有效的优化措施。
例如: var a=1;在定义变量a的同时用数值1完成了初始化。在编译时,Unity会自动把变量a分析为整形,无需使用动态名称查找,这样就节省了处理机的时间。
2、使用#pragma strict指令。在Unity脚本文件的开始处经常可以看到 #pragma strict指令。此指令使编译器处于“严谨编译模式”,强制使用静态类型,要求在声明变量时,需要明确待声明的变量是属于什么类型,不允许让编译器自己来分析变量的类型,因此不能随便的使用一个标识符让编译器来为其实例化。如在使用此指令后,在脚本中有如下语句 。var a; 此语句在编译时会提示错误。因为强制使用静态类型,变量“a”的类型未知,Unity将报告编译错误。可以将语句做如下修改。 var a: int; 通过使用#pragma strict,可以强制程序员养成良好的编程习惯。
3、缓存组件查询。如果编写的代码体积很大,需要尽可能的做到性能优化,可以采用缓存组件查询的优化方式。当通过GetComponent()方法获取一个组件时,Unity必须从“Hierarchy或Project”视图中找到相应的组件。此时可以通过定义一个缓存组件来引用到一个变量,使得Unity不会再每一帧都去寻找组件,此方法能够提高代码运行速度。
4、使用内建数组。虽然ArrayList或Array类很方便使用,能轻易添加元件。但是相比内建数组,速度有很大的差异,内建数组速度非常快。内建数组有固定长度,通常情况下能够预估其长度然后填充它。内建数组直接嵌入struct数据类型在第一个缓存里,不需要任何额外类型信息或其他资源。因此,能够非常方便的在缓存中实现遍历[3]。
5、尽量减少函数调用。最简单最有效的优化就是执行最少的动作。Unity中Update()方法每一帧都会执行,所以减少Update()方法里面的工作量,可以实现性能优化。例如,当一个敌人在远处时100米外,让他处于睡眠状态,直到玩家靠近,再唤醒。当然这并不是很好的方法,更好更有效的方法是禁用该行为直到玩家靠近。使用 OnBecameVisible和OnBecameInvisible方法可以实现。当物体在摄像机视野内,OnBecameVisible 将被调用,在视野范围外时,OnBecameInvisible被调用。
function OnBecameVisible () {
enabled = true;}
三、结束语
一般意义上,对于U3D项目可以通过修改模型、减少纹理尺寸、优化粒子、优化渲染、优化资源并结合Unity 3D的相关特性来提高性能。但作为编码人员,本文分析的优化方案,可以从代码优化的角度实现项目性能的高效优化。
参 考 文 献
[1]宣雨松.Unity 3D游戏开发.北京:人民邮电出版社2013:115-124
[2]吴亚峰等. Unity 3D游戏开发技术详解与典型案例. 北京:人民邮电出版社2014:83-92
[3]U3D性能优化总结.[2016-10-6]. http://www.cnblogs.com/yangyisen/p/5108322.html