unity 让一个数按一秒累加_万物皆数—深挖UWA Benchmark之渲染篇
這個世界上的很多問題,其本質上都是數學問題,性能優化就是如此。
在上個月剛剛結束的UWA DAY 2019中,我們提出了UWA Benchmark。這是一個通過大量測試數據,逐步迭代分析出性能指標與性能耗時影響關系的基準測試模型。將高中低端不同機型上的大量隨機性實驗測試,作為樣本基礎,加以數據處理與分析,得到各個模塊中重要指標的定量和定性關系。
在Benchmark的第一階段,我們研究的是Unity引擎中單一模塊單一變量的影響程度分析。UWA在做游戲項目的技術優化時,常會聽到以下疑問:
- DrawCall和Triangle哪個對渲染耗時的影響更大,如何權衡?
- 我們游戲的目標機型是xxx,想同屏跑50個角色,角色骨骼數面數定在多少比較合適?
- 如何確定高端機/低端機的畫面分級標準?
這些問題其實都是無法給出標準答案的復雜問題。由于設備配置的變化、游戲渲染效果的復雜度,以及在各種引擎設置的區別之下,是不可能有一個絕對正確的量化答案的。
之前,業內大部分項目的做法是通過真機測試的耗時幀率,反推性能指標的范圍。如果耗時高了,就降一降DrawCall、減一減粒子、后處理。這種方式多用于研發中期,在主要角色、場景資源、渲染模型確定之后進行,但這種方式相對被動。而在游戲前期,對技術進行選型及重要指標進行制定時大多靠技術人員的“經驗值”。
UWA在進行了上百場深度優化及數千個項目的性能測評之后,發現這些性能指標之間其實是有規律可循的。因此,我們希望從數據的角度總結歸納出這些規律,把“經驗值”變成“計算結果”。在這個過程中,大部分結論是符合我們過往的認知和經驗的,但也有少部分數據和分析結果是超出我們的固有印象,對性能體系做到了一個很好的補充和解釋。
本篇文章中,將對目前UWA Benchmark中關于渲染模塊的研究結果進行講解。首先在測試機型的選取方面,我們選擇了3款安卓機,相關配置如下:
選擇的Unity版本為2017.4,這也是近半年在UWA的Unity版本使用情況統計中,使用率最高的一個Unity版本。
在渲染模塊,我們關心的兩個重要性能開銷是不透明渲染耗時和半透明渲染耗時。也就是Render.OpaqueGeometry和Render.TransparentGeometry。而在性能指標變量方面主要修改的是三個重要變量:DrawCall數、TotalTriangle數、參與渲染的Material數。并且在測試用例中控制三個變量的大致范圍如下:
我們通過渲染簡單Shader的簡單Mesh面片這種最簡單的渲染例子,盡量排除了其他因素的干擾。同時為了使渲染開銷盡可能準確,在測試中關閉了多線程渲染的選項。
一、不透明渲染
在不透明渲染的部分,經過對大量的實驗數據進行特征分析、數學建模與訓練之后,我們的模型得到了一個相對不錯的擬合結果。可以先來看一下紅米Note2上模型預測值的殘差圖:
從殘差圖中可以看到所有殘差的絕對值都不大(小于2.5ms),并且殘差都在0左右波動,變化幅度在一條帶內。同時,表示真實值和預測值差值絕對值均值的MAE為0.71,表示模型對預測目標解釋度的R2為0.94 (越接近1越好),這些都說明模型能夠根據可控變量的輸入來對目標函數的耗時進行良好的預測。
到這里我們就得到了在實驗環境下不透明渲染耗時與三個變量之間的數學關系模型。在合適的范圍內,可以通過給定的三個變量值,得到一個合理的預測值。通過模型還可以獲取三個變量對不透明渲染耗時的相對影響程度:
上圖展現了在紅米Note2上三個輸入變量對不透明渲染模塊的相對重要性。以最重要的變量為基準(即圖中的DrawCall),看做重要性系數為1,可以看到其余變量的重要性系數與DrawCall系數的相對比例。這里對變量的賦值量級做了調整,DrawCall數和Material數的量級都是1,而TotalTriangle數的量級為1000。也就是說,圖中所呈現的結果可以解讀為:當DrawCall數量增加1的時候,對不透明渲染耗時造成的影響與Material數量增加 1/0.51 = 1.96時差不多。而TotalTriangle的重要性則低到可以忽略不計,即在測試的范圍內,TotalTriangle的變化幾乎不會對不透明渲染耗時產生影響。
同樣的,在小米5X和小米5s這兩個設備上建模可以得到同樣的模型數據,同樣先看一下兩個機型上的殘差圖:
(1)小米5X的不透明渲染殘差圖
(2)小米5s的不透明渲染殘差圖
同樣也看到在這兩個機型上的模型殘差圖表現也是比較好的。同時它們的MAE及R2的值也是非常不錯,整理一下三個機型的這些模型指標如下:
可以看到小米5s上的數據最好,殘差均值為0.435ms,解釋度達到了95%以上。從這個評價結果來說,在測試的變量范圍內模型的預測值準確度已經非常高了。
接下來再來看一下另兩個機型的變量重要性系數圖:
(1)小米5X的變量重要性系數圖
(2)小米5s的變量重要性系數圖
和紅米Note2不同的是,在這兩個設備上,在設定的量級下,Material數成為了影響不透明渲染耗時最明顯的變量。而TotalTriangle在性能更好的機型上重要程度更低。最終我們可以得到在三個機型上三個變量對不透明渲染造成等值影響時的相對變化值:
根據以上模型的數據,我們可以得到初步的推測:
(1)DrawCall數和Material數對不透明渲染耗時的影響相近;
(2)TotalTriangle數對不透明渲染耗時的影響較小,在一定范圍內的部分機型上甚至可以忽略不計;
二、半透明渲染
在半透明渲染部分,同樣也是在紅米Note2、小米5X及小米5s三個機型上進行測試和數據建模。三個機型下模型的評估指標如下:
相比于半透明渲染來說,這里的模型解釋度有所下降,但也達到了90%。
接下來以紅米Note2為例,看一下我們最關心的變量的重要系數圖:
上圖展現了各變量對半透明渲染模塊在紅米Note2上的相對重要性。其中以DrawCall的重要系數為基準,看做1,其余變量的重要系數是其與DrawCall重要系數的相對比例。這里同樣對變量的賦值量級做了調整,DrawCall和Material數的量級都是1,而TotalTriangle數的量級為1000。
圖中所呈現的結果可以解讀為,當DrawCall數目增加1的時候,對半透明渲染的CPU耗時造成的影響與Material數量增加 1 / 0.37 = 2.7,或TotalTriangle數量增加 (1 / 0.01) * 1000 = 100000 差不多。
這里需要特別解釋一下圖中新的變量MatCountGT1,它的重要系數超過了1。在我們的模型中,這個變量是根據Material數額外生成的解釋變量,其取值為布爾值,當Material數>1時為True,否則為False。
因為在實驗中我們發現,當Material數 = 1(即渲染場景時不需要切換材質)時渲染模塊的CPU耗時很小,但只要Material數 > 1,CPU耗時就有一個顯著的提升。原因是半透明渲染的情況下,DrawCall會嚴格地從后往前提交,只要Material數 > 1,就會導致大量的材質穿插問題,使得DrawCall數接近測試用例中GameObject的數量(不透明的情況下,引擎會進行適當的DrawCall順序調整,所以DrawCall數更接近Material數一些),所以導致Material數的數值對target的影響相對比較小。
同理得到小米5X和小米5s上的重要系數圖如下:
(1)小米5X變量重要性系數圖
(2)小米5s變量重要性系數圖
同樣可以得到在三個機型上三個變量對半透明渲染造成等值影響的自變化值(因場景材質數通常大于1,故省略MaterialCountGT1):
從以上模型的數據及分析我們可以得到初步的推測:
(1)在三個機型上DrawCall對半透明渲染的影響是最大的;
(2)相比于不透明渲染,半透明渲染中Material數量的影響程度較小;
本文主要利用由大量實驗數據訓練所得的Benchmark模型,對Unity引擎中不透明渲染和半透明渲染的CPU耗時進行了深度定量分析。可以看到,利用Benchmark模型,我們不僅可以在給定輸入變量值時對相應模塊的CPU耗時進行準確預測,還能進一步提取出不同控制變量對模塊耗時的相對影響程度。關于引擎其他模塊(粒子模塊、物理模塊、動畫模塊和UI模塊等)的重要參數分析,您可以直接查看UWA DAY 2019的相關課程《如何根據UWA制定技術選型》。
嘗試使用更為科學、普適的方式來研究問題,是我們UWA不斷探索問題本質的方式。性能問題是我們想要不斷突破的一個方面,而UWA Benchmark則是我們現階段的一種嘗試。以上內容只是我們嘗試的一小步,在經過了大量的測試和分析之后,我們發現不同的引擎、引擎不同的版本、不同的硬件系統、設備廠商、系統版本等等都會對性能產生各種各樣的影響。未來,我們會不斷完善我們的分析框架、細化我們的測試條件,并結合真實項目的大量性能數據,力求挖掘出更多有意義的性能參數、打磨出更精準的數學模型,從而讓整個行業不斷獲益!
總結
以上是生活随笔為你收集整理的unity 让一个数按一秒累加_万物皆数—深挖UWA Benchmark之渲染篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存频率揭秘:提速神器还是杯水车薪?
- 下一篇: 内存条装多大?三个方面告诉你答案