原文由資深游戲測試開發(fā)工程師 陳子昂,發(fā)表于TesterHome社區(qū)使碾,點擊原文鏈接可與作者交流。
一般 drawCall 可以理解成是調(diào)用次數(shù),到底是調(diào)用了什么轰绵,一般性能測試里面會關(guān)注哪些。
提交給程序尼荆,Good 程序會說:這個地方可能是真有問題左腔,我有空時看看。
Bad 結(jié)果 程序:這真沒法修捅儒,一定讓我對著這個修液样,我就原地下線了。
那么應(yīng)該怎么做巧还,本文會去掉公式和一些學(xué)術(shù)詞匯鞭莽。
簡述下基本概念
移動端目前主流還是 OpenGL,drawCall 是 OpenGL 的繪制次數(shù),也是優(yōu)化參考指標麸祷,可以占到 4 分之一澎怒。
每次 Cpu 演算好,預(yù)設(shè)好頂點數(shù)據(jù)阶牍,在繪圖前喷面,會把頂點數(shù)據(jù)星瘾,位置,法線惧辈,顏色琳状,紋理坐標,切線通知 Gpu 進行渲染繪制
drawcall 數(shù)量越多就分別進行對不同的頂點數(shù)據(jù)進行上面一樣的渲染繪制的次數(shù)越多盒齿,次數(shù)等于 drawcall 數(shù)量念逞。
drawcall 數(shù)越多,Cpu 不會處理不過來(有些文章會說堵在 Cpu县昂,于是 Cpu 笑了)肮柜,這樣 Gpu 渲染承擔的就更多。
drawcall 會對物件進行分類倒彰,不同分類相似度高的审洞,drawcall 會緩存一部分,因為可以批量處理待讳。
切入點
我們說下 drawcall 過高芒澜,可以找到一處切入點的
1.設(shè)置場景內(nèi)粒子,但是只有發(fā)射创淡,沒有銷毀痴晦。
游戲測試會怎么做,首先編寫好用例琳彩,tag=客戶端性能測試
關(guān)鍵性:執(zhí)行反復(fù)操作一個特定事務(wù)誊酌,操作行為一般為 準備就緒-A-B-A-B,不會摻雜到其他的操作露乏。
事務(wù)特定性注意是不能用打開關(guān)閉背包這種碧浊,需要對場景進行實際操作的,如果 2D 游戲瘟仿,去通過打開關(guān)閉把背景界面降低到下一層做遮擋也是可以的箱锐。
3D 游戲事務(wù)實例:
準備就緒-移動到水波淋漓的湖邊(A可見水波淋漓的湖邊),B-丟出了一個特效技能比如6級不規(guī)則體冰球劳较,A-可見水波淋漓的湖邊驹止,B-丟出了一個特效技能6級不規(guī)則體冰球。
操作方式:
綁定自動化測試框架優(yōu)于人工測試观蜗,原因是機器每次的執(zhí)行步驟是嚴格一致的臊恋,而人不一定會嚴格按照操作步驟。
啟動一個新的進程對自動化測試框架做監(jiān)聽服務(wù)墓捻,由這個進行收集 drawcall捞镰,最好的方式是由該進程是一個接收數(shù)據(jù)的進程,程序 rpc 用字節(jié)流形式進入接收數(shù)據(jù)的管道。
準備就緒環(huán)境 - 最好是有一個 mock 服務(wù)岸售,因為 gm 指令可以移動到指定位置,但是造號正常情況下需要先過引導(dǎo)厂画,達成技能冰球條件凸丸,比如滿足某個等級冰球。
在跑自動化的時候袱院,可以通過 mock 服務(wù) (聚合多個接口屎慢,支持組合條件生成的創(chuàng)號規(guī)則) 返回造號成功后,自動銜接自動化進行采集忽洛。
程序或者調(diào)用引擎收集方式都應(yīng)該可以獲得以下數(shù)據(jù)腻惠。
{"type":"湖面","triangles":200,"Instance":2,"total_triangle":400}
{"type":"冰球","triangles":1200,"Instance":2,"total_triangle":2400}
1 個湖面會有好多個湖面,1 個冰球也會不止 1 個 type=冰球的欲虚,所以上面數(shù)據(jù)是一個對象集灌,應(yīng)該是一個對象數(shù)組的形式,數(shù)組的個數(shù)也就是 drawCall 次數(shù)。
數(shù)據(jù)敏感度:
1.多次操作可以關(guān)注 Instance 實例數(shù)复哆。
2.類型是否合理欣喧,如果視野內(nèi)湖面很大,但是冰球數(shù)很多梯找,也是需要記錄的
以上自動化腳本是可以預(yù)設(shè)的唆阿,數(shù)據(jù)敏感度的斷言也是一樣的。
自動化采集的話锈锤,會在同一個位置做二次復(fù)查驯鳖,才會定位 Bug,這個作用是查看復(fù)現(xiàn)步驟久免。
Bug 產(chǎn)出:數(shù)據(jù)敏感度部分 +drawcall 持續(xù)增長 就是該工具 Bug 產(chǎn)出浅辙。
那個場景有一些動圖(2D 看場景背景圖比如一些特效,3D 要看當前攝像機鏡頭妄壶,測試時請先固定攝像機鏡頭)摔握,并且渲染范圍比較大,則對性能影響更大丁寄。
所需基建能力
1.錄屏方案:安卓錄制屏幕的氨淌,因為 adb 會占用 adb forward,并且只能 3 分鐘一個視頻,如果其他錄制方案的伊磺,記得端口號和 adb 用同一個盛正。
2.多媒體處理能力:ffmpeg 去開發(fā)根據(jù)視頻長度去抽幀,作用很大屑埋,最大作用不是按一幀一張事后拆不用堵塞 IO豪筝。
3.logcat 日志,不同版本的內(nèi)容數(shù)量有差別。
產(chǎn)出打法
1.開始記錄監(jiān)聽的地方续崖,開始錄制屏幕 (需要提高分辨率的)敲街,完成后,最后在使用多媒體處理能力基建,drawcall 高的地方提供一組照片严望。
logcat 日志加上面的多艇,可以做操作復(fù)現(xiàn)。
程序會獲得對應(yīng) Bug 單子:里面附加可見測試用例像吻,drawcall 高的地方有一組圖片和 logcat 日志峻黍。
2.根據(jù)上面的html
{"type":"湖面","triangles":200,"Instance":2,"total_triangle":400}[]數(shù)組
和另外一個數(shù)組,統(tǒng)計出一個完整的數(shù)據(jù)
測試用例總會有個名字的
sessionId = 用例名操作1次(事務(wù)的一半)
sessionId:{
"type":"湖面",
“image":"素材的位置"拨匆,"drawCall_nums":50,"Instance_nums":10姆涩,
}
drawCall_nums=上面同一個類型數(shù)組總數(shù),Instance_nums 是實例總和
drawCall_nums 和 type 不合理的數(shù)據(jù)是通過公式計算出來的惭每。
多個 sessionId 就能根據(jù)一次的結(jié)果去分析到 drawCall_nums 和 Instance_nums 的上升和下降骨饿。所以這里看到需要預(yù)約一個標準,也可以找程序要一個標桿場景洪鸭,如果比這個還要高的肯定是要修復(fù)的样刷。
3.歷史數(shù)據(jù),每個階段跑一下览爵,看趨勢置鼻。
4.補充信息
根據(jù)到這個排查出的結(jié)果,去游戲內(nèi)復(fù)現(xiàn)后找到具體函數(shù)執(zhí)行的蜓竹,看 Profiles箕母,等于是通過多組自動化行為去達到掃描和分工合作(一個人使用,一個人去編輯器版本那邊拿補充信息)俱济。
尾聲
事務(wù)該如何找和有啥其他技巧嘶是,請等待下個文章: 客戶端性能熱力圖
以上是今天的分享,你學(xué)廢了嗎~
想學(xué)習更多干貨知識和前沿技術(shù)蛛碌?
想結(jié)識測試行業(yè)大咖和業(yè)界精英聂喇?
>> 歡迎關(guān)注2022 MTSC大會(第十屆中國互聯(lián)網(wǎng)測試開發(fā)大會)