1. 程式人生 > >手機遊戲資源 特效 視訊記憶體分析工具

手機遊戲資源 特效 視訊記憶體分析工具

http://blog.sina.com.cn/s/blog_73bed4520102w4tt.html

step.1 準備工具

1.adb連線工具(我用的cofface adb  )

【cofface】adb基於最新安卓原始碼編譯修改,相容其它助手,增加引數,支援識別所有機型

2.Adreno Profiler 基於硬體層面檢視記憶體貼圖

所有有些團隊為了避免別人提取所以對資源進行了加密,最近又發現了一個神器基於硬體層面檢視記憶體貼圖,這樣就直接無視對方加密了

3.TexturePacket和還原工具

Anti_TexturePacker 或者 unpack_plist.py

step.2 連結手機

利用adb來連線手機有兩種方式: 1, wifi, 2, usb.

1. 通過wifi, 利用adb來連線手機。在pc的cmd中輸入命令: adb connect 192.168.1.100 如果電腦連不上安卓手機可以試試這個【cofface】adb基於最新安卓原始碼編譯修改,相容其它助手,增加引數,支援識別所有機型

step.3 檢視視訊記憶體貼圖

Adreno Profiler分析任意安卓遊戲特效抓取資源,可以用來分析安卓手機上OpenGL ES繪製過程。這個東西牛的地方在於可以抓取任何可以執行的App,而且使用起來非常方便、沒有額外限制。這個工具本質上是一個OpenGL ES Draw Call Replay;如果你用過PIX或者GPA,就會感到很非常熟悉了。

由於這個工具是高通提供的,所以只能執行在高通晶片的安卓機上。為什麼要強調這一點呢?其實其他廠商也有類似工具,但是從使用限制、方便程度上來說差太多了: iOS可以用XCode自帶的Frame Capture,但是這貨用起來很不順手,而且沒法抓取第三方應用。其他安卓廠商也有類似的工具,例如Mali Graphics Debugger,但是使用起來比較麻煩,譬如需要越獄、上傳so到系統目錄之類的。下面將具體介紹其使用

最近發現了一個非常好用的工具Adreno Profiler,可以用來分析安卓手機上OpenGL ES繪製過程。這個東西牛的地方在於可以抓取任何可以執行的App,而且使用起來非常方便、沒有額外限制。這個工具本質上是一個OpenGL ES Draw Call Replay;如果你用過PIX或者GPA,就會感到很非常熟悉了。下圖是貴易的魔天記,掛起來毫無壓力233

adreno_mtj

由於這個工具是高通提供的,所以只能執行在高通晶片的安卓機上。為什麼要強調這一點呢?其實其他廠商也有類似工具,但是從使用限制、方便程度上來說差太多了:

  • iOS可以用XCode自帶的Frame Capture,但是這貨用起來很不順手,而且沒法抓取第三方應用。
  • 其他安卓廠商也有類似的工具,例如Mali Graphics Debugger,但是使用起來比較麻煩,譬如需要越獄、上傳so到系統目錄之類的。

下面將具體介紹其使用,然後用兩個例子來講解,一個是抓取分析聚爆Implosion的特效繪製,另一個是用來做cocos2d-x圖形效能優化。

ps. 我習慣說Draw Call(DC),工具裡是Render Call,下文會混用...

環境配置

軟體配置

  • Adreno SDK不是必須的,可以無視;
  • 雖然Adreno Profiler提供了跨平臺版本,但這貨貌似是c#的,我嘗試在OSX下用Mono跑但是折騰不出來,所以最好還是Windows;
  • 需要將adb新增到系統路徑,可以直接下載一個Android SDK,但是我國國情導致你不一定能很方便的下載下來;還有一種取巧的辦法是所謂的xx手機助手、豌豆莢等工具目錄下一般都會自帶,指向adb.exe所在目錄即可。

硬體配置

需要一個有高通晶片的手機,我這裡強烈推薦G家親兒子Nexus系列!如果手頭沒有的話,可以去淘寶買個Nexus 4,雖然是幾年前的機器、不過一點都不卡,而且一千塊錢都不到。

注意目前Android 5.1上可能出現連線不穩定的情況,見官方論壇,我這邊測試5.0倒是一直能用~所以如果遇到這個問題,建議降低系統版本再說。

再注意需要開啟手機的開發者模式,並把電腦設為信任,偷懶的方法是用豌豆莢連一次,跟著指示做就行,驅動都自己裝好了。

基礎教程

如何抓取一幀

首先手機上開啟遊戲,執行到需要抓取的介面。然後在電腦開啟Adreno Profiler,點左上角的Connect。這裡有兩種連線方式:手機直接插到電腦上,或者在同一個區域網內使用IP連線。準備好了之後點選Refresh,直至刷出對應的裝置和應用:

adreno_connect

雙擊連線之後,點選Scrubber GL彈出抓取介面,然後點選Capture Frame等待即可

adreno_connect2

這樣其實就完成了抓取工作,是不是感覺so easy! 下面將從例子出發,介紹具體的使用。

小技巧:抓取完成之後,可以點選上方的Save將幀資料儲存成apr檔案,這樣可以之後Open,省的每次分析都需要連線手機、開啟遊戲。

基礎使用

這個工具使用非常簡單,核心是左下角的Render Calls。它其實是抓取了一幀中所有GL部分的呼叫及相關資料,然後按照繪製命令組織。當選中不同的Render Call時,工具會顯示從一開始到這一個命令的繪製結果,方便看到每一箇中間過程。此外,在API Calls中,還可以看到每一個Render Call之前的其他命令,包括各種對GL狀態機的修改:

adreno_api_calls

從圖中可以看到,在這個繪製動作前,對模板狀態進行了設定,然後傳了一些Uniform,並修改了頂點屬性~更方便的是,具體的頂點資料什麼也能直接看到!

adreno_vertex_data

如何檢視、匯出資源

就紋理來說,在右邊可以看到所有視訊記憶體裡的紋理資源,點開可以看到具體的紋理引數和縮圖。在上面有一個小的按鈕,可以將所有紋理都儲存成一個個檔案:

adreno_textures

就Shader來說,同樣也是可以看到所有Program,工具還會貼心的標出所有利用了該Shader的Render Call,下面可以看到反彙編出來的指令:

adreno_shaders

就模型來說,選中一個Render Call然後Save Vertex Data就可以匯出obj,但是生成的檔案還需要稍微修改下才能匯入,具體開啟看看就懂了~

adreno_obj

我曾經把馴龍高手的地形匯出之後放到Unity,毫無壓力-。-

adreno_dragons

進階使用

遊戲效能優化

之前zhiwei寫過Cocos2d-x+Lua遊戲的優化總結,下面我從圖形效能為例,來介紹需要注意的幾個點~

首先需要看一下每一個Render Call幹了什麼,是否有意義。根據不同遊戲型別,對Draw Call個數應該有個大概掌握。這個當然是越少越好啦~

  • 是否有無效Render Call,我曾經見過一個全屏繪製“無效果”,也就是螢幕內容在繪製前後結果完全一致,不知道到底幹啥了...
  • 是否有繪製到螢幕外的Render Call,也就是模型在螢幕外的情況;這個其實應該是引擎自動優化掉相機範圍外的物體,不過有的引擎不具有這個能力_(: