Cocos2d x遊戲的效能檢測

2021-09-19 03:48:42 字數 3055 閱讀 9111

貼一篇舊文,如果以後有更多有趣的經驗會更到原部落格上:

前段時間本渣負責了一些優化我們cocos2d-x遊戲效能方面的工作,在這裡做一點記錄。

在debug版的cocos2d-x遊戲裡,通常會在左下角顯示三個指標(當然,是否顯示這三個指標是可以配置的):

可千萬別小看了這三個不起眼的指標,對從它們入手進行分析常常能找到一些效能問題的癥結。

fps算是其中最容易理解的指標了,這個值當然是越高越好。根據fps我們可以對效能問題做一些初步判斷,確定是在哪個地方開始掉幀。此外,我們往往會碰到卡幀的情況,這時候畫面像是突然被凍住了一般,這種情況其實與繪製渲染無關,而是因為在同一幀的計算量過大,cpu成為了瓶頸。針對這個問題就可以去定位計算的部分,對它進行優化或者將它拆到多幀裡去做。

gl callsgl verts都和繪製渲染有關,不過本渣以前在學校是做gpgpu的,並不覺得這主要是gpu的效能問題,而是資料或命令在cpu和gpu間傳輸時匯流排(bus)的問題。當資料量過大時,匯流排就成為了瓶頸。

先說下gl calls,這個值越小越好,合理使用[auto batching]()可以降低這一指標。最近本渣還通過這一指標意外地解決了我們遊戲裡的幾個和uilistview相關的問題。這些問題都有乙個共同點:滾動列表越滾越卡。本渣為此做了如下測試操作:在滾動列表處於初始位置時記下當前的gl calls(比方說記為x),在執行了若干次滾動操作後,讓滾動列表回到初始位置,記下gl calls(比方說記為y)。此時前後兩者的畫面基本一致,繪製的開銷應該也是一致的,也就是說xy應該相等(當然,如果介面上有動畫或者新加入的ui元素的話,可能會有些許偏差),然而有問題的地方y總是比x大,而且隨著滾動操作的增加而增長。這就基本可以確認是沒釋放資源導致記憶體洩露了,review了下對應的**果然如此:quick-cocos2d-x的uilistview有所謂的async模式,與cocos2d-x的tableview相似,並不會產生列表中的所有cells,而只產生顯示區域的cells,當滾動產生新的cell時會先重用不在顯示區域的cell例項(instance),從而降低開銷;而有問題的**(當然是本渣的隊友小夥伴挖的坑啦,哈哈)在重用舊的cell例項時並沒有把沒用的ui資源釋放掉,從而導致了這一問題。雖然我們碼農通過**並不難排查,但是gl calls這一指標提供了一種不需要看**就能定位此類問題的方式,特別適合測試人員採用。

最後說下gl verts,這個值也是越低越好。這裡順帶提醒下,有些人想要隱藏某些ui元素時會把它們的透明度設為0、或者把它們完全遮擋住,cocos2d-x對於完全透明或者完全被遮擋的node還是會做繪製的,這時通過gl verts這一指標就可以看出放不放這些「隱藏」ui元素的開銷是不同的了。此外還有隱式產生這一問題的情況,例如cocostudio中放入乙個帶顏色的完全透明的panel,需要注意避免踩坑(btw. cocos2d-x對於帶顏色的panel是用layercolor類來處理的,在我們所用的v3.2版本中,這個類的渲染**還會引起遊戲crash!)。當然,要降低gl verts還是需要和美術大大溝通好的。例如美術大大絞盡腦汁出了一張很精緻的大圖,但遊戲裡用不到那麼大,還要縮放成0.3倍,這張圖不僅很多細節在手機上完全看不清,而且還增加了gl verts開銷。要避免這種情況,還是要團隊裡成員合作好,在美術資源方面要定好合適的大小,控制好細節的精細度。

本渣之前玩過gprof和cuda的nvprof,深知借助於專業的profiler可以給效能檢測帶來許多方便,於是前段時間也花了不少精力在找cocos2d-x相關的profiler。

官方文件提到arm的streamline工具,但本渣看下來後並沒有採用:一者是需要編譯核心,對於我們這種小廠,這種可能玩壞測試機的我們還是玩不起的;二者是這篇文件很舊,當時cocos2d-x只有v2,不確定在我們v3.2的版本上是否能跑起來,而且本渣也沒查到其他人在cocos2d-x v3.0以上版本試水的資料。

本渣最後用的是android-ndk-profiler,這個工具確實能正常執行並產生效能檢測報告的。在cocos2d-x專案配置android-ndk-profiler基本照著leenjewel大神這篇文章就可以,因為leenjewel寫得很詳細,本渣的做法和他差不多,所以這裡就不贅述了。android-ndk-profiler的輸出基本和gprof一樣,如果你不知道如何分析gprof報告的話可以參考文件。

不過android-ndk-profiler乙個很大的問題是取樣:如果取樣率太低,收集到的資料可能不具有代表性;但調高取樣率往往會導致crash——像本渣就遇到過在遊戲剛啟動、畫面還沒出來時就崩潰了orz...這無疑帶來了不少麻煩,目前本渣還木有好的解決方案。

另外還有一些大神推薦高通的adreno profiler,本渣暫時還木有嘗試~

ios下當然是用強大的instruments啦!不過本渣更熟悉instruments的記憶體檢測工具,之前也曾用leaks解決了一些c++**的記憶體洩漏問題,在用instruments做效能檢測方面暫時沒有什麼心得~

android開發者模式裡也有許多如檢測gpu overdraw等的工具,可以在做android真機除錯時進行效能檢測和分析。當然,如何使用這些工具就不是本渣這裡所要討論的問題了哈~

arm streamline:

android-ndk-prof

adreno profiler

instruments:

cocos2d x如何檢測碰撞

我們的英雄現在可以發射子彈了,但僅僅只是裝飾而已,如何才能殺掉怪物呢?在這一章,我們將介紹碰撞檢測來實現這一效果。首先,跟蹤怪物和子彈是必需的。在遊戲中,我們為這兩種精靈加以不同的tag來區分它們。當tag 1時,表示這是怪物,而tag 2時,則表示這為子彈。由於在ccnode裡面有m ntag這個...

cocos2d x 遊戲優化方案

優化的方案 引擎底層優化 紋理優化 渲染優化 資源快取 記憶體優化.紋理優化 cocos2d x 底層是opengl es實現的。對於圖案片載入的記憶體是2的冪次方。使用的是100 128 會被轉為128 128。如此浪費一定的空間。色深優化 png a8r8g8b8 a1r5g5b5 argb44...

cocos2dx遊戲優化方向

優化方向 一 引擎底層優化 cocos2dx版本選擇 二 紋理優化 png格式,乙個畫素4位元組 1.二的冪次方拼圖 由於底層的opengl是按二的冪次方申請記憶體的,然後再吧這個存在記憶體中,如果 乙個480 480 4的要存入記憶體,那麼它的實際占用記憶體是512 512 4。所以為節約記憶體,...