自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

游戲性能優(yōu)化的經(jīng)驗談

移動開發(fā)
說起游戲的優(yōu)化,在游戲開發(fā)中經(jīng)常分為這幾步:首先要確定游戲中經(jīng)常會出現(xiàn)哪些問題 - Profile;然后確定在哪些方向進(jìn)行性能優(yōu)化 - Analyze;最后再盡可能將問題逐個解決 - Solve

[[149217]]

優(yōu)化概論

說起游戲的優(yōu)化,在游戲開發(fā)中經(jīng)常分為這幾步:

  • 首先要確定游戲中經(jīng)常會出現(xiàn)哪些問題 - Profile

  • 然后確定在哪些方向進(jìn)行性能優(yōu)化 - Analyze

  • ***再盡可能將問題逐個解決 - Solve

游戲開發(fā)中一定是先做工具,進(jìn)行Profile,再進(jìn)行優(yōu)化,所以,說優(yōu)化就不得不再扯一下Profile

常見的工具有一些是引擎和IDE自帶的,比如Unity自帶的Profiler,就包含了CPU,GPU,Memory等等各式各樣的性能分析工具,其他的比如GPA,Xcode Instrument和Visual Studio,Intel自帶的內(nèi)存管理工具在必要的時候也使需要去學(xué)習(xí)和使用的。

另外一些工具,就需要根據(jù)游戲的需求去編寫了,比如一鍵關(guān)閉所有特效,一鍵更改分辨率等等,一鍵設(shè)置場上NPC數(shù)量,簡單的游戲如啪啪三國是做成快捷鍵開啟Profile功能的,更為復(fù)雜的游戲如神秘海域則是通過游戲內(nèi)控制臺來進(jìn)行更為細(xì)致的Profie。

接著,我們再來說說游戲優(yōu)化中主要的四個考慮方向:

o_optimize.jpg

CPU

引發(fā)的問題:

  • 由于短時間內(nèi)的計算量太大,導(dǎo)致畫面流暢性降低,俗稱跳幀

  • 發(fā)熱嚴(yán)重,耗電量高

常見的優(yōu)化手段:

  • 將計算分到多個邏輯幀中進(jìn)行計算,避免短時間內(nèi)的性能超過負(fù)荷,俗稱“分幀”(time-slice)。

  • 將可以緩存的數(shù)據(jù)盡可能的緩存起來,避免重復(fù)計算和重復(fù)分配內(nèi)存,常見的示例為“內(nèi)存池”。

  • 使用合理的算法和數(shù)據(jù)結(jié)構(gòu),比如:冒泡排序和直接插入排序在整體數(shù)組比較有序的情況下效率大大好于快速排序。把快排替換成是優(yōu)化程序排序效率的一個常見的思路。

GPU

引發(fā)的問題:

  • 發(fā)熱嚴(yán)重,耗電量高

  • FPS降低

常見的優(yōu)化手段:

  • 優(yōu)化美術(shù)資源,比如合理規(guī)劃圖集,約定好模型的***三角形面數(shù),制定合理的粒子效果規(guī)范。這個可以說是游戲優(yōu)化中最重要的一個,因此,技術(shù)美術(shù)在游戲開發(fā)中作用巨大。

  • 簡化或者優(yōu)化著色器(shader),如在游戲開始前就對Shader進(jìn)行編譯和加載。

  • 使用Batching,盡量減少DrawCall

  • 使用平臺推薦的壓縮格式,比如安卓平臺的ETC1和IOS平臺的PVRTC

IO和網(wǎng)絡(luò)

引發(fā)的問題:

  • 網(wǎng)絡(luò)延遲甚至掉線

  • 加載資源導(dǎo)致的跳幀

  • 加載時間過長

常見的優(yōu)化手段:

  • 使用獨立的線程進(jìn)行加載,有些引擎如Unity中還能利用協(xié)程

  • 減少網(wǎng)絡(luò)包里面的冗余數(shù)據(jù)

  • 合并小包,減少請求數(shù)據(jù)的次數(shù)

  • 分幀對回包進(jìn)行處理

  • 限制一定時間內(nèi)的發(fā)包頻率

內(nèi)存

引發(fā)的問題:

  • 閃退和卡死,比如安卓的Low Memory Killer會在低內(nèi)存情況下殺掉內(nèi)存占用過大的程序。

常見的優(yōu)化手段:

  • 動態(tài)加載和卸載資源,比如在游戲內(nèi)的時候,我們可以把游戲外的一些UI圖集卸載掉。

  • 降低資源質(zhì)量或屏幕分辨率,這是有損優(yōu)化,一般作為***的手段

對做過項目的一些思考

需要關(guān)注非功能性需求

這一點思考是我從“為什么很多看起來不是很復(fù)雜的網(wǎng)站,比如 Facebook 需要大量***高手來開發(fā)?”這個答案中想到的,正如這位答主所說:

“事實上,從我的經(jīng)驗來看,一般來說,很多軟件項目及產(chǎn)品,其在非功能性需求上的成本,難度和工作量,是要超過功能性需求的。在特定的軟件領(lǐng)域,例如網(wǎng)站(尤其是淘寶,facebook這樣海量用戶規(guī)模的網(wǎng)站),金融(銀行證券),電信領(lǐng)域,其非功能性需求實現(xiàn)的重要性,工作量,技術(shù)難度要遠(yuǎn)遠(yuǎn)遠(yuǎn)遠(yuǎn)大于功能性需求的實現(xiàn)。而且,功能性的需求的實現(xiàn),其實在大多數(shù)情況下,更依賴于業(yè)務(wù)的高手(或者好的產(chǎn)品經(jīng)理)而不是技術(shù)的高手,而非功能性需求的實現(xiàn),恰恰是挑戰(zhàn)技術(shù)高手的重要課題。”

在游戲前端這邊做了一段時間,大家都在抱怨游戲前端技術(shù)含量低,只能寫業(yè)務(wù)邏輯,但是其中的陷阱就是,作為前端,你應(yīng)當(dāng)盡量少寫業(yè)務(wù)邏輯,你關(guān)注過一下的模塊嗎?

  • 性能:你有沒有在自己的游戲中進(jìn)行Profile,觀察在以上各個參數(shù)有沒有達(dá)到指標(biāo)

  • 安全:你的游戲前端代碼的Release版本是否還能被別人輕易反編譯,你的游戲是否還能輕易被玩家截取網(wǎng)絡(luò)包或修改內(nèi)存數(shù)據(jù)

  • 可測試性:你的前端代碼能不能進(jìn)行單元測試,能不能在QA測試之前就把Model層的所有bug解決掉

  • 數(shù)據(jù)驅(qū)動:你能不能做出更優(yōu)秀的工具來給美術(shù)和策劃使用,解放他們的生產(chǎn)力?

需要善于劃定范圍,縮小問題區(qū)間

我在過去幾個月里,參加了全民突擊和崩壞學(xué)園2兩個Unity3D項目的開發(fā),也遇到了一些性能優(yōu)化相關(guān)的問題,在程序出現(xiàn)問題時,很多時候我們會通過所謂的“經(jīng)驗”去解決問題,這種Quick Link的能力自然是非常重要,但經(jīng)驗并非***。

但是從另一方面來講,當(dāng)我們無法從自己過往的經(jīng)驗中找到答案的時候,我們就要通過劃分范圍,縮小問題區(qū)間來解決問題了,許多人往往只是在自己的經(jīng)驗中死守一個局部的視野去處理問題,***的結(jié)果就一定不能盡如人意。

總結(jié)

其實這四個方面的優(yōu)化總是相互制衡的,你把一個方面的優(yōu)化做好了,另一個方面的問題又會出現(xiàn)了,比如,我們?nèi)绻褂脛討B(tài)加載和卸載資源,這就雖然減少了內(nèi)存占用量,會在IO上造成加載時間延長的問題。

所以,我們在做游戲優(yōu)化的時候,不能太追求***,剛剛好就是真的好(Good Enough Is Fine)。最終使得以上這四個方面能達(dá)到均衡即可,切忌在某一方面優(yōu)化過頭,又引發(fā)其他方面的問題,此消彼長的情況下,有時反而不如不做優(yōu)化。

責(zé)任編輯:倪明 來源: 王選易的博客
相關(guān)推薦

2009-06-29 15:39:53

Servlet和JSPServlet引擎

2011-06-21 16:26:19

SEO內(nèi)部優(yōu)化

2011-09-09 09:50:40

Oracle

2012-05-21 10:35:20

Windows Pho

2013-05-10 09:36:32

2011-08-15 10:27:48

2024-05-28 07:01:29

2009-09-14 15:04:44

2009-08-03 10:13:13

開發(fā)框架

2013-04-25 09:41:33

網(wǎng)管高級網(wǎng)管網(wǎng)絡(luò)管理

2025-03-05 09:00:00

大語言模型自然語言AI

2014-03-13 09:20:38

jQueryAngularJs

2013-08-02 11:23:45

2010-08-17 13:23:49

2017-01-20 09:43:12

日志告警挖掘

2012-07-13 14:25:59

2019-08-13 07:10:52

GameModeLinux游戲性能

2009-07-04 15:17:37

2016-01-11 11:20:43

2009-11-02 11:11:07

VB.NET OOP設(shè)
點贊
收藏

51CTO技術(shù)棧公眾號