游戏优化通常指的是改善流畅度,但实际上画面、网络、安装包大小等等都可以属于优化的范畴。那么这些优化都是怎么实现的呢?让我们一起来看一看。
1、遮挡剔除
可以降低被渲染对象的个数,降低渲染时间。
避免对因为完全被其他物体挡住而不可见的物体的渲染。
但是,完全的遮挡测试算法往往具有过高的复杂度,需要判断每个场景对象与其他对象的遮挡关系,导致计算带来的开销大于绘制带来的开销,并不实用。
2、背面裁剪
当我们观察一个不透明物体时,通常大约有一半的物体表面是看不到的,因此完全可以省去这一半的绘制工作,场景的多边形复杂度也将降低1/2左右。
2、视锥体裁剪
视椎体裁剪就是将不在视椎体中的物体剔除掉不绘制,而在视椎体内部或与视椎体相交的物体绘制的方法,此举对性能的提升有着巨大的帮助。
通常,物体是不规则的,为了方便,我们用该物体的包围球与当前视锥体进行比较。
如果包围球在视锥体外,那么不需要绘制此包围球所表达的节点及其所有的子节点。如下图所示,红色方块在视锥体外,该方块将被裁剪。
3、细节裁剪
场景中某些物体对于观察者而言可能是极其微小的,足以忽略不计,此时可以用细节筛选特性将它们剔除。
判断对象是否足够细微,需要用一个像素阈值来决定!
不过这种筛选可能会剔除一些必要的信息(比如用户在屏幕上绘制了一些点,却发现它们全部被吞噬掉了),因此它是一种通过牺牲质量来换取速度的技术。
4、贪心网格化
该技术仅支持方块类游戏
原理:尽可能的将两个相同正方形的顶点进行合并,连接成一个更大的正方形。此方法能够降低网格数量,减少渲染压力,提高帧数。
5、LOD技术
原理:视点离物体近时,能观察到的模型细节丰富。视点远离模型时,观察到的细节逐渐模糊。系统绘图程序根据一定的判断条件,选择相应的细节进行显示,从而避免了因绘制那些意义相对不大的细节而造成的时间浪费,同时有效地协调了画面连续性与模型分辨率的关系。
6、多核优化/多线程渲染
众所周知,现在的CPU一般都有多个核心
但是多个核心通常不会被程序充分的使用,例如出现这种情况
这也就是常说的一核有难,多核围观。这时候的游戏通常会出现掉帧卡顿的情况。因为有一个核心是单独跑渲染功能的,当这个核心的性能不够时,将会导致性能瓶颈。这也是常说的CPU性能瓶颈。解决这个问题的方法,那便是多核优化,将单个核心的功能分给多个核心,流畅程度便可以得到极大的提高。
怎样判断游戏的CPU瓶颈?
1、游戏卡顿,GPU占用率低。
2、游戏帧数高,但是游戏不流畅不稳定。
3、CPU单个核心占用过高。
通常有这几个情况的,基本上都是CPU出现了瓶颈。
多核优化做的好是什么样子?
所有需要计算的任务,都平均分配给不同的核心,所有核心同时工作。而不是仅仅一颗核心工作,出现卡顿的情况。
所以是否有多核优化到底有多大的区别呢?大家可以看一看这个视频。
多核优化在极致性能上的发挥到底怎么样呢?大家可以看一下这个视频。
误区:GPU占用率越低越好?其实GPU占用率低,有可能是两种情况。
第1种情况,就是一些游戏根本用不到这么多的GPU资源,所以说占用率低也非常正常。只要游戏不卡顿,通常都没有任何问题。
当然大部分游戏都是第2种情况,那就是因为出现了CPU瓶颈,导致GPU出现了调度问题。因为CPU就像一个大脑一样,不断控制着GPU进行渲染,如果CPU性能不够用,GPU渲染好全部的资源之后,便会等待CPU的命令,这样GPU便不能发挥全部的性能。
例:虚幻引擎,目前多核优化做的比较好的游戏引擎,那就要属于虚幻引擎了。虚幻引擎可以研发那么高画质的原因也在这里。大家如果比较感兴趣的话,可以看一下这个视频
7、异步处理
异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程。异步可以提高设备使用率,从而在宏观上提升程序运行效率。在加载大型资源时,不会堵塞主线程,可以优化资源加载造成的卡顿。
8、抗拒齿
抗拒齿是一种消除显示器输出的画面中图物边缘出现凹凸锯齿的技术,那些凹凸的锯齿通常因为高分辨率的信号以低分辨率表示或无法准确运算出3D图形坐标定位时所导致的图形混叠而产生的,抗拒齿技术能有效地解决这些问题。
为什么会出现锯齿?
计算器屏幕上显示的图像由一个个像素组成,绘制斜线的时候需要按照一个方向填充一个个像素的颜色。分辨率越大像素越多,分辨率越小,像素越少。
像素很少的时候,连续的几个像素看起来就会形成锯齿,分辨率越率大锯齿越弱。
9、法线贴图、凹凸贴图、置换贴图、高光贴图
①法线贴图是在原物体的凹凸表面的每个点上均作法线,通过RGB颜色通道来标记法线的方向,你可以把它理解成与原凹凸表面平行的另一个不同的表面,但实际上它又只是一个光滑的平面。对于视觉效果而言,它的效率比原有的凹凸表面更高,若在特定位置上应用光源,可以让细节程度较低的表面生成高细节程度的精确光照方向和反射效果。
②凹凸贴图是一种在3D场景中模拟粗糙表面的技术,将带有深度变化的凹凸材质贴图赋予3D物体,经过光线渲染处理后,这个物体的表面就会呈现出凹凸不平的感觉,而无需改变物体的几何结构或增加额外的点面,从而提升性能。
③置换贴图通常是让点的位置沿面法线移动一个贴图中定义的距离。它使得贴图具备了表现细节和深度的能力,且可以同时允许自我遮盖,自我投影和呈现边缘轮廓。
④高光贴图是用来反映物体高光区域效果,表现当光线照射到模型表面时,其表面属性的,如金属和皮肤、布、塑料反射不同量的光,从而区分不同材质。在引擎中表现镜面反射和物体表面的高光颜色。
这些贴图均可以有效提升游戏的画面效果以及渲染性能,可以提供更加好的效果和更加流畅的体验。
10、网络同步
①帧同步,其实是基本帧更新的同步方式,但并不是要求每一帧都同步数据,而要求多端,他们执行在指定的帧号上,而且每一帧,多端运行结果都是一致的。
②状态同步,其实是一种将客户端操作统一起来在服务端处理完后将结果同步给客户端的一种同步方式,具体执行逻辑写在服务端,以结果一致性为主。
③第三种相信大家可能并不太知道,这其实是帧同步和状态同步的混合同步方法,他们两种同步方法放在一起并不冲突,可以相互结合双方的优点。
这几种同步方式的优化基本上都是围绕着几点来做的,那就是延迟和一致性。网络的延迟决定了一个玩家的操作是否能得到及时的反馈,而一致性则确保了玩家有玩游戏时的公平。所以网络优化在游戏中也是极为重要的。
11、游戏包体优化
游戏包体优化主要指优化安装包的大小,比如发布一个安装包要300M,如果可以优化到200M,这样用户下载就比较快,避免在下载阶段流失用户。如果没办法优化到合适的大小,也可以采用热更新。
热更新,就是在服务器不重启的的情况下,对游戏增加新的功能或者修复出现bug的代码。游戏热更新通常会在进入游戏时进行更新资源,游戏更新迭代速度快,催生了热更技术的需求,特别是现在游戏通常都有几个G的占用,每次下载完整的包很不合适,所以游戏热更新也是非常重要的。
那么这期就先介绍到这里,如果还有人对其他的地方感兴趣的话,我也会考虑再写一篇。