总结使用Unity3D优化游戏运行性能的经验
unity 问题及解决方案

unity 问题及解决方案
《Unity问题及解决方案》
Unity是一款广泛使用的跨平台游戏开发引擎,但在使用过程中,有时会遇到一些问题。
以下是一些常见的Unity问题及其解决方案。
问题1:Unity运行速度缓慢
解决方案:将Unity版本更新到最新版本,通过使用性能优化技术来提高游戏的运行速度,比如合并小的网格和使用低多边形网格。
尽量减少屏幕上的物体数量,优化脚本代码等等。
问题2:游戏在特定设备上无法运行
解决方案:检查游戏的最低系统要求,并确保目标设备满足这些要求。
对游戏进行适配,使用跨平台插件能够使游戏在不同平台上运行。
问题3:Unity编辑器闪退或崩溃
解决方案:检查电脑硬件和系统的兼容性,可能需要升级显卡驱动程序或操作系统版本。
同时注意Unity编辑器所需的系统资源,确保电脑足够内存和存储空间,或考虑关闭其他消耗系统资源的程序。
问题4:UI界面不兼容不同设备
解决方案:根据目标设备的分辨率和屏幕尺寸制作不同版本的UI素材,或者使用自适应UI系统来适配不同尺寸的屏幕。
问题5:游戏在特定场景中出现闪烁或卡顿
解决方案:检查场景中的资源是否过多,尝试减少或优化资源。
可能需要使用异步加载技术来加载资源,也可以对游戏进行更细致的性能优化。
总之,Unity作为一款优秀的游戏引擎,为开发者提供了丰富
的工具和技术,但在使用过程中难免会遇到一些问题。
关键在于仔细分析问题的原因,灵活运用解决方案,才能够更好地解决Unity的问题并提高游戏开发效率。
Unity3D游戏GC优化总结---protobuf-net无GC版本优化实践

Unity3D游戏GC优化总结---protobuf-net⽆GC版本优化实践⼀ protobuf-net优化效果图 protobuf-net是Unity3D游戏开发中被⼴泛使⽤的Google Protocol Buffer库的c#版本,之所以c#版本被⼴泛使⽤,是因为c++版本的源代码不⽀持Unity3D游戏在各个平台上的动态库构建。
它是⼀个⽹络传输层协议,对应的lua版本有两个可⽤的库:⼀个是proto-gen-lua,由tolua作者开发,另外⼀个是protoc,由云风开发。
protobuf-net在GC上有很⼤的问题,在⼀个⾼频率⽹络通讯的状态同步游戏中使⽤发现GC过⾼,所以对它进⾏了⼀次⽐较彻底的GC优化。
下⾯是优化前后的对⽐图:protobuf-net优化前GC和性能效果图protobuf-net优化后GC和性能效果图⼆ Unity3D游戏GC优化概述 有关Unity3D垃圾回收的基本概念和优化策略Unity官⽹有发布过⽂章:。
这篇⽂章讲述了Unity3D垃圾回收机制,和⼀些简单的优化策略,讨论的不是特别深⼊,但是⼴度基本上算是够了。
我罗列⼀下这篇⽂章的⼀些要点,如果你对其中的⼀些点不太熟悉,建议仔细阅读下这篇⽂章: 1、C#变量分为两种类型:值类型和引⽤类型,值类型分配在栈区,引⽤类型分配在堆区,GC关注引⽤类型 2、GC卡顿原因:堆内存垃圾回收,向系统申请新的堆内存 3、GC触发条件:堆内存分配⽽当内存不⾜时、按频率⾃动触发、⼿动强⾏触发(⼀般⽤在场景切换) 4、GC负⾯效果:内存碎⽚(导致内存变⼤,GC触发更加频繁)、游戏顿卡 5、GC优化⽅向:减少GC次数、降低单次GC运⾏时间、场景切换时主动GC 6、GC优化策略:减少对内存分配次数和引⽤次数、降低堆内存分配和回收频率 7、善⽤缓存:对有堆内存分配的函数,缓存其调⽤结果,不要反复去调⽤ 8、清除列表:⽽不要每次都去new⼀个新的列表 9、⽤对象池:必⽤ 10、慎⽤串拼接:缓存、Text组件拆分、使⽤StringBuild、Debug.Log接⼝封装(打Conditional标签) 11、警惕Unity函数调⽤:、GameObject.tag、FindObjectsOfType<T>()等众多函数都有堆内存分配,实测为准 12、避免装箱:慎⽤object形参、多⽤泛型版本(如List<T>)等,这⾥的细节问题很多,实测为准 13、警惕协程:StartCoroutine有GC、yield return带返回值有GC、yield return new xxx有GC(最好⾃⼰做⼀套协程管理) 14、foreach:unity5.5之前版本有GC,使⽤for循环或者获取迭代器 15、减少引⽤:建⽴管理类统⼀管理,使⽤ID作为访问token 16、慎⽤LINQ:这东西最好不⽤,GC很⾼ 17、结构体数组:如果结构体中含有引⽤类型变量,对结构体数组进⾏拆分,避免GC时遍历所有结构体成员 18、在游戏空闲(如场景切换时)强制执⾏GC三 protobuf-net GC分析3.1 protobuf-net序列化 先分析下序列化GC,deep profile如下: 打开PropertyDecorator.cs脚本,找到Write函数如下:1public override void Write(object value, ProtoWriter dest)2 {3 Helpers.DebugAssert(value != null);4 value = property.GetValue(value, null);5if(value != null) Tail.Write(value, dest);6 }View Code 可以看到这⾥MonoProperty.GetValue产⽣GC的原因是因为反射的使⽤;⽽ListDecorator.Write对应于代码Tail.Write,继续往下看: 找到对应源代码:1public override void Write(object value, ProtoWriter dest)2 {3 SubItemToken token;4bool writePacked = WritePacked;5if (writePacked)6 {7 ProtoWriter.WriteFieldHeader(fieldNumber, WireType.String, dest);8 token = ProtoWriter.StartSubItem(value, dest);9 ProtoWriter.SetPackedField(fieldNumber, dest);10 }11else12 {13 token = new SubItemToken(); // default14 }15bool checkForNull = !SupportNull;16foreach (object subItem in (IEnumerable)value)17 {18if (checkForNull && subItem == null) { throw new NullReferenceException(); }19 Tail.Write(subItem, dest);20 }21if (writePacked)22 {23 ProtoWriter.EndSubItem(token, dest);24 }25 }View Code 可以看到这⾥的GC是由list遍历的foreach引起的。
Unity游戏优化与性能测试

Unity游戏优化与性能测试在游戏开发过程中,优化和性能测试是非常重要的环节,它们可以极大地提升游戏的质量和用户体验。
Unity作为一款流行的游戏引擎,也提供了一系列的优化工具和性能测试功能,帮助开发者优化游戏性能。
本文将介绍Unity游戏优化的基本概念、常见的优化技术和Unity的性能测试工具。
第一章:游戏优化的基本概念游戏优化是指在游戏开发过程中,通过改进代码、资源的加载和使用等方法,提升游戏的性能,使其更加流畅、稳定。
在进行游戏优化之前,我们首先需要了解一些基本概念。
1.1 帧率和性能帧率是指每秒钟显示的画面数量,通常以“fps”(帧每秒)为单位表示。
高帧率可以使游戏画面更加流畅,但也需要更高的性能支持。
游戏性能则是指游戏在某个特定设备上的表现,包括帧率、内存占用、CPU占用等指标。
1.2 瓶颈和优化目标在游戏优化过程中,我们往往会遇到一些瓶颈,即限制游戏性能提升的因素。
常见的瓶颈包括CPU、GPU、内存、网络等。
优化目标则是通过针对不同瓶颈采取相应的优化策略,提升游戏性能。
第二章:常见的游戏优化技术2.1 资源的压缩与合并资源的压缩可以减小游戏安装包的体积,加快加载速度。
Unity 提供了多种资源压缩格式,可以根据不同平台和设备选择合适的格式。
资源的合并可以减少批次绘制的次数,优化GPU性能。
2.2 代码的优化代码优化是游戏优化的重要一环,它包括但不限于以下几个方面:避免使用过多的循环和条件判断、合理使用对象池、避免频繁的内存分配和释放等。
此外,Unity还提供了Profiler工具,可以帮助开发者找到代码中的性能瓶颈,进行有针对性的优化。
2.3 光照和阴影的优化光照和阴影是游戏画面中常见的效果,但也是消耗性能的主要因素。
在使用光照和阴影时,可以考虑使用动态光照和实时阴影,避免使用过多的静态光照和预计算阴影。
此外,可以合理设置光照的分辨率和影子的精度,以平衡画面效果和性能。
第三章:Unity的性能测试工具3.1 ProfilerProfiler是Unity内置的性能测试工具,可以帮助开发者分析整个游戏的性能情况。
unity优化 场景绘制cpu占用过高原因分析

unity优化场景绘制cpu占用过高原因分析
unity游戏开发者们在提高游戏的流畅度过程中,经常会遇到因CPU占用过高而导致游戏帧率降低的情况,因此优化CPU占有率是unity游戏开发者们所亟待解决的问题之一。
想要对unity游戏中cpu占用率进行优化,首先需要对CPU占用率过高的原因进行分析。
经常有层次较高的游戏开发者会遗漏一些CPU优化的技巧,使游戏看上去流畅,但是在某些情况下可能会出现帧数明显降低的情况,这通常是由代码不良的设计所致,代码不良的设计会导致性能的大幅降低和cpu的大量占用。
虽然大多数情况下,GameObjects上面的更新函数都只会执行一次,如果某个GameObjects 拥有大量的Update函数,就可能导致CPU占用过高。
另外,生成额外的GameObjects也有可能导致CPU占用过高,一般情况下游戏中应该只会存在必要的GameObjects,无用的GameObjects要求及时删除,以免对游戏的性能产生不利影响以及大量的cpu占用。
此外,像动画,轮子等部件的运算也可能导致CPU占用率过高,如果简单地加载该部件的数据,不实时去检查部件的变化和位置的变化,也会导致大量的cpu占用。
一般而言,要想解决unity中因CPU占用率过高而降低游戏帧率的问题,首先对高占用率的原因进行分析,由此可以指出需要优化的技术点,然后精细地分析解决问题。
有效地优化CPU占用率,可以大大提高游戏的性能,使游戏玩家拥有更加流畅的体验。
unity期末总结

unity期末总结前言Unity是一款功能强大的游戏开发引擎,它被广泛应用于游戏开发中。
在本学期的Unity学习中,我学习到了Unity引擎的基础知识以及其在游戏开发中的应用。
通过实践和项目的完成,我对Unity的使用和原理有了更深入的理解。
下面将对我在这个学期中的学习和成长进行总结。
一、知识学习1.1 Unity引擎基础知识在课程开始的阶段,我首先学习了Unity引擎的基础知识,包括Unity的界面和操作、场景的编辑和管理、物体的创建和编辑等等。
这些基础知识为我后续的学习奠定了坚实的基础。
1.2 脚本编程在Unity中,脚本编程是非常重要的一环。
通过学习C#语言和Unity脚本的编写,我可以实现游戏的逻辑控制和各种功能的实现。
通过掌握脚本编程,我可以更好地控制Unity引擎,使游戏更具交互和玩味性。
1.3 游戏物理引擎Unity中集成了一个强大的游戏物理引擎,通过学习物理引擎的使用,我可以实现游戏中的物体运动、碰撞检测等。
物理引擎的使用不仅使游戏更加真实,也增加了游戏的趣味性。
1.4 游戏UI设计在Unity中,对游戏界面的设计和美化也是非常重要的。
通过学习Unity的UI设计和调用,我可以实现游戏中的各种按钮、面板和文本的显示和交互。
以上是我在这个学期中学习到的Unity的基础知识。
通过这些知识的学习,我可以更好地了解Unity的工作原理,也能够实现自己的游戏创意和想法。
二、项目实践在学习的过程中,我还通过完成一些小项目来实践所学到的知识,锻炼自己的动手能力和解决问题的能力。
以下是我完成的几个项目的简要介绍:2.1 打砖块游戏这是我在学习Unity的早期阶段完成的一个小项目。
通过学习脚本编程和游戏物理引擎的使用,我成功地实现了一个简单的打砖块游戏。
在这个项目中,我学会了如何控制物体的运动、如何检测碰撞并作出反应等。
2.2 模拟火箭发射这是一个较为复杂的项目,通过学习脚本编程和物理引擎的使用,我实现了一个火箭发射的模拟。
Unity3D游戏开发实践心得体会

Unity3D游戏开发实践心得体会一、Unity3D介绍Unity3D是一款跨平台游戏引擎,拥有众多游戏开发功能和工具,比如能够提供渲染、物理、动画、音频等功能,并且它的可视化编辑工具也是其特色所在。
一些免费资源能够积极支持开发者,使其游戏研发质量和效率得到提升。
二、Unity3D的应用Unity3D支持的平台种类丰富,包括但不限于如下平台:WindowsMacAndroidiOSWebPlayStationXbox由于其可视化编辑工具的支持,受到了众多游戏开发者的欢迎,包括独立游戏开发者、工作室和大型企业。
三、Unity3D游戏开发中的实践心得1.理解好架构的重要性在进行Unity3D游戏开发时,最好仔细地设计游戏的架构,使用MVC架构,将Model、View和Controller进行分离,可以有效的提高代码的重用性和可维护性。
此外,如果需要大量的UI控制,可以考虑使用uGUI组件和Unity自带的Mechanim工具。
这样做可以避免大量的手工编写代码,提高开发效率。
2.注意资源管理资源管理是程序员必须熟练掌握的技能之一。
Unity3D引擎提供了内置的资源管理系统,可以帮助我们管理各种类型的资源文件,而且可以使用插件进行资源的处理和导出。
在使用它时需要注意掌握好“引用计数法”。
同样,对于依赖的资源需要做好失效判断,同时对资源文件也需要仔细分析,使用不同的文件格式可以达到不同的效果,比如纹理可以选择JPEG(低保真率)以及PNG(高保真率)等。
3.学习多线程编程学习多线程编程可以提高开发者的游戏开发水平和效率。
在使用多线程时需要注意线程的协调和同步,避免出现线程混乱和竞争问题。
为了解决这种情况,可以使用锁和互斥信号等技术手段,合理地安排线程的执行顺序和任务。
4.测试和调试在进行Unity3D游戏开发时,必须进行相关的测试和调试,以确保游戏的质量。
可以通过通过引入各种特定的测试用例,检查游戏的各种功能,包括图像,声音,控制等;当然也可以通过引入各种调试工具,包括xCode等,进行脚本的调试,使用日志文件来记录游戏运行中的各种问题。
基于Unity3D的虚拟现实仿真系统构建与优化
基于Unity3D的虚拟现实仿真系统构建与优化虚拟现实(Virtual Reality,简称VR)技术是一种通过计算机技术模拟出的三维虚拟环境,使用户可以沉浸在其中并与之进行交互。
随着科技的不断发展,VR技术在各个领域得到了广泛的应用,如教育、医疗、娱乐等。
而Unity3D作为一款跨平台的游戏开发引擎,也被广泛应用于虚拟现实仿真系统的构建与优化中。
1. 虚拟现实仿真系统概述虚拟现实仿真系统是利用虚拟现实技术对真实世界进行模拟和再现,使用户可以在虚拟环境中进行体验和互动。
这种系统通常包括硬件设备(如头戴式显示器、手柄等)和软件平台(如Unity3D引擎),通过二者的结合实现对虚拟环境的构建和控制。
2. Unity3D在虚拟现实仿真系统中的应用Unity3D作为一款强大的跨平台游戏引擎,具有良好的图形渲染能力和物理引擎支持,非常适合用于构建虚拟现实仿真系统。
在Unity3D中,开发者可以通过编写脚本、导入模型和材质等方式,快速构建出逼真的虚拟环境,并实现用户与环境的交互。
3. 虚拟现实仿真系统构建流程3.1 确定需求在构建虚拟现实仿真系统之前,首先需要明确系统的需求和目标。
这包括确定要模拟的场景、用户的交互方式、系统的性能要求等。
3.2 环境建模利用Unity3D中的建模工具和资源库,开发者可以快速构建出虚拟环境所需的场景、物体和角色模型。
在建模过程中,需要注意保持模型的逼真度和性能优化。
3.3 添加交互功能通过编写脚本,在Unity3D中添加用户交互功能,如手柄控制、碰撞检测、物体抓取等。
这些功能可以增强用户在虚拟环境中的沉浸感和参与度。
3.4 调试与优化在构建完成后,需要对虚拟现实仿真系统进行调试和优化。
这包括检查场景是否流畅、性能是否稳定、用户体验是否良好等方面。
4. Unity3D在虚拟现实仿真系统中的优化策略4.1 图形优化通过减少多边形数量、合并网格、使用LOD(Level of Detail)技术等方式,优化场景中的模型和纹理,提高图形渲染效率。
unity3d实例教程
unity3d实例教程Unity3D是一款非常强大的游戏开发引擎,它允许开发者创建各种类型的游戏和应用程序。
本篇文章将介绍一些常见的Unity3D实例教程,帮助读者快速上手并了解Unity3D的基本功能和特性。
1.创建第一个游戏场景在Unity3D中,第一步是创建一个游戏场景。
为了创建一个简单的游戏场景,我们可以添加一个地形,一些角色模型和一些物体。
在Unity3D 中,我们可以使用场景视图来进行场景的组织和操作。
在本教程中,我们将学习如何创建一个游戏场景,并为场景添加一些基本的元素。
2.角色控制器和动画在游戏中,角色控制器和动画是非常重要的组成部分。
在Unity3D中,可以使用Animator组件来实现角色动画。
在本教程中,我们将学习如何创建一个简单的角色控制器,并为其添加一些基本的动画。
3.物理模拟和碰撞检测物理模拟和碰撞检测是游戏中常见的功能。
在Unity3D中,可以使用Rigidbody组件和Collider组件来实现物理模拟和碰撞检测。
在本教程中,我们将学习如何给物体添加Rigidbody组件,并设置一些基本的物理属性。
我们还将学习如何给物体添加Collider组件,并处理碰撞事件。
4.UI设计和用户交互UI设计和用户交互对于游戏的用户体验非常重要。
在Unity3D中,可以使用Canvas组件和EventSystem组件来实现UI设计和用户交互。
在本教程中,我们将学习如何创建一个简单的UI界面,并处理用户的点击事件。
5.渲染和光照渲染和光照是游戏视觉效果的关键部分。
在Unity3D中,可以使用Shader和光照设置来实现渲染和光照效果。
在本教程中,我们将学习如何创建自定义的Shader,并为场景设置一些基本的光照。
6.游戏优化和性能调优游戏优化和性能调优对于提高游戏性能和用户体验非常重要。
在Unity3D中,可以使用Profiler工具和一些优化技巧来进行游戏优化和性能调优。
在本教程中,我们将学习如何使用Profiler工具来分析游戏的性能,并实施一些常用的优化技巧。
Unity日常记录-QualitySettings性能设置
Unity⽇常记录-QualitySettings性能设置unity打包时,可通过QualitySettings优化图像性能,这是最常设置也是最明显的图像性能体现设置图形质量的⽔平,⼀般来说,质量是以牺牲性能为代价的,所以最好不要追求移动设备或旧硬件的最⾼质量,因为它会对游戏产⽣有害的影响。
在Edit->Project Settings->Quality设置默认6个等级,也可⾃⾏配置。
根据项⽬的需求,在低端或者⾼端机,选择等级RenderingPixel Light Count 表⽰渲染使⽤的像素灯最⼤数量,如果有更多的光照亮⼀个物体,最暗的⼀个将作为顶点光源被渲染。
设置1即可⾼端机可设置1以上。
Texture Quality 纹理质量有四个选项,分别为FullRes完整分辨率、HalfRes⼆分之⼀分辨率、QuarterRes四分之⼀分辨率、EighthRes⼋分之⼀分辨率,低分辨率纹理的处理开销低,低端机推荐使⽤HalfRes,⾼端机可以选择完整分辨率FullRes。
Anisotropic Textures 各向异性贴图,如果使⽤各向异性贴图这将选项将激活.此选项包括:禁⽤,每张贴图和总是激活。
AntiAliasing 反锯齿,这设置反锯齿的级别,包括:2倍,4倍和8倍多重采样. 级别越⾼锯齿越⼩,吃显存⽽不吃CPUSoft Particles 软粒⼦,粒⼦是否使⽤软融合? 作⽤于粒⼦系统Realtime Reflection Probes 实时反射探头,在游戏期间是否更新反射探头? 作⽤于反射探针ShadowsShadows 阴影类型,禁⽤、硬阴影、硬和软阴影Shadow resolution 阴影分辨率,阴影可被渲染为⼏个不同分辨率:低,中,⾼和⾮常⾼.更⾼分辨率更⾼处理开销(即:会较卡)Shadow Projection 阴影投射这⾥有两种不同的⽅法⽤于投射来⾃⼀个平⾏光的阴影. Close Fit 紧密配合:渲染⾼分辨率阴影但当摄像机移动时它们有时会有轻微的晃动. Stable Fit 稳定配合:渲染低分辨率阴影但它们不会随着摄像机移动⽽出现晃动.Shadow Distance 阴影距离,离摄像机多远内的阴影为可见的.超过此距离的阴影将不会被渲染.Shadow Near Plane Offset 在平⾯附近偏移阴影量默认就⾏Shadow Cascades 阴影串连,影⼦级联的数⽬可以设置为零,⼆或四。
Unity3d 性能指标分析
Unity3d引擎性能指标分析大量青睐,被大量用于虚拟仿真,增强现实,场景漫游等领域。
尤其是随着iPad代表的平板电脑和新的用户体验的出现,对iOS、Android平台有良好三维支持的Unity3D引擎更是获得了更多的应用空间。
3.2 成功案例产品名称发行商平台简介老虎伍兹Online EA Web 《老虎伍兹Online》由EATiburon 研发,利用Unity3D在Web上的优异表现从测试期起就吸引了大量玩家的加入。
太空堡垒卡拉狄加OL Bigpoint Web 《太空堡垒卡拉狄加OL》是一款大型多人在线策略类太空战斗游戏,拥有庞大的太空场景和华丽的次时代画面。
在游戏公测的5个月内,游戏已经拥有300多万注册用户。
武士II 复仇MADFINGER Games iOSAndroidPC 在中国、日本、美国的AppStore 下载排行榜都进入前10名。
游戏画面拥有浓郁的漫画风格,深受各国玩家喜爱。
SHADOWGUN MADFINGER Games iOS 游戏拥有可以媲美Unreal的精致游戏画面和光影效果,紧张的战斗节奏和颇具挑战性的BOSS战。
拥有iOS平台最佳画质的次时代游戏之一。
四二次开发的内容及方案4.1 需求Unity3D引擎只提供程序的整合功能,所有项目用到的素材和程序逻辑实现都需要使用者提供和编写。
在开始制作原型程序时可以先利用官方提供的资源包和其他第三方素材来搭建。
基于Uinty3D引擎良好的面向对象开发模式,这些素质可以分别更改和补充而且完全不会影响到项目的其他部分。
根据项目的具体需求,可以选择用Unity3D基本功能模块,对其进行扩展或提出新的解决方案。
4.2 场景4.2.1 场景加载除了直接切换场景,Unity3D引擎还可以提供场景的实时加载和预加载来展现巨大的虚拟场景。
针对读取较慢的情况还可以实现异步加载。
4.2.2 地形默认地形最大支持4086x4086x32的高度图分辨率以及树木和草的自动优化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
总结使用Unity3D优化游戏运行性能的经验
流畅的游戏玩法来自流畅的帧率,而我们即将推出的动作平台游戏《Shadow Blade》已经将在标准iPhone和iPad设备上实现每秒60帧视为一个重要目标。
以下是我们在紧凑的优化过程中提升游戏运行性能,并实现目标帧率时需要考虑的事项。
当基本游戏功能到位时,就要确保游戏运行表现能够达标。
我们衡量游戏运行表现的一个基本工具是Unity内置分析器以及Xcode分析工具。
使用Unity分析器来分析设备上的运行代码真是一项宝贵的功能。
我们总结了这种为将目标设备的帧率控制在60fps而进行衡量、调整、再衡量过程的中相关经验。
一、遇到麻烦时要调用“垃圾回收器”(Garbage Collector,无用单元收集程序,以下简称GC)
由于具有C/C++游戏编程背景,我们并不习惯无用单元收集程序的特定行为。
确保自动清理你不用的内存,这种做法在刚开始时很好,但很快你就公发现自己的分析器经常显示CPU负荷过大,原因是垃圾回收器正在收集垃圾内存。
这对移动设备来说尤其是个大问题。
要跟进内存分配,并尽量避免它们成为优先数,以下是我们应该采取的主要操作:
1.移除代码中的任何字符串连接,因为这会给GC留下大量垃圾。
2.用简单的“for”循环代替“foreach”循环。
由于某些原因,每个“foreach”循环的每次迭代会生成24字节的垃圾内存。
一个简单的循环迭代10次就可以留下240字节的垃圾内存。
3.更改我们检查游戏对象标签的方法。
用“if (pareTag (“Enemy”)”来代替“if (go.tag == “Enemy”)” 。
在一个内部循环调用对象分配的标签属性以及拷贝额外内存,这是一个非常糟糕的做法。
4.对象库很棒,我们为所有动态游戏对象制作和使用库,这样在游戏运行时间内不会动态分配任何东西,不需要的时候所有东西反向循环到库中。
5.不使用LINQ命令,因为它们一般会分配中间缓器,而这很容易生成垃圾内存。
二、谨慎处理高级脚本和本地引擎C++代码之间的通信开销。
所有使用Unity3D编写的游戏玩法代码都是脚本代码,在我们的项目中是使用Mono执行时间处理的C#代码。
任何与引擎数据的通信需求都要有一个进入高级脚本语言的本地引擎代码的调用。
这当然会产生它自己的开销,而尽量减少游戏代码中的这些调用则要排在第二位。
1.在这一情景中四处移动对象要求来自脚本代码的调用进入引擎代码,这样我们就会在游戏玩法代码的一个帧中缓存某一对象的转换需求,并一次仅向引擎发送一个请求,以便减少调用开销。
这种模式也适用于其他相似的地方,而不仅局限于移动和旋转对象。
2.将引用本地缓存到元件中会减少每次在一个游戏对象中使用“GetComponent” 获取一个元件引用的需求,这是调用本地引擎代码的另一个例子。
三、物理效果
1.将物理模拟时间步设置到最小化状态。
在我们的项目中就不可以将让它低于16毫秒。
2.减少角色控制器移动命令的调用。
移动角色控制器会同步发生,每次调用都会耗损极大的性能。
我们的做法是缓存每帧的移动请求,并且仅运用一次。
3.修改代码以免依赖“ControllerColliderHit” 回调函数。
这证明这些回调函数处理得并不十分迅速。
4.面对性能更弱的设备,要用skinned mesh代替physics cloth。
cloth参数在运行表现中发挥重要作用,如果你肯花些时间找到美学与运行表现之间的平衡点,就可以获得理想的结果。
5.在物理模拟过程中不要使用ragdolls,只有在必要时才让它生效。
6.要谨慎评估触发器的“onInside”回调函数,在我们的项目中,我们尽量在不依赖它们的情况下模拟逻辑。
7.使用层次而不是标签。
我们可以轻松为对象分配层次和标签,并查询特定对象,但是涉及碰撞逻辑时,层次至少在运行表现上会更有明显优势。
更快的物理计算和更少的无用分配内存是使用层次的基本原因。
8.千万不要使用Mesh对撞机。
9.最小化碰撞检测请求(例如ray casts和sphere checks),尽量从每次检查中获得更多信息。
四、让AI代码更迅速
我们使用AI敌人来阻拦忍者英雄,并同其过招。
以下是与AI性能问题有关的一些建议:
1.AI逻辑(例如能见度检查等)会生成大量物理查询。
可以让AI更新循环设置低于图像更新循环,以减少CPU负荷。
五、最佳性能表现根本就不是来自代码!
没有发生什么情况的时候,就说明性能良好。
这是我们关闭一切不必要之物的基本原则。
我们的项目是一个侧边横向卷轴动作游戏,所以如果不具有可视性时,就可以关闭许多动态关卡物体。
1.使用细节层次的定制关卡将远处的敌人AI关闭。
2.移动平台和障碍,当它们远去时其物理碰撞机也会关闭。
3.Unity内置的“动画挑选”系统可以用来关闭未被渲染对象的动画。
4.所有关卡内的粒子系统也可以使用同样的禁用机制。
六、回调函数!那么空白的回调函数呢?
要尽量减少Unity回调函数。
即使敌人回调函数存在性能损失。
没有必要将空白的回调函数留在代码库中(有时候介于大量代码重写和重构之间)。
七、让美术人员来救场
在程序员抓耳挠腮,绞尽脑汁去想该如何让每秒运行更多帧时,美术人员总能神奇地派上大用场。
1.共享游戏对象材料,令其在Unity中处于静止状态,可以让它们绑定在一起,由此产生的简化绘图调用是呈现良好移动运行性能的重要元素。
2.纹理地图集对UI元素来说尤其有用。
3.方形纹理以及两者功率的合理压缩是必不可少的步骤。
4.我们的美术人员移除了所有远处背景的网格,并将其转化为简单的2D位面。
5.光照图非常有价值。
6.我们的美术人员在一些关口移除了额外顶点。
7.使用合理的纹理mip标准是一个好主意(游戏邦注:要让不同分辨率的设备呈现良好的帧率时尤其如此)。
8.结合网格是美术人员可以发挥作用的另一个操作。
9.我们的动画师尽力让不同角色共享动画。
10.要找到美学/性能之间的平衡,就免不了许多粒子效果的迭代。
减少发射器数量并尽量减少透明度需求也是一大挑战。
八、要减少内存使用
使用大内存当然会对性能产生负面影响,但在我们的项目中,我们的iPod由于超过内存上限而遭遇了多次崩溃事件。
我们的游戏中最耗内存的是纹理。
1.不同设备要使用不同的纹理大小,尤其是UI和大型背景中的纹理。
《Shadow Blade》使用的是通用型模板,但如果在启动时检测到设备大小和分辨率,就会载入不同资产。
2.我们要确保未使用的资产不会载入内存。
我们必须迟一点在项目中找到仅被一个预制件实例引用,并且从未完全载入内存中实例化的资产。
3.去除网格中的额外多边形也能实现这一点。
4.我们应该重建一些资产的生周期管理。
例如,调整主菜单资产的加载/卸载时间,或者关卡资产、游戏音乐的有效期限。
5.每个关卡都要有根据其动态对象需求而量身定制的特定对象库,并根据最小内存需求来优化。
对象库可以灵活一点,在开发过程中包含大量对象,但知道游戏对象需求后就要具体一点。
6.保持声音文件在内存的压缩状态也是必要之举。
加强游戏运行性能是一个漫长而具有挑战性的过程,游戏开发社区所分享的大量知识,以及Unity提供的出色分析工具为《Shadow Blade》实现目标运行性能提供了极大帮助。