點擊上方<font color=blue>億元程序員</font>+關注和<font color=orange>★</font>星標
引言
“玩家反饋這個界面好卡啊!”
“測試機幀率都掉到個位數了!”
“是不是因為DrawCall太高了?”
最近某個策劃同事總是發出類似這樣的靈魂拷問。
不知道是不是上次遊戲卡的時候給他提了一下DrawCall這個專業名詞。
並且告訴了他在哪裏可以查看這個數值:
結果一發不可收拾,DrawCall就成了他的口頭禪。
貼心的他,有一次還發來一條商城鏈接,“kkk動態合批”,“不行你就用這個吧,99也不貴”。
大佬,有沒有什麼好辦法把DrawCall降下來的同時,還能省下99?
哈嘍大家好,感謝上面粉絲提供的素材。
看完這個故事,同為程序的你,是不是心頭一緊,五味雜陳?
一方面,“DrawCall”這個概念已經深入人心,不再是程序自己的黑話。
另一方面,你又哭笑不得,因為這感覺就像:“車開不動了,別人就問是不是發動機的螺絲沒擰緊?”
這一期,我們重點聊一下DrawCall。各位看完能不能省99不好説,但是可以有一定的瞭解。(注意,遊戲卡頓其實原因很多,本文主要探討DrawCall)
1.什麼是DrawCall?
DrawCall是CPU通過圖形API(如OpenGL/DirectX)向GPU發送的繪製指令,包含網格數據、材質參數和渲染狀態等信息。
那為什麼DrawCall高會卡?
可以這麼通俗地理解:
把策劃比作CPU,把程序比作GPU,那麼下單一次的完整需求,我們可以比作一次DrawCall,程序能很快並且很好地完成需求(DrawCall低,遊戲不卡)。
但是,如果策劃下單需求之後,分多次再下單調整UI、修改玩法、補充內容,不停地打斷程序的“施法”,導致需求遲遲不能完成(DrawCall高,遊戲卡頓)。
因此我們需要想辦法把DrawCall降下來,回到上面的例子就是把策劃提的需求完整化,一次提完,實在不行就去解決策劃,畢竟瓶頸在CPU。
那有什麼辦法可以將DrawCall降下來呢?
2.老規矩,上例子
接下來給大家演示一個簡單的降低DrawCall的例子,但是不同的項目有不同的難度,本例子只做演示。
1.準備資源
首先還是準備一下資源,有美術搭子的找美術搭子,沒有美術搭子的找AI搭子(下期給大家分享一下)。
2.拼UI
簡單拼一下UI,期待哪天AI能夠徹底解決拼UI問題,那會減少多少矛盾啊!
3.寫代碼
首先綁定一下資源和腳本,包括背景、圖標和名字。
然後創建列表項,按順序設置背景、圖標和名字。
運行之後,我們可以看到不做任何處理的情況下,一共19個DrawCall(Canvas佔1個)。
下面我們嘗試一下降低DrawCall。
4.合圖
上面每渲染一個節點,便產生一個DrawCall,想要不額外增加DrawCall,相鄰的兩個渲染對象的材質與貼圖要相同。
講到這裏,大家應該知道要打圖集了。
給大家列舉2種方式:
1.手動合圖
手動合圖我們通常使用第三方軟件TexturePacker。
使用方式也比較簡單,將散圖拖進去,修改格式和路徑,然後發佈精靈集即可。
生成的圖集:
最後通過腳本綁定圖集,並且更換為圖集中的圖片:
2.自動圖集
自動圖集 作為Cocos Creator自帶的合圖功能,可以將指定的一系列碎圖打包成一張大圖,具體作用和TexturePacker的功能很相近。
我們可以通過右鍵要使用自動圖集的圖片目錄-創建-自動圖集配置使用。
生成的auto-atlas文件:
注意:預覽項目或者在Cocos Creator中使用碎圖的時候都是直接使用的碎圖資源,在構建項目這一步才會真正生成圖集到項目中。意思就是:
自動圖集需要發佈之後才能看到效果
5.查看效果
圖集處理好之後運行看下效果,使用圖集之後,DrawCall降低到13個了。
很明顯,雖然背景、圖標合併了,但是項與項之間的渲染被Label打斷了。
6.處理Label
因為我們的渲染被Label打斷了,那麼我們簡單粗暴地將Label移走不就好了?
於是我們嘗試一下,將Label從項中移出來。
這樣我們的DrawCall降低到8個了。
有什麼辦法可以合併Label的DrawCall嗎?
答案是有的,我們可以設置Label的文本緩存模式為BITMAP。
這樣我們的DrawCall就降低到3個了。
3.進階
現實項目並不能像示例中那麼簡單粗暴,可以採用以下思路:
在渲染前階段 (EVENT_BEFORE_DRAW)
- 記錄原始節點結構
- 創建新的層級結構
在渲染後階段 (EVENT_AFTER_DRAW)
- 恢復原始節點結構
結語
看完的小夥伴,是不是覺得99非常值了。
卡頓的原因其實還有很多,策劃不喊DrawCall了,小夥伴們知道還可以喊哪些嗎?
本文源工程可通過私信發送 DrawCall 獲取。
我是"億元程序員",一位有着8年遊戲行業經驗的主程。在遊戲開發中,希望能給到您幫助, 也希望通過您能幫助到大家。
AD:筆者線上的小遊戲《打螺絲闖關》《貪吃蛇掌機經典》《重力迷宮球》《填色之旅》《方塊掌機經典》大家可以自行點擊搜索體驗。
實不相瞞,想要個贊和愛心!請把該文章分享給你覺得有需要的其他小夥伴。謝謝!
推薦專欄:
知識付費專欄
你知道和不知道的微信小遊戲常用API整理,趕緊收藏用起來~
100個Cocos實例
8年主程手把手打造Cocos獨立遊戲開發框架
和8年遊戲主程一起學習設計模式
從零開始開發貪吃蛇小遊戲到上線系列
點擊下方<font color=gray>灰色按鈕</font>+關注。