游戏中的优化指的是什么?

1649 篇文章 11 订阅
1623 篇文章 22 订阅

【MiloYip的回答(73票)】:

游戏软件的优化和一般软件是有一些区别。

游戏通常是软实时(soft real-time),就是说运行上有时间限制,但没有硬实时般严格。

先谈固定硬件的游戏平台,如游戏机和街机。在这些平台上,通常会设置固定的帧率目标,例如30 FPS(即每帧33.3毫秒)。游戏开发者希望在这个时间限制下,尽量提升游戏的品质,例如更精细的角色和场境、加入更多效果、提升人工智能水平等。优化的目的除了令游戏顺畅,也是提升游戏品质的必要条件之一。

对于PC或手机平台,因为硬件的性能有很大差异,优化就没有一个具体的目标,而是希望尽可能在大部分平台上都能做得最好(虽然PC游戏有几百FPS的情况,但实质上几乎不能增加流畅性)。

从玩家角度,我认为游戏的性能指标大概有这几方面:

  1. 平均帧率

  2. 流畅性(不要「卡」,专业地说就是少spikes)

  3. 互动延迟(输入后至看到反应的时长)

  4. 等待时间(读盘、写档、网络连接等)

  5. 内存用量
  6. 游戏体积

  7. 网络流量(主要是移动平台)
  8. 耗电量(主要是移动平台)

而在开发的角度来说,我认为优化方法可以分为无损和有损的。无损是指不影响品质,纯粹通过技术上的优化去提升整体性能。而有损是指通过简化、近似化去改善性能,例如简化着色器(shader)、要求美术降低某角色的三角形数目、要求关卡设计师减少一些NPC等。

优化前我们要先进行性能剖析(profiling),找出性能问题的核心,然后再看看有什么方法可以尝试。主要可分为算法上的和底层的优化方法。不详细说明,就举个例子吧。

例如,在二维弹幕射击游戏中,需把大量子弹与飞机做碰撞测试(相交测试)。如果有n颗子弹,m个可被击中的目标,蛮力法需要mn次测试。我们可以看情况,使用一些空间分割的算法,把子弹和目标分配到不同的空间范围里,只需对每个范围里的物体做测试。而在底层方面,我们可以考虑使用多线性、SIMD指令,并考虑到缓存一致性等方面去优化。

上述例子主要是在CPU上进行的游戏逻辑方面的优化,而许多游戏中也需要在CPU/GPU上对图形方面进行优化。在PC/手机平台上,因为瓶颈不固定,游戏开发者通常会尽力优化每一个部分。

----------

@孟德尔和 @Thinkraft提到了Quake的平方根倒数,我引用一篇以前写的文章,测试SSE指令和Quake的实现:

在1999年,id software公司发布了《雷神之锤III竞技场(Quake III Arena)》巨作,此第一身射击游戏有别于前作,以多人连綫游戏为主轴,得到空前的成功。

在2002、2003年间,网上出现一段关于该游戏中的源代码讨论,那段代码是这样的:

float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = *(long*)&y; // evil floating point bit level hacking i = 0x5f3759df - (i >> 1); // what the fuck? y = *(float*) &i; y = y * (threehalfs - (x2 * y * y)); // 1st iteration // y = y * (threehalfs - (x2 * y * y)); // 2nd iteration, this can be removed return y; }

它是用于计算一个单精度浮点数的平方根倒数(reciprocal square root, 即1/sqrt(x))。平方根倒数在游戏中经常用到,例如把矢量归一化(normalize)时,就要计算n = v / sqrt(v ⋅ v)。

此段代码使用了牛顿法(Newton’s method)去提升精确度,但令人渍渍称奇的是它计算初始估值的这一句:

i = 0x5f3759df - ( i >> 1 );

它利用了IEEE754浮点数的二进制表示来计算第一个近似值。此方法是谁发明的,魔术数字(magic number) 0x5f3759df 从何而来,暂时也没有确切的证据。但现在已找到比这更优的魔术数字[1]。

然而,本文想带出的是,虽然此方法如此神奇,在现今的机器上通常不是最理想的。在PC上,自1999年Intel推出的Pentium III,就已经加入了SSE指令集,当中的rsqrtss指令就是能够计算一个单精度浮点数的平方根倒数。此外,rsqrtps则能同时计算四个单精度浮点数的平方根倒数。

测试

我们可以写一个程序简单测试一下:

(略……)

结果及分析

使用VS2008 (缺省release配置),在i7 920 2.67Ghz上的結果:

dummy 363.8ms error= 83.70051795% standard 1997.4ms error= 0.00000871% quake 586.1ms error= 0.17520049% quake2nd 970.1ms error= 0.00046543% dummy_ss 109.4ms error= 83.70051795% vsqrt_ss 1160.3ms error= 0.00000871% rsqrt_ss 108.3ms error= 0.03087627% rt2nd_ss 180.6ms error= 0.00002188% dummy_ps 26.8ms error= 83.70051795% vsqrt_ps 288.4ms error= 0.00000871% rsqrt_ps 27.0ms error= 0.03087627% rt2nd_ps 53.4ms error= 0.00002188%

standard用了标准库的sqrt()函数,编译器使用传统FPU的运算计算开方和倒数。

quake和quake2nd的确比standard快,但quake的相對误差峰值约是千分之2,误差较大。quake2nd则用接近一倍的运算时间来改善精确度,相對误差峰值降至约百万分之5。

divsqrt_ss使用了SSE运算,准确程度与standard相同,而耗时仅比quake2nd慢一点点。实际上,如果在编译器开启/arch:SSE,standard也会使用SSE运算,产生的代码和divsqrt_ss相约,性能也差不多。

重点来了,rsqrt_ss的耗时只有quake的18%,而相對误差峰值也更好,约万分之3。仔细一看,发现它的耗时与dummy_ss相若。换句话说,因为使用了流水綫的潜伏时间,其数据吞吐量和至dummy_ss相若。

那么,再比较使用多一次牛顿迭代的版本。rsqrt2nd_ss的耗时也只有quake2nd的18%。而相對误差值也更好,去到千万分之2的水平。

最后,若真正运用了SIMD的并行运算能力,使用ps后缀的指令又会如何?在此测试中,可以看到性能比ss版本的提升了3至4倍。而rsqrt_ps也因流水綫达至dummy_ps的吞吐量。rsqrt_ps比quake版本快20倍以上,比standard版本快70倍以上。

总结

虽然quake里的平方根倒数算法是令人津津乐道的话题,但从应用来说,它并不一定是最好的选择。

……

参考

[1] Lomont, Chris. "Fast inverse square root." Technical Report, 2003.lomont.org/Math/Papers/

【Thinkraft的回答(13票)】:

只答前半部分「什么是优化」。

我个人的看法:广义上, 优化是「为了达成相同目标,寻求并采用消耗更少资源的办法」的过程,或其结果。

不知道题主小时候读没读过高斯那个很流行的传说,老师让计算1+2+3+...+99+100,比起全部一个个相加,他发现1+100=2+99=3+98=...=50+51=101,然后直接101*50得出了答案5050。利用等差数列的求和公式使计算更加简便快捷,这就是一种算法优化。

那么把上面斜体部分代入到游戏这个话题中,不难理解优化是怎么一回事了:

通过特别的软件编程技巧……

实现相同的画面表现效果、流畅度,对硬件机能的需求更低、更平民化

或者

在相同机能的平台上,实现更好的画面表现效果、流畅度

如今玩家们口头说的优化,一般是针对移植作品,也就是至少有两个平台对比。人们会将游戏在原平台的画面表现和平台机能作为基线,去衡量移植版,有时也会以同平台的不同游戏作对比进一步论证。总之,一个游戏在一个平台上的优化好坏,大体可以用「表现效果/环境需求」的比值来衡量,或者说白了就是画面好不好看、跑起来卡不卡。

@孟德尔 提到的卡马克平方根倒数算法是一个细节优化的例子,就是采用了特殊处理而非标准库函数来提升运行速度,无数个这样的细节堆砌起来,造成的效果可能甚至不是不太卡和有点卡的区别,而是有的玩和没的玩的区别——那个时候你甚至想不到「优化」这个词。卡马克之所以神,就是因为他屡次化不可能为可能。他在PC机上先后实现了卷轴游戏、带贴图的伪3DFPS、真3DFPS、真实光源……这每一个进步背后都隐藏着优化,只是那个时代ID的光芒掩盖了一切,其领先业界的幅度之大让大家只能看到质变而已,可以说,在20世纪时,玩家们还没意识到优化一说。

——————————

下面不说怎么实现优化,而是谈谈大家是怎么意识到需要优化的。

回过头来,我们什么时候开始感到「优化」的概念呢?我想,应该是PS2时代。

PS和SS时代,主机阵营相当分明,即使跨平台游戏的表现有差异,多半也被归功于SS的扩展卡。同期主机游戏和PC游戏的互相移植相当有限,也就是一些大作,例如PC版FF8、PC版MGS、SS版仙剑之类。

进入PS2时代后,微软参战,加之卡社、科社为代表的公司进一步婊化,游戏跨平台化变得越来越流行。由于电视游戏主机的硬件相对固定,为了最大限度发挥机能,提高3D画面表现,开发过程中需要针对主机特性进行大量特殊处理,也就是所谓优化。而移植时限于成本,往往无法做到这么彻底,因此即使硬件性能相当,原平台版的表现通常还是会比移植版要强一些,这个差距可能体现在分辨率、抗锯齿、贴图精度、多边形数量、运行帧率等各个方面。

到了PS3/X360时代,PC移植兴旺后,「优化不足」的问题更加明显,原因主要有以下几点:

  1. 主机的特点是更新周期长,性能至少要照顾未来5年内的需求,硬件上必须采用推出当时中高端PC的配置;而价格上,为了迅速推广抢占市场,都是赔着本卖的——反正主要利润模式是软件抽税。一来一去,也就是说次世代主机推出的一两年之内,性能上是比同等价位的PC强不少的。买一台3000块的主机可以爽最新的游戏,但3000块的PC也就是欢乐斗地主水平。

  2. PC显示器分辨率碾压同时代电视,主机的设计输出分辨率其实是低于流行的PC游戏的。例如PS2的标准分辨率是480i(640*480),当时主流的17寸彩显怎么也是1024*768的。PS3的大部分游戏都是720p输出,每秒30帧;而两年之后的08年,1080p显示器已成主流。同一款游戏若需要达到1080p点对点每秒60帧的PC玩家习惯需求,分辨率上就扛了2.25倍的像素数量,帧率又翻了一倍,相当于需要的性能是主机版的4.5倍,这还没算抗锯齿的消耗。平民机玩移植游戏卡顿也是正常的。

  3. 由于PC并没有主机难以扩展升级性能的问题,厂商在将主机游戏移植到PC时也不会太介意硬件需求——反正你现在跑不起来过两年新显卡出来了内存便宜了就能跑起来了嘛。所以很多移植游戏的推荐配置都是变态级的。比如以「优化差」臭名昭著的GTA4,不光吃显卡吃的厉害(1G以下显存基本无法游戏),对CPU的要求也极其苛刻。

  4. *(本条慎读)PC玩家和主机玩家的群体重合度并不高,想想和主机原版发售日期比起来,PC移植往往晚几个月,有爱的早通关全成就了。其实等PC移植版的人有相当一部分是没钱买主机专等盗版的lamer(这逻辑很奇怪吧?明明差不多性能的PC买一台主机加十几个正版游戏都够了),素质也比较有限。你可以想象一下抠脚猥琐男们,盼盼盼,盼来个传说中的大作终于出了windows版,挂上迅雷拖两天装上一跑卡得像幻灯,上网发帖嗷嗷简直是本能啊~

【JimLiu的回答(1票)】:

不仅限于游戏吧,我不是做游戏开发的,了解一点,可以举点(可能不合适的)例子

有高大上的优化,各种先进的数据结构和算法等等,比如 @孟德尔 提到的快速平方根算法。

也有策略结合技术的优化,比如 @ArtS所言对于远距离对象降低贴图和模型质量。

也有“民科”的山炮技巧优化,这个例子我举不出来,因为太贴合生产了。我能举一个JS的例子,JS里用`~~x`做取整比`Math.floor`快很多……这种我看来就算民科了吧

可能有些跑偏吧,口头上说“游戏优化好不好”,主要是指它跟同期游戏在相同机器上比能否显得“它运行的效果与速度,对得起这台机器”

【HARDCOREGAME的回答(1票)】:

程序方面:

内存优化

渲染效率优化(包含综合帧率)

机型适配优化

CPU利用率优化

网络流量优化

资源大小优化

耗电量优化

I/O效率优化

美术方面:

配合渲染(面数,材质球,特效制作效率...)

id="cproIframe_u1628725_1" width="300" height="250" src="http://pos.baidu.com/acom?adn=3&at=103&aurl=&cad=1&ccd=24&cec=UTF-8&cfv=18&ch=0&col=zh-CN&conOP=0&cpa=1&dai=1&dis=0&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DdGdtGUHqwNu2pURRb8UkGMa0qRP42FpRL1c06gKRMMLcY8sP_24H_616adW9LkzbBI6s-6Ts1m9RFPyV4uXSwK%26wd%3D%26eqid%3Da109005d000065610000000355ebaa21&ltu=http%3A%2F%2Fwww.zhihujingxuan.com%2F19015.html&lunum=6&n=41057058_cpr&pcs=1903x952&pis=10000x10000&ps=0x0&psr=1920x1080&pss=1903x8498&qn=e2db4027c30bcd32&rad=&rsi0=300&rsi1=250&rsi5=4&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%230000FF&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rss7=&scale=&skin=&td_id=1628725&tn=text_default_300_250&tpr=1441507878325&ts=1&version=2.0&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u1628725&ti=%E6%B8%B8%E6%88%8F%E4%B8%AD%E7%9A%84%E4%BC%98%E5%8C%96%E6%8C%87%E7%9A%84%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F%20%7C%20%E7%9F%A5%E4%B9%8E%E7%B2%BE%E9%80%89&tt=1441507878312.14.49.52" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="border-width: 0px; margin: 0px; padding: 0px;">

配合适配 (UI的适配性,字体的适配....)

配合内存及CPU(贴图的UV排布,材质大小及通道复用)

策划方面:

不产生新开发需求的各个模块调优

【知乎用户的回答(1票)】:

一般说游戏程序的优化,都是说画质相同的情况下,提高游戏的FPS(Frame per second,帧率),减少内存消耗,减少耗电量(移动端)等。其中提高FPS一般是最被玩家看重的。

什么是FPS呢?简单来说,游戏是一个“死循环”,每次循环,就是做游戏逻辑更新,游戏场景绘制这两件事。一次循环叫一帧(Frame),一秒内执行这个循环的次数就是FPS,帧率。一般来说,一秒钟要有30~60帧才是比较流畅。

很显然,一次循环执行的时间越短,FPS越高,游戏越流畅;另一方面,更好的绘制效果,和更真实的AI和物理,往往需要的更多的运算(cpu和gpu)和内存资源。

这就需要程序员分配好这100ms~300ms的时间,把性能最到极致,以达到真实的游戏效果。

下面说下优化手段。

在我理解,程序的优化通常是充分利用问题的条件,在不改变程序功能或不影响视觉效果的前提下,减少程序执行时间或内存占用。一般对需求和运行平台环境限制越死,优化空间越大。

从底层到上层列一些自己知道的程序上效率优化手段,抛砖引玉。有不对的地方,请不吝指出。

1、代码级别的优化。在不改变算法的前提下,做profiling后,优化hot spot的代码,提高效率。

这类优化主要用在数学库里,如开平方、取整、SIMD优化。常见的还有减少分支等等。

2、图形API级别的优化。

主要减少渲染状态改变,减少Draw call。如材质简化,排序,渲染顺序改变,texture atlas。

3、内存布局优化。

提高内存局部性效率。这个只是听说,因为实际用起来对架构改变不小。

可以Typical C++ bullshit 作者的系列文章。

以上一般和平台有些关系。所以主机游戏的优化在这上面有一些优势,能比PC做的更好。苹果的Metal API也意在这个方面。(对主机开发不了解,道听途说)

4、平台和硬件无关的算法级别的优化。

比如利用可见行,减少需要计算物体的数量,或者使用更合适的算法和数据结构。

减少用于绘制的物体数量(Frustum culling),减少进入管线的面片数量(LOD),减少pixel shader的调用量(Early-Z,DR, TBDR),减少管线里的数据流量(纹理压缩,骨骼动画压缩),减少CPU-GPU等待时间(多线程渲染),空间层次结构(octree之类)。

使用缓存减少运算量。

CPU端使用多线程并行运算。

……

【知乎用户的回答(5票)】:

优化在计算机中覆盖的面太广了,这种没有具体指向的问题,只会引来越来越多的民科答案。

顺便,题主听到的这些话肯定都是门外汉说出来的。

ps,图形方面的优化期待 @Milo Yip 前辈的答案。

【徐奕成的回答(0票)】:

优化分很多:

内存优化

图形渲染优化

CPU利用优化等很多的内容。

一部分是靠游戏引擎,一部分是靠开发者。

如你要查找一万个数字,遍历的效率往往比二分低下,利用二分,就是优化。

占楼待详细更新。>_<

【吞噬迦蓝的回答(0票)】:

这里的优化指的是在一个有性能限制的平台上运行游戏的效果有多好,比如能在x360或者ps3这种上世代主机上表现出不错的画面或者在多年没换配置的电脑上运行出一个还算不错的效果就是优化好

【韩宇的回答(0票)】:

我认为题主这里说的优化更多是渲染层面的概念,它是兼顾设备、内存大小、运行效率、游戏容量等诸多因素让游戏表现更好、运行更流畅且开销更小的方法。一般优化方法都是有代价的,提升某方面,其他方面可能都会有所牺牲,需要考虑需求进行整合。

优化得好与坏都需要通过一种标准来验证。比如我朋友制作的ARPG网游,实时战斗,光影效果,精细动画,在iPhone4S上可以同屏50个不同人物打斗,稳定30FPS。那么这可能就是ARPG手游的一个优化标准,如果你能超越它,那么你就优化得更好!

最后明确一点,优化这个事一定是一开始就要打好基础的!

【知乎用户的回答(0票)】:

既然说游戏优化,那么聊聊某些容易被人忽视的因素吧。

程序角度的优化:

1、项目开发周期的分析及预估(版本计划)

第一个提是因为所有的优化方案都是基于整个项目基础上的,所有的突发情况都应该是可以被预估的。所有的冗余都是由于计划不完整造成的。

2、模块整合优化

项目肯定有重要功能以及辅助功能,将几个重要功能整合作为核心功能优先处理是相当有必要的。如账号登录以及商城充值。

3、各个功能模块功能点的梳理以及后续拓展的分析

如果模块优化是粗放式的,那么这个就属于细节了。分析各个模块的功能点有利于程序逻辑的实现以及项目的预估,并且使后续功能的拓展变得更加方便。

用户方面的优化:

1、用户行为分析需求整合——分析后提交给程序以安排时间设置埋点。

2、后台配置优化整合——添加各种查询功能,并设置权限。为策划、运营、QA、客服提供支持。

3、基于用户体验的交互设计优化——主要利用策划的主观感性设计、以及用户行为分析等客观手段作为参考。

美术源源方面的优化:

1、美术资源的有效利用——尽量不使用整张图片、重复利用小块拼接方式拼图、使用程序实现动态特效等等。手机游戏怎样压缩美术资源?

2、美术资源的有效管理——保证每个版本的资源都是明确不冗余的、不同版本的资源是可区分的、查询修改是方便的。

QA方面的优化:

1、测试流程的规范化管理。——能够随时掌握项目当前的所有功能点的测试内容、测试方法、测试通过标准。

2、用户体验的分析报告。——有利于策划在新版本开发时的功能模块优化。

还有很多其他方面的优化、比如用户可见的(节奏感、流畅度、动态特效表现)以及不可见的(游戏底层、数据库存储过程、表结构的优化、机器人AI优化)等等。

虽然回复经常没有人点赞,但是我还是会坚持每一条认真回复,只要能给予各位以些许启发就满足了。

【袁先生的回答(0票)】:

我本能的联想到 优化是调整各个系统、新手流程的体验细节,消费设计,增加留存

【白明宗的回答(0票)】:

说点策划面的找点存在感吧。

网游是在持续运营的,所以其中的优化行为更加明显。

以lol为例,每次赛季的规则修改,都是在上赛季大量数据的基础上做出的系统优化,已使赛事系统和排位赛系统有更高的使用率。

每次版本的调整,都是对核心玩法的优化,优化玩家的对局体验,提高数据,平衡英雄使用率,引导玩家行为。比如全tank时代啊,一代版本一代神啊,都是核心玩法优化的过程产物。螃蟹做的调整,也是改变了玩家行为的优化。

大厅界面的调整,聊天栏布局等UI交互优化,很多时候也是由策划主导的。

优化无止境,优化不一定是好的,策划优化尤其如此。WOW的版本迭代尤其能说明这个问题。

其实更多的优化点不是同一个游戏中的,而是一个类型的游戏不同世代不同作品前赴后继的积累而成的,这样看更有意思更有启示。

嘛,好像跑题了~

【泰达的回答(0票)】:

优化这个东西涉及游戏的方方面面,从程序到美术甚至策划。。。不过一般玩家所说的优化是指画面和配置要求跟同等级游戏比起来要差一些,比方说同是x360的沙盒游戏,gta5画面比黑道圣徒好(打个比方)帧数也更稳定就说gta比黑道优化好

【孟德尔的回答(3票)】:

典型例子

卡马克快速开方

卡马克快速平方根---平方根倒数算法 [转]

电脑游戏受限制,但是过去游戏机上所有底层驱动都是软件商自己写的,所以优化就指的是整个软件而不单单是某个方面了。

原文地址:知乎

     本文固定链接: http://www.zhihujingxuan.com/19015.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值