Unity Burst:Neon intrinsics更新

文章來源: 作者:frank 發布時間:2021年08月11日 點擊數:

Unity最近發布了Burst 1.5。新版本重點添加了多條Neon intrinsics指令。Neon intrinsics指令支持精確設定矢量指令,為Arm CPU的處理進程生成最為高效代碼。Neon指令集傳統上只適用于C/C++語言,而Unity目前已成功將其移植到了C#中。

不過,要找到最合適的指令并沒那么簡單,Arm為此特地制定了一份“Neon intrinsics在Unity中的運用”指南,外加一個帶有開源代碼的Unity項目,供廣大開發者參考。這篇指南將幫助你以正確的結構構建Burst代碼,讓代碼自動應用Neon指令集,享受其帶來的性能提升,為你省去自行編寫指令集的麻煩。我們下面就來看看怎樣才能充分利用起Neon intrinsics。

自動矢量化(Auto-vectorization)

Burst編譯器將自動采用Neon intrinsics來提高性能收益,而我們仍可以使用其它方法來進一步提高Burst性能。舉例來說,我們可根據一定的結構來調整數據和函數循環結構,利用自動矢量化來獲取大量的性能提升。

要想在Burst編譯器中將四條指令合并為一條Neon SIMD指令,我們可編寫簡短、連貫并保留內聯的函數。此外,經我們在物理碰撞模擬中測試發現,傳入Burst函數的指針在添加[NoAlias]屬性后,其速度可提高4倍。??

開發者現身說法

本文中的案例重點在于展示物理碰撞,因此上方演示場景僅使用了簡單的膠囊型和立方體圖形。例中對兩種類型的碰撞進行了優化:用于角色-墻體間碰撞的軸向邊框盒(Axis-Aligned Bounding Boxes,AABB),及用于角色之間碰撞的截面半徑碰撞。

手動編寫的指令要快于編譯器并不簡單,但這里將介紹幾種方法。可以讓性能改進不僅是個難以實現的目標。在進入分析優化階段后,我們可以先分析線程的運行耗時,再進行調整,如此循環往復。我們能使用Profile Analyzer,或自己的計時方法來完成這一階段的優化。

這時我們需要將注意力放到代碼調整上。在本例中,我們將原先的Burst jobs代碼轉寫成了靜態函數,方便進行計時。異步執行功能在最終的游戲代碼中發揮了巨大作用,盡管性能計時使得代碼執行更為復雜了一點。在一個真正的游戲里,你需要使用ProfilerMarker、ProfilerRecorder和ProfileAnalyzer來計算job的耗時。而在此例中,改寫后的Burst靜態函數實際上強制在腳本中應用了自動矢量化結構。如果job使用的是由Burst靜態函數組成的NativeArray,則基本類型的指針使用起來也會更加簡單,靜態函數會把數據拆分成更易矢量化的片段。而應用在指針上的[NoAlias]屬性會告訴編譯器指針調用的數據是否有重復。在此案例中,Burst的性能非常強大,以至于只有極其出色的Neon代碼才能比它更快。為了充分發揮Neon的作用,這兩種類型的碰撞都需要采用特定的數據和邏輯結構。

矢量化的效果在同時比對四個或八個對象時超好,因為這時運算可一次性完成(在Neon指令正確的情況下)。

新指令的效果可謂立竿見影,其中一項優化甚至能讓Burst代碼比結構精巧的非Burst代碼快6倍,讓手動編寫的Neon代碼快10倍。

主站蜘蛛池模板: 毛片男人18女人19| 99久久人人爽亚洲精品美女| 香蕉大战欧美在线看黑人| 最近免费中文字幕大全高清10 | 精品国精品国产自在久国产应用男| 日本漫画囗工番库本全彩| 国产成人无码区免费A∨视频网站 国产成人无码区免费内射一片色欲 | 亚洲三级在线看| 一级特黄录像免费播放肥| 欧美乱大交xxxxx| 国产波多野结衣中文在线播放| 亚洲AV无码一区二区二三区软件| 亚洲五月激情综合图片区| 最新仑乱免费视频| 无码福利一区二区三区| 国产一级在线视频| 中日韩在线视频| 美女激情视频网站| 差差漫画页面登录在线看| 免费大片av手机看片| china成人快色| 香港全黄一级毛片在线播放| 日本爽爽爽爽爽爽在线观看免| 国产一级二级在线观看| 东北鲜肉痞帅玩xvideos| 疯狂七十二小时打扑克| 国模沟沟冒白浆视频福利| 亚洲成a人片在线看| 亚洲www视频| 激情国产AV做激情国产爱| 国产精品香蕉在线观看| 亚洲av永久无码| 被公侵犯肉体中文字幕电影| 成人综合视频网| 人人爽人人爽人人片a免费| 3571色影院| 日本黄线在线播放免费观看| 午夜精品乱人伦小说区| 亚洲图片欧美文学小说激情| 免费能直接在线观看黄的视频| 日本一二三高清|