遊戲中的優化指的是什麼? | 知乎問答精選

 

A-A+

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

2017年10月13日 知乎問答精選 暫無評論 閱讀 100 ℃ 次

【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效率優化

美術方面:

配合渲染(面數,材質球,特效製作效率...)

配合適配 (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票)】:

典型例子

卡馬克快速開方

卡馬克快速平方根---平方根倒數算法 [轉]

電腦遊戲受限制,但是過去遊戲機上所有底層驅動都是軟件商自己寫的,所以優化就指的是整個軟件而不單單是某個方面了。

標籤:-遊戲 -遊戲開發


相關資源:





給我留言