【程式設計雜記】遊戲效能優化的一些經驗之談
最近談了許多Unity相關的東西,這篇博文就將一些更加寬泛的東西,算是這段時間裡遊戲開發的一些經驗的總結吧。
優化概論
說起遊戲的優化,在遊戲開發中經常分為這幾步:
- 首先要確定遊戲中經常會出現哪些問題 - Profile
- 然後確定在哪些方向進行效能優化 - Analyze
- 最後再儘可能將問題逐個解決 - Solve
遊戲開發中一定是先做工具,進行Profile,再進行優化,所以,說優化就不得不再扯一下Profile
常見的工具有一些是引擎和IDE自帶的,比如Unity自帶的Profiler,就包含了CPU,GPU,Memory等等各式各樣的效能分析工具,其他的比如GPA,Xcode Instrument和Visual Studio,Intel自帶的記憶體管理工具在必要的時候也使需要去學習和使用的。
另外一些工具,就需要根據遊戲的需求去編寫了,比如一鍵關閉所有特效,一鍵更改解析度等等,一鍵設定場上NPC數量,簡單的遊戲如啪啪三國是做成快捷鍵開啟Profile功能的,更為複雜的遊戲如神祕海域則是通過遊戲內控制檯來進行更為細緻的Profie。
接著,我們再來說說遊戲優化中主要的四個考慮方向:
CPU
引發的問題:
- 由於短時間內的計算量太大,導致畫面流暢性降低,俗稱跳幀
- 發熱嚴重,耗電量高
常見的優化手段:
- 將計算分到多個邏輯幀中進行計算,避免短時間內的效能超過負荷,俗稱“分幀”(time-slice)。
- 將可以快取的資料儘可能的快取起來,避免重複計算和重複分配記憶體,常見的示例為“記憶體池”。
- 使用合理的演算法和資料結構,比如:氣泡排序和直接插入排序在整體陣列比較有序的情況下效率大大好於快速排序。把快排替換成是優化程式排序效率的一個常見的思路。
GPU
引發的問題:
- 發熱嚴重,耗電量高
- FPS降低
常見的優化手段:
- 優化美術資源,比如合理規劃圖集,約定好模型的最大三角形面數,制定合理的粒子效果規範。這個可以說是遊戲優化中最重要的一個,因此,技術美術在遊戲開發中作用巨大。
- 簡化或者優化著色器(shader),如在遊戲開始前就對Shader進行編譯和載入。
- 使用Batching,儘量減少DrawCall
- 使用平臺推薦的壓縮格式,比如安卓平臺的ETC1和IOS平臺的PVRTC
IO和網路
引發的問題:
- 網路延遲甚至掉線
- 載入資源導致的跳幀
- 載入時間過長
常見的優化手段:
- 使用獨立的執行緒進行載入,有些引擎如Unity中還能利用協程
- 減少網路包裡面的冗餘資料
- 合併小包,減少請求資料的次數
- 分幀對回包進行處理
- 限制一定時間內的發包頻率
記憶體
引發的問題:
- 閃退和卡死,比如安卓的Low Memory Killer會在低記憶體情況下殺掉記憶體佔用過大的程式。
常見的優化手段
- 動態載入和解除安裝資源,比如在遊戲內的時候,我們可以把遊戲外的一些UI圖集解除安裝掉。
- 降低資源質量或螢幕解析度,這是有損優化,一般作為最後的手段
對做過專案的一些思考
需要關注非功能性需求
事實上,從我的經驗來看,一般來說,很多軟體專案及產品,其在非功能性需求上的成本,難度和工作量,是要超過功能性需求的。在特定的軟體領域,例如網站(尤其是淘寶,facebook這樣海量使用者規模的網站),金融(銀行證券),電信領域,其非功能性需求實現的重要性,工作量,技術難度要遠遠遠遠大於功能性需求的實現。而且,功能性的需求的實現,其實在大多數情況下,更依賴於業務的高手(或者好的產品經理)而不是技術的高手,而非功能性需求的實現,恰恰是挑戰技術高手的重要課題。
在遊戲前端這邊做了一段時間,大家都在抱怨遊戲前端技術含量低,只能寫業務邏輯,但是其中的陷阱就是,作為前端,你應當儘量少寫業務邏輯,你關注過一下的模組嗎?
- 效能:你有沒有在自己的遊戲中進行Profile,觀察在以上各個引數有沒有達到指標
- 安全:你的遊戲前端程式碼的Release版本是否還能被別人輕易反編譯,你的遊戲是否還能輕易被玩家擷取網路包或修改記憶體資料
- 可測試性:你的前端程式碼能不能進行單元測試,能不能在QA測試之前就把Model層的所有bug解決掉
- 資料驅動:你能不能做出更優秀的工具來給美術和策劃使用,解放他們的生產力?
需要善於劃定範圍,縮小問題區間
我在過去幾個月裡,參加了全民突擊和崩壞學園2兩個Unity3D專案的開發,也遇到了一些效能優化相關的問題,在程式出現問題時,很多時候我們會通過所謂的“經驗”去解決問題,這種Quick Link
的能力自然是非常重要,但經驗並非萬能。
但是從另一方面來講,當我們無法從自己過往的經驗中找到答案的時候,我們就要通過劃分範圍,縮小問題區間來解決問題了,許多人往往只是在自己的經驗中死守一個區域性的視野去處理問題,最後的結果就一定不能盡如人意。
總結
其實這四個方面的優化總是相互制衡的,你把一個方面的優化做好了,另一個方面的問題又會出現了,比如,我們如果使用動態載入和解除安裝資源,這就雖然減少了記憶體佔用量,會在IO上造成載入時間延長的問題。
所以,我們在做遊戲優化的時候,不能太追求完美,剛剛好就是真的好(Good Enough Is Fine)。最終使得以上這四個方面能達到均衡即可,切忌在某一方面優化過頭,又引發其他方面的問題,此消彼長的情況下,有時反而不如不做優化。
相關推薦
【程式設計雜記】遊戲效能優化的一些經驗之談
最近談了許多Unity相關的東西,這篇博文就將一些更加寬泛的東西,算是這段時間裡遊戲開發的一些經驗的總結吧。 優化概論 說起遊戲的優化,在遊戲開發中經常分為這幾步: 首先要確定遊戲中經常會出現哪些問題 - Profile 然後確定在哪些方向進行效能優化 - Analyze 最後再儘可能將問題逐個解決 -
【Egret優化分享】白鷺引擎王澤:重度H5遊戲效能優化技巧
本文轉自:https://mp.weixin.qq.com/s/GIzXA51D7_hMqajCRuJE2g 9月15日,無懼17級颱風“山竹”,320名開發者齊聚廣州貝塔空間共同探討“怎樣做一款賺錢的小遊戲”。針對眾多開發者關心的重度H5遊戲效能優化技巧,我們整理了現場速記分享給
【ACtiveMQ】六 效能優化
1.1 ActiveMQ的效能依賴於很多因素 1網路拓撲結構,比如:嵌入、主從複製、網路連線 2 transport協議 3 service的質量,比如topic還是queue,是否持久化,是否需要重新投遞,訊息超時等 4硬體、網路、JVM和作業系統等 5生產者的數量,消費者的數
【朝花夕拾】Android效能優化篇之(四)Apk打包
APK,即Android Package,是將android程式和資源整合在一起,形成的一個.apk檔案。相信所有的Android程式設計師是在IDE的幫助下,完成打包輕而易舉,但對打包流程真正清楚的可能並不多。本章的內容比較簡單,也是非常基礎的內容,但是對理解android應用的結構卻有很大
【朝花夕拾】Android效能優化篇之(一)序言及JVM篇
序言 筆者從事Anroid開發有些年頭了,深知掌握Anroid效能優化方面的知識的必要性,這是一個程式設計師必須修煉的內功。在面試中,它是面試官的摯愛,在工作中,它是程式碼質量的攔路虎,其重要性可見一斑。在團隊中,效能優化的工作又往往由經驗豐富的老師傅來完成,可見要做好效能優化,絕不是一件容易的事情。
【朝花夕拾】Android效能優化篇之(五)Android虛擬機器簡介
前言 Android虛擬機器的使用,使得android應用和Linux核心分離,這樣做使得android系統更穩定可靠,比如程式中即使包含惡意程式碼,也不會直接影響系統檔案;也提高了跨平臺相容性。在Android4.4以前的系統中,Android系統均採用Dalvik作為執行andorid程式的
【朝花夕拾】Android效能優化篇之(五)Android虛擬機器
前言 Android虛擬機器的使用,使得android應用和Linux核心分離,這樣做使得android系統更穩定可靠,比如程式中即使包含惡意程式碼,也不會直接影響系統檔案;也提高了跨平臺相容性。在Android4.4以前的系統中,Android系統均採用Da
【程式設計6】貪吃蛇遊戲(python+pygame)
效果圖~新鮮出爐 開始介面 遊戲中 結束介面 一、pygame模組概覽 模組名稱 功能 pygame.cdrom 訪問光碟機
【MySQL技術內幕】64-效能優化
效能優化不是一項簡單的工作,但也不是複雜的難事,關鍵在於對 InnoDB儲存引擎特性的瞭解。如果之前各章的內容讀者已經完全理解並掌握了,那就應該基本掌握瞭如何使 InnoDB儲存引擎更好地工作。本章將從以下幾個方面集中講解 InnodB儲存引擎的效能問題: 選擇合適的CPU
【本人禿頂程式設計師】Java效能優化的47個細節(珍藏版)
在JAVA程式中,效能問題的大部分原因並不在於JAVA語言,而是程式本身。養成良好的編碼習慣非常重要,能夠顯著地提升程式效能。 1. 儘量在合適的場合使用單例 使用單例可以減輕載入的負擔,縮短載入的時間,提高載入的效率,但並不是所有地方都適用於單例,簡單來說,單例主要適用於以下三個方
Java程式設計效能優化一些事兒
1. 儘量在合適的場合使用單例 使用單例可以減輕載入的負擔,縮短載入的時間,提高載入的效率,但並不是所有地方都適用於單例,簡單來說,單例主要適用於以下三個方面: 第一,控制資源的使用,通過執行緒同步來控制資源的併發訪問; 第二,控制例項的產生,以達到節約資源的目的;
【推薦】 RAC 效能優化全攻略與經典案例剖析
在近期的第七屆資料技術嘉年華上,雲和恩墨技術專家曾令軍做了“RAC效能優化實戰”為主題的演講,分享了從硬體架構、系統與引數配置、應用設計以及工作負載管理這四個層面,剖析在RAC效能優化的過程中,應當注意的問題以及可以借鑑的經驗和思路。我們再次分享出來,希望對各位有所指導
【Android】RelativeLayout效能優化,避免畫面卡頓
今天在照著書寫拖動seekbar來改變圖片的色調、飽和度和亮度的demo的時候, 發現自己的demo在拖動seekbar的時候比書上的demo要有明顯的卡頓。 一開始以為是SeekbarAPI更新的問題,我用的是26的API,書上的是21的API, 但很快這種懷疑的念頭就被
【轉載】Spark效能優化指南——高階篇
前言 繼基礎篇講解了每個Spark開發人員都必須熟知的開發調優與資源調優之後,本文作為《Spark效能優化指南》的高階篇,將深入分析資料傾斜調優與shuffle調優,以解決更加棘手的效能問題。 資料傾斜調優 調優概述 有的時候,我們可能會遇到大資料計算中一個最棘手的問題——資料傾斜,此時Spark作業
【轉載】HBase效能優化方法總結(3):寫表操作
本文主要是從HBase應用程式設計與開發的角度,總結幾種常用的效能優化方法。有關HBase系統配置級別的優化,可參考:淘寶Ken Wu同學的部落格。 下面是本文總結的第二部分內容:寫表操作相關的優化方法。 2. 寫表操作 2.1 多HTable併發寫 建立多個HTable客
【面試】Web效能優化從前端到後端
效能優化 效能優化無非是,優化使用者體驗,減少網頁反應時間。原來在web效能優化書上看過 總的來分減少傳輸距離,減少傳輸量。具體從前端到後端來說 1、後端 存取速度原則是暫存器 > 記憶體 > 磁碟 1)操作資料庫耗時 2)存取檔案
【轉】Hbase效能優化四個要點
1 hbase.hregion.max.filesize應該設定多少合適 預設值:256M 說明:Maximum HStoreFile size. If any one of a column families' HStoreFiles has grown to exceed this value,
Linux系統程式設計【3.2】——ls命令優化版和ls -l實現
## 前情提要 在筆者的上一篇部落格[Linux系統程式設計【3.1】——編寫ls命令](https://www.cnblogs.com/lularible/p/14386358.html)中,實現了初級版的ls命令,但是與原版ls命令相比,還存在著顯示格式和無顏色標記的不同。經過筆者近兩天的學習,基本解決了
【UOJ#21】【UR#1】縮進優化
splay freopen logs img hide ssi 答案 div char 我好弱啊,什麽題都做不出來QAQ 原題: 小O是一個熱愛短代碼的選手。在縮代碼方面,他是一位身經百戰的老手。世界各地的OJ上,很多題的最短解答排行榜都有他的身影。這令他感到十分愉悅。 最
UOJ#21【UR #1】縮進優化
一個 amp getchar() esp 統計 efi == stream etc 傳送門 http://uoj.ac/problem/21 枚舉 (調和級數?) $\sum_{i=1}^{n} (a_i / x + a_i \bmod x) =\su