如何用unity3D对游戏运行性能进行优化

如题所述

大家在玩游戏的时候可能经常会遇到卡顿,延迟,死机,不流畅等等问题,那么这些问题是怎么引起的呢?如何去尽量的减少这些情况的发生呢?这些问题对于游戏开发者来说是必须要面对的问题, 也是必须要解决的问题。

上面我们例举在游戏运行的过程中可能会遇到的一些问题, 每种问题引起的原因有很多多,但是我们可以从大方向对整体游戏进行优化,使游戏整体性能更优,从而减少这些情况的发生。对于性能优化我们大体可以从四个大方向去优化,即:CPU,GPU, 内存以及网络和IO,下面给大家一一讲解:

CPU优化,在游戏中CPU主要分担着运算的责任,因此像短时间大量的计算从而导致画面不流畅,电量消耗大,发热严重等情况都可能是因为CPU导致的。针对这些情况我们就需要对CPU优化,那么CPU的优化说白了就是对运算的优化,大家应该尽量减少大量运算或者短时间的大量运算,对此大家可以从四方面着手。一是将计算分散到多个逻辑中,减少短时间的大量运算。二是将可以缓存的数据尽量缓存起来,从而避免那些重复的计算。三是减少CPU对资源的申请、销毁与调配。四是使用合理的算法和数据结构,这个也是CPU优化中最重要的。

GPU优化,GPU的职责就是负责游戏中所有的图像、特效的渲染。GPU的消耗过高会导致游戏画面卡顿、画质降低、手机发热等情况,严重影响游戏体验。对于游戏来讲这是致命的。关于CPU优化大家可以从以下几方面入手:

1、资源优化,比如合理规划图集,指定合理的粒子效果,约定模型的三角面数

2、简化着色器,使用多级纹理与材质贴图技术相结合

3、使用LOD技术、遮挡剔除等技术,减少GPU绘制的数量

4、针对不同的系统平台使用对应的压缩格式。

5、优化显存带宽

游戏渲染可以说是游戏的心脏,所以GPU的优化显得尤为重要,需要开发者格外的重视

内存优化,内存的功能我就不多介绍了, 相信大家都了解。由于内存不足所导致的问题有闪退,卡死等。对于内存的优化,一是降低资源的大小,比如剔除不需要的资源、对资源进行压缩等;二是及时动态的加载和卸载资源,这样可以大大的减少瞬时内存的压力,减少因内存浪费而给游戏带来不必要的消耗。三是降低资源的质量,这是一种有损的优化,不到最后一般不用,当然我们也可以根据不同的设备使用不同质量的资源,将损失降到最低。

网络和IO优化, 他们主要负责资源的加载, 可能是网络的或者本地的。网络不好,或者资源加载时间过长会让大大降低用户体验。因此在CPU、GPU、内存优化后我们同时也不能忽略网络与IO优化,对于网络与IO的优化,大家可以从以下几方面入手:

1、限制短时间内的发包率

2、合理优化包大小,减少包的冗余数据,降低网络请求次数

3、对回包进行分帧处理,及时响应

4、使用独立线程、协程等手段优化资源加载。

温馨提示:内容为网友见解,仅供参考
第1个回答  2016-03-08
一、遇到麻烦时要调用“垃圾回收器”(Garbage Collector,无用单元收集程序,以下简称GC)
由于具有C/C++游戏编程背景,我们并不习惯无用单元收集程序的特定行为。确保自动清理你不用的内存,这种做法在刚开始时很好,但很快你就公发现自己的分析器经常显示CPU负荷过大,原因是垃圾回收器正在收集垃圾内存。这对移动设备来说尤其是个大问题。要跟进内存分配,并尽量避免它们成为优先数,以下是我们应该采取的主要操作:
1.移除代码中的任何字符串连接,因为这会给GC留下大量垃圾。
2.用简单的“for”循环代替“foreach”循环。由于某些原因,每个“foreach”循环的每次迭代会生成24字节的垃圾内存。一个简单的循环迭代10次就可以留下240字节的垃圾内存。
3.更改我们检查游戏对象标签的方法。用“if (go.CompareTag (“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.所有关卡内的粒子系统也可以使用同样的禁用机制。本回答被网友采纳
第2个回答  2016-03-14
MHOL的怪都很有挑战性很好玩的,想要断尾晶蝎的尾巴可没有那么简单,顺序一般是这样的,破某一爪的水晶,然后打出肉质。再破另一爪的水晶和肉质,接着是头部破位,最后才能完成断尾工作

Unity3D 在做性能优化方面需要注意的问题和技术细节
减少Draw Call是优化性能的关键,通过GPU Instancing等技术可以减少CPU和GPU之间的通信,减少延迟。务必注意控制渲染命令的数量。内存管理不可忽视,适当使用对象池技术可以有效管理内存,确保游戏运行的稳定性和流畅性。最后,利用Unity内置的Profiler工具进行性能分析,可以发现并定位游戏中的瓶颈,为优化提供精准...

如何用unity3D对游戏运行性能进行优化
对于内存的优化,一是降低资源的大小,比如剔除不需要的资源、对资源进行压缩等;二是及时动态的加载和卸载资源,这样可以大大的减少瞬时内存的压力,减少因内存浪费而给游戏带来不必要的消耗。三是降低资源的质量,这是一种有损的优化,不到最后一般不用,当然我们也可以根据不同的设备使用不同质量的资源...

如何用unity3D对游戏运行性能进行优化
1.首先就是要降低你的DrawCall数量,把小的贴图、精灵图汇总整理成大的贴图或atlases,多个模型多复用已有的贴图。2.优化模型,这个包括你说的精简多边形面数,在3dsMax里做,如果是静态模型可以用3dsMax里的优化修改器,如果是骨骼蒙皮动画,需要你用石墨工具重新布线。游戏模型为了增加质感一般使用低模法...

unity优化性能的方法
Unity优化性能的方法有:包体体积优化、骨骼动画优化、LOD的优化、模型细节增强,提升计算性能、 光照优化、SetPassCall与Drawcall优化、物理引擎的优化、阴影的优化、Shader优化等。1、包体体积优化声音文件优化: 将wav,压缩成mp3或ogg, 最好是ogg,没有版权问题, 将多声道变成单声道。改变声音的采样率与码...

Unity3D 快速优化几种方法
n 流程第一、性能第二。 花费时间来使你游戏的创建尽可能地流畅。尽可能快地修正游戏中的错误将会使你后期更容易优化你的游戏。n 在Scene View中测试场景。 这样做将会使你清楚了解这个场景中的物体或者附加在物体上的脚本是否降低了游戏性能。如果Scene View反应迟钝,那么有可能是图形方面的原因,如果...

unity3d游戏开发中如何提升游戏的流畅度
尽量多的设置静态个体。比如你要渲染足球游戏。那就把球场以及球门设置静态。单独设置一个球网。这样避免不必要的物理碰撞以及物理属性变化。

unity 性能优化 资源大小优化(贴图篇(Texture))
1.3 非2的整数幂 Non Power of 2 高级设置中,非2的整数幂的下拉框用于选择是否允许Unity3D对宽高均为2的整数幂的纹理进行压缩。若纹理尺寸不是2的整数幂,Unity3D将提示压缩限制。例如,导入1005*1200的图片,选择None则无法压缩,占用4.6M内存。选择ToNearset,Unity3D自动调整为1024*1024,压缩...

程序卡顿,unity3d 该怎么优化我的网格呢 让三角形最少化
1. 首先就是要降低你的Draw Call数量,把小的贴图、精灵图汇总整理成大的贴图或 atlases,多个模型多复用已有的贴图。2. 优化模型,这个包括你说的精简多边形面数,在3ds Max里做,如果是静态模型可以用3ds Max里的优化修改器,如果是骨骼蒙皮动画,需要你用石墨工具重新布线。游戏模型为了增加质感一般...

Unity3D 性能杀手Overdraw详解
例如:通过合并,我们消除了重复渲染,降低了性能负担。而将透明材质替换为不透明,例如:这样的转换同样有助于减少Overdraw,提升游戏性能。总的来说,Overdraw对Unity3D游戏性能的影响不容小觑,通过上述优化策略,开发者可以有效控制Overdraw,从而提升游戏帧率,优化用户体验。

unity3d 代码修改帧数 quality需要改什么意思
1、在Quality(质量)设置里把帧数设定关闭,之后才能在代码中修改游戏运行的帧数 2、在Unity中新建脚本UpdateFrame.cs ,编写如下代码 using UnityEngine;using System.Collections;\/\/\/ \/\/\/ 功能:修改游戏FPS\/\/\/ public class UpdateFrame : MonoBehaviour{\/\/游戏的FPS,可在属性窗口中修改public int tar...

相似回答