天天看點

遊戲中的優化指的是什麼?

【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.http://www.lomont.org/Math/Papers/2003/InvSqrt.pdf

【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" frame 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

繼續閱讀