Insomniac, 256人全職3年開發

5km的城市地圖

總資源量3TB, CPP源代碼有154MB...

Timeline視圖是多線程性能分析神器(吐槽下UE4也不集成一個, 還要自己拿開源的往裡整...)

ComponentUpdate也做了並行優化

Houdini程序化生成已經成為業界標配了...

使用json做為中間交換格式, 方便TA/程序和工具使用

場景Tile分塊載入

裝飾物根據不同環境狀態載入不同的模型

除了模型還有各種標記區域信息

移動與載入區域的關係

相比於6邊形的分塊方案, 正方形的分塊需要在移動時多載入兩塊

只把兩邊的載入優先順序降低了

每塊Tile的數據量約28MB, PS4的讀取速度又慢, 後臺一直在Streaming, 幾乎用完了帶寬

怎麼減少高速移動時載入的數據量呢?

  • 先載入Texture的低級MipLevel, 配合高速運動時的MotionBlur, 可以降低Texture載入的帶寬消耗
  • 一些東西在沒有其它磁碟活動時才載入: 細節裝飾物, 街邊門店玻璃後面的物體等

提高讀取速度的另一個思路是減少磁碟Seek

為了減少磁碟讀取Seek, 把一些數據做了冗餘存儲, 保證文件讀取一直是順序執行的, 典型的空間換時間思路

帶來的問題是, 一張藍光碟都裝不下了...

有選擇性的進行冗餘保存, 減少數據量. 就這樣冗餘數據還有10GB, 然後想法壓縮數據:

  • LZ4壓縮
  • 模型文件有7.5GB, 對IndexBuffer使用Delta存儲提升約20%壓縮率
  • LightGrid剔除沒有模型的範圍

優化完後每個區域的數據量減少到11.75MB

接下來是Rendering, 背景一直載入

他們的Impostor不是Billboard, 而是一些盒子. (這樣的效果比Simplygon簡化成的那一坨X強多了)

Impostor共享一張4k的Texture Atlas

不是所有的東西都能生成盒子狀的Impostor

使用Instancing來繪製, 坐標使用了區域中心的相對坐標壓縮

這些ReflectionProbe到處都是, 改成運行時生成Cubemap, 省了8GB

表情也是3Lateral的技術, 真人掃描, 每張臉有18375頂點

臉模型的Streaming壓力也很大, 進行數據壓縮:

  • 不壓縮的話, 18375 x vertex (position, normal, tangent) x 30幀 = 19.8MB/s
  • 每個頂點使用10+10+10的定點數壓縮, 6.2MB/s
  • 去除normal和tangent, 2.06MB/s
  • 配合LZ4壓縮, 0.5MB/s

動畫數據也使用DeltaCompression

附: 原文鏈接

https://www.dropbox.com/s/cngcqlvb8zoqxq5/ElanRuskin_gdc2019_marvels_spider-man_preliminaryexport.pdf?dl=0?

www.dropbox.com


推薦閱讀:

相關文章