jaijai’s blog

Cities Skylinesアセット作成に関するメモ・考察

【CSL2】仮想テクスチャとは何なのか

ゲームを起動直後、必ず目にする仮想テクスチャの処理。CSL2で導入された仮想テクスチャリング機能によるものです。これはどういったものなのでしょうか?簡単にですが調べてみました。

目的はGPUメモリ利用効率の向上

Unityにはストリーミング仮想テクスチャリング(SVT)と呼ばれる機能があります。CSLではこの機能をそのままもしくはカスタムして使っていると推測しています。

SVTではテクスチャを細分化し必要に応じてGPUメモリにロードします。これによってあらかじめすべてのテクスチャをロードする必要がなくなりメモリと時間を削減できます。CSL2ではデータ管理の効率性を重視しかつマルチスレッドと親和性の高い手法を採用しており、SVTの採用もその1つだと思われます。

基本的な仕組み

Unityマニュアルより。

ストリーミング仮想テクスチャリング (SVT) は、シーンに高解像度のテクスチャが多数存在する場合に、GPU メモリの使用量とテクスチャのロード時間を削減する機能です。SVT は、テクスチャをタイルに分割し、必要なときにそのタイルを GPU メモリに順次アップロードします。

対象となるテクスチャはあらかじめタイル化されUVとタイルが紐付けられます。ゲーム中にロードされていないタイルが必要になると非同期にそれらのタイルがGPUメモリにロード(ストリーミング)されます。ロードが完了するまではより高レベルのミップが代わりに使われます。

CSL2における仮想テクスチャリング

SVTではミップマップもタイル化管理されます。CSLではこのミップのストリーミングを有効活用していると思われます。 ゲーム開始時には低解像度な高レベルミップをロードしておき必要な段階でより精細なテクスチャをロードします。これらは非同期で行うのでゲームシミュレーションに対しても影響が小さいでしょう。

CSL2のテクスチャはかなり高解像度で負荷が高そうですがほとんどの場面ではある程度高いレベルのミップが使われていると思われます。リリース直後にぼやけたテクスチャがやたら目立ったのはSVTの調整不足だったのでしょう。

起動直後に行われる仮想テクスチャの処理はタイル化やUV調査、最低限必要なテクスチャのロードなどの処理が行われているのだと思います。