vrchat吧 关注:41,955贴子:394,786
  • 17回复贴,共1

混水摸魚半年多大概分析出了一點VRchat異常的CPU開銷原因

只看楼主收藏回复

到早上沒睡太多,之後努力繼續詳細每個環節測量和獲取歷史數據,考慮把udon做好。(昨天睡太多了)
大概異常高CPU開銷的avatar可以透過自己各種監控軟件獲取比對發現。
其中大概80%~90%由場景組織結構層次的API造成開銷,而觸發原因是約束(constraint)
即使不是很高的avatar也可能有30-50%這麼誇張高的佔比,比大概20-30%的動畫控制器來得高。(以看不見時的影響)
物理骨骼(簡稱PB)自從256組件限制後其實有持續優化限制一堆奇怪大量濫用物理骨骼avatar的問題,使得自身使用大量PB的avatar不會那麼卡,也不會那麼容易觸發週期性大量峰值CPU飆升的bug(部份情形下會變成常駐CPU開銷 吐血)
至少大概佔據10%背景開銷,而純骨骼開銷方面占比接近0%。
少數avatar因此在自身方面接近提升70%。
裡面的坑太多就不解釋了,有些數據發在vrchat ask公告裡,懶得轉了,直接結論。

這是複現結果,如果是大量骨骼組織的avatar缺乏動畫控制器關閉約束造成的結果(不良的管裡沒成功進入休息),造成大量CPU浪費。
約5000個骨骼 120個約束即可造成此結果,有些avatar裡面佔據一半可能不到的CPU開銷,他們擁有1000-2000個骨骼100~400個約束,也僅僅只是造成了大約0.1~0.4ms(總共0.2ms~0.6ms每個avatar,已經很高了)),然而少數製作者設計不良,他們因此造成的開銷高達1ms以上甚至有可能到達3ms的極品。
如果我們能夠把約束全部消滅掉(然而對於avatar製作會麻煩些,期望有更好的處理方案)

同樣約8個avatar造成的CPU開銷對比,大約相當於820fps vs 47fps的巨大差距,不要覺得不可能,有些公開的avatar就是如此『差勁』。
自從PB問題被幹掉差不多後許多問題都較好追查了。
目前能找到造成串行化變成接近單核心的原因來自部份實質上只能單線程處裡的場景結構層次API。
這是優化前相當於1.4core的VRchat。

這是優化過後均衡許多約3core多的vrchat。

彼此之間在主線程上差距39.08%,而且是總負載的39.08%這可是相當於主線程佔比的55%,更別提還對整體CPU造成很多CPU週期開銷,以致於最終差距高達十幾倍fps(或著說avatar之間開銷差距十多倍)。
以上場景以沒有udon情況下測量結果為準。
我覺得VRC終極解決方案:取代掉約束,尤其是一些古怪的約束和大量骨骼層次結合使用,其次對於一些可能動畫控制器開銷高的場合,在script上提供兩種,一種視而不見可以徹底關閉,另一種則是全部運作,讓創作者自行根據需求選用,全力優化CPU開銷。


IP属地:中国台湾1楼2023-10-09 06:53回复
    太专业,我只会升级cpu


    IP属地:广东来自Android客户端2楼2023-10-09 06:59
    收起回复
      2025-07-29 06:57:34
      广告
      不感兴趣
      开通SVIP免广告
      约束这个问题VRChat官方之前就注意到了吧,但是不了了之了。我能做的就只能屏蔽别人的avatar了,特别是带分身功能的那种avatar,基本上都是用约束重建了一套骨骼,单avatar便占用了几百个约束


      IP属地:江苏来自iPhone客户端3楼2023-10-09 08:24
      收起回复
        另外大概附帶一下
        如果純avatar背景,然後大致上少量約束(1x個) 沒有進入關閉狀態一直運作 在加上場景整體結構層次 部份world群體可能較差?
        (以下數據以完全看不到但有全開avatar為準 全world)
        首先本身不使用高開銷avatar(接近沒開銷最低的avatar)觀測下數據會逼近
        約97%中33%來自於動畫、19%來自PB、45%來自約束,非常高。
        關閉自定義動畫後,理想情形下分布為
        一樣也是97%間的變化,17%來自動畫,25%來自PB,55%來自約束。
        然後約可以提升30%左右的CPU幀時,不過機會不多見,還得把自己的有些開銷或高開銷avatar換掉觀察,否則會低於20%。
        其實應該說30~50%約束+15~30%PB+20~40%動畫,而不是10%PB,不過PB一般使用程度沒那麼兇猛就是了。然後動畫層盡可能削還是存在一些全動造成的開銷。
        約束也受動畫影響有關聯的


        IP属地:中国台湾4楼2023-10-09 08:42
        回复
          辛苦了,很棒的数据。
          用个人浅薄的改模经验给吧友通俗易懂地解释一下就是,尽量用简洁的模型,别塞一堆配件衣服头发动画进去会给别人和自己的电脑很大的压力,有些模型的部件做开关动画关了看不见了并不代表占用消失了,占用依然在该卡还是卡。
          有时候卡的不是因为你常去的几个地图卡,而是地图里的人卡,衣柜公开模确实好看也确实换装舒服,但真的会对电脑造成很大的压力,所以在公开人多的房间还是尽量用一些小的简洁的模型吧。


          IP属地:日本来自Android客户端5楼2023-10-09 11:43
          收起回复
            談一下如果繼續優化能做到那些程度?
            到0.1ms後,倘若動畫控制器分離開來按需求使用特定工作狀態,我甚至認為還需要寫script來處理地圖同步問題,解放動畫控制器未同步造成的一些開銷問題。
            這些都是官方能做的
            按需使用的估計與模擬可以進一步降低至0.07~0.08ms
            其中0.035ms是PB,倘若也能優化掉可以進一步降低至0.035~0.045ms,如果動畫能更簡潔簡單可以壓低到0.02ms甚至0.01ms我覺得不是問題,只是因為job sync問題至少約0.15ms(整個場景)所以測量估計結果做到0.02~0.03ms是比較現實點的。
            需要的遊戲改造挺多的,
            以動畫方面改進優化搭配(如果官方用script分離解決)到0.075ms(平均0.07~0.08ms) 對比0.26ms平均每個avatar
            提升幅度約3.46倍左右。
            把PB方面幹掉約0.035~0.045ms取0.04ms則可達6.5倍提升。
            更理想的動畫設計取0.025ms則可達10.4倍提升。
            這裡都是說純avatar本身不包含world開銷,可以說算提升極大了,前提是能幹到上述的改進,這要花很多年..也許?


            IP属地:中国台湾6楼2023-10-09 12:52
            回复
              另外隨著avatar數量增加,場景結構層次會逐漸惡化造成更多CPU開銷。
              4個avatar時整個場景約1.06ms開銷。(這裡是指優化過的,未優化前1.9ms/4個)有些波動但不多。
              逐步增加其實沒如此巨大。
              隨著翻倍
              8個avatar『整體』來到1.7ms開銷。(這時候出現波動到2.1ms)
              16個avatar整體來到4.24ms開銷。
              32個avatar整體來到8.99ms開銷。(這時候波動到10.47ms且更密集)
              『波動』會逐漸加劇導致主線程開銷上升很快。
              上述0.1ms其實是在少數的情況下測量的,按照足量的計算結果,正確比對應該是1.9ms/4avatar vs 1.06ms/4avatar 和21.53ms(波動23ms以上)對比9ms的32avatar
              所以差距倍數沒那麼誇張(有點加水加大倍數就是)
              而不是少量個數下的測量結果。
              可能2.4倍(相比32avatar波動也差不多)而非2.6倍。
              也就是說我的avatar比對對像開銷其實是0.45ms vs 0.265ms,也就是1.7倍,隨著數量加大而明顯。
              動畫(沒有完全接近線性增長,也就是成倍數,低於倍數)+PB增長一些(成倍數)+約束(比倍數增長更快些,主線程惡化更快)。這導致主線程負荷過重,幀數很低。
              另外ms當參考還得看實際fps 雖然32avatar看起來是這樣 但實際平均fps在沒有測量干擾下是130fps,對比對象約45fps,差距倍數會比測量的ms還要更大些。
              16avatar是270fps。
              4個avatar 約1000多(1150fps跑出來過)。
              最終在優化過後的32avatar下的profile數據 能使用4core(4thread)

              最終在一個擁有12thread上的CPU使用到約33~36%的CPU,經複測確認沒有問題。
              攜帶一些約束造成大量CPU開銷,但並未堆疊過度嚴重也會有25~30%相仿主線程占用,最終30%以上CPU開銷,難以區分。
              另外剛剛操作數據失誤,發布了錯誤數據,惡化導致的開銷增長沒這麼快(複測了)。


              IP属地:中国台湾8楼2023-10-09 14:59
              回复
                厉害!


                IP属地:广东来自Android客户端9楼2023-10-10 17:56
                回复
                  2025-07-29 06:51:34
                  广告
                  不感兴趣
                  开通SVIP免广告
                  大佬


                  IP属地:广东来自Android客户端10楼2023-10-11 01:43
                  回复
                    話說是否有認識或知道優化很差世界的資產的?
                    關於CPU方面的開銷需要從這些地方下手,在確認數據前請先確認為CPU瓶頸。
                    上述數據沒有包含udon和world,而部份world在CPU的數據開銷上負荷大,L3越大越好,很容易存取RAM導致緩慢非常可觀。
                    需要有這方面的資產重現問題。


                    IP属地:中国台湾11楼2023-10-11 13:06
                    回复