標籤:

遊戲性能優化(1)-why & benchmark

系列文章:

遊戲性能優化(1)-why & benchmark 遊戲性能優化(2)-budget

一、為什麼做性能優化(why)

性能優化是遊戲開發繞不開的重要環節。那麼性能優化為什麼重要?

  1. 大家都知道隨著硬體的發展,遊戲的畫面水平和玩法複雜度都在提高。那麼,換句話說,如果你擁有足夠好的優化能力,你的遊戲的畫面水平和玩法都是可以領先於時代的。
  2. 受眾群體大小。 玩家的客戶端硬體性能水平是差異很大的,性能越好的遊戲,受眾群體越大。
  3. 馬太效應。遊戲市場競爭異常殘酷,一個王者榮耀可以埋葬無數的MOBA品類的手游。9個80分,1個90分的同類遊戲里,90分的可能就是唯一活下來的那個。而性能優化可能就是獲得那多出來的10分的關鍵。
  4. 是不是遊戲足夠簡單就可以不用做性能優化了?未必,參照1、2、3得出:做好性能優化,能賦予遊戲更大的空間去提升效果和玩法、擴大受眾群,讓遊戲從眾多競品中脫穎而出。

二、萬事開頭難,性能優化的開頭是性能分析測量(benchmark)

理解性能問題

要解決問題,首先要找到問題,理解問題。通過對性能的測量,可以讓我們更客觀的理解遊戲的性能問題,定位優化方向。

遊戲是一個很複雜的系統,直覺和經驗有時候會誤導優化方向。比如一段看起來性能不是很好的代碼,可能執行的頻率是很低的,在全局來說,它並沒有造成什麼性能問題。如果靠經驗判定這段代碼需要優化,可能就會在這上面浪費精力。

通過大量的性能測量,也會逐漸建立我們更加正確的性能直覺和經驗,幫助在早期規避性能問題。當然,注意不要過早優化

基於底線和目標測量性能

做性能測量,要有一個底線(deadline),比如:手游內存必須小於350M,CPU佔用率必須小於80%。另外,我們需要有一個優化目標(target),我們要努力將內存和CPU優化到多少。底線是達不到遊戲就無法上線的指標,目標是我們要儘力達到的指標。

性能優化是一個迭代的過程,剛開始優化是很容易的,有很多優化點可以做,這個時候我們可以做一些無損效果、很容易做的優化。隨著迭代的逐步進行,優化越來越難。難在兩個方面:

  1. 優化本身需要比較大的工作量,需要付出時間成本
  2. 優化需要犧牲一定的遊戲質量,降低畫面效果或者砍玩法

只有我們建立了我們的底線和目標,我們才能判定一份性能數據是否達標,是否值得付出代價去優化。

能測量的性能問題才能優化

就向前文中提到的,遊戲是一個複雜的系統,你如果沒有具體的性能數據,就無法證明系統中某個功能點存在性能問題。同樣,你即使盲改一個問題,也無法證明這個改動能否提升性能(甚至降低性能)。

建立可測量的優化對象

為了優化性能,我們需要建立這樣的優化對象:

  1. 確定性能問題情形

    遊戲的性能問題只會在特定情形下才會出現,比如主城的某個視角、大量玩家作戰等。我們需要優化的是遊戲特性情形下的性能。
  2. 可快速重複執行

    確定了性能問題情形後,我們需要可快速重複創建同樣情形。這樣,我們才可以在做出改動後,對性能數據進行對比,驗證改動是否能夠提升性能。創建情形最好是快速的,因為優化很多時候是一個反覆嘗試的過程,不要把時間浪費在等待中。

性能結構與車間流水線

整個遊戲的執行過程很像車間的流水線,在每幀的開始,遊戲系統接受各類輸入,經過各個模塊的運算,最後產出一幀畫面。在整個過程的執行中,關於性能結構有兩個重要的概念:

  1. 80/20原則

    20%的代碼耗費著80%的性能,這20%的代碼往往存在於一個每幀被大量執行的循環中。
  2. 瓶頸

    在流水線上,如果生成零件C需要一件零件A和一件零件B,零件A和零件B是同時生產的,零件A的生產速度是零件B的一倍。那麼,這個時候生成零件C的瓶頸在於零件B的生產速度。遊戲系統中,有很多類似的情況,我們只有對系統的瓶頸進行優化,才能提升性能。

測量級別分級

  1. 模塊級

    對各個子系統進行性能測量,比如CPU佔用率、GPU佔用率、內存總量、dc數目。
  2. 演算法級

    針對演算法進行分析,根據核心演算法的吞吐量和性能數據預測性能風險。
  3. 代碼級

    對代碼級別進行性能測量,得到精確到行的性能數據。

測量環境維度

遊戲性能的測量環境具有兩個維度:

  1. 運行環境

    運行環境又包括:硬體條件 、** 操作系統狀態** 、** 網路狀況等各種會影響遊戲運行的環境。我們在優化性能時,一般是對目標環境**(具有普遍意義的運行環境)做重點優化,這些優化一般對所有運行環境都起作用。然後針對不同的遊戲運行環境做一定的針對性優化。在做性能測量時,需要明確當前的運行環境。
  2. 遊戲情形

    遊戲情形是指遊戲內環境,包括普遍情形,指的所有遊戲運行情形;又包括各類性能比較耗的重點情形,比如有大量角色和特效要渲染的戰鬥場景、有海量建築群要繪製的主城場景。我們優化性能時,這兩者情形下的性能問題都是優化的重點。

引用

  • 《Video Game Optimization》
  • 《Optimizaed C++》

推薦閱讀:

遊戲資源傳送門
unity3d在android使用sqlite
遊戲開發與程序設計知識總結06——常見軟體架構模式
行為樹對於遊戲的意義

TAG:遊戲開發 |