本記事ではGPU負荷軽減のアプローチの1つであるアップスケーリングを実現するアセット 「DLSS4」「XeSS2」 およびUnity6で追加されたアップスケーリング技術の STP についてご紹介いたします。
筆者の開発経験
- C# 11年以上
- Unity 8年以上
Unityの最適化と暗号化と難読化を独学で8年かけて試行錯誤してきた筆者です。よろしくお願いします。
▼最適化の記事
▼暗号化と難読化の記事
想定している読者
- Unityゲームを開発している人
- UnityやC#の基礎知識がある人
- Unity2021、2022、2023、Unity6のいずれかで開発している人
- 3Dのゲームを作っておりGPU負荷が高く悩んでいる人
およびローエンド環境のユーザーを考慮してGPU負荷が低めの設定を用意したいと考えている人
アップスケーリングの利点と欠点
本記事でご紹介する「アップスケーリング」という技術を採用するメリットおよびデメリットは、簡潔に説明すると以下の通りです。
メリット
- Unity内部で処理される画面の描画面積を小さくする
→GPU負荷が大幅に下がる
デメリット
- 描画結果の画面の品質がアップスケーリング未使用時に比べて低下する
要するに内部での描画処理を一旦小さな解像度で済ませてから元の解像度に引き延ばすのがアップスケーリングです。
本記事ではこの利点と欠点が実際どんなものなのかをご紹介できればと思います。
# 1. 得られる結果
細かい説明は後回しにして、まずは Unity標準の機能だけ で得られる結果と アップスケーリングアセット「DLSS4」「XeSS2」を使用 することで得られる結果を本項にまとめました。
本記事ではURPのみ検証しますが、アップスケーリングアセット「DLSS4」「XeSS2」等は全てのレンダーパイプライン(ビルトイン、URP、HDRP)をサポートしています。
パフォーマンスの比較は項番3.2と3.3で行っていますので、本項では各アップスケーリング方法の画面の品質をご紹介いたします。
本記事ではUnity6(6000.1.17f1)で撮影した画像や動画を掲載しておりますが、2022.3.62f3、2021.3.45f2でも確認を行い
アップスケーリング方法による品質の優劣はUnity6と変わらないことを確認しています。
## 1.1. アップスケーリングなし
まずはアップスケーリング機能を使用していない通常の状態です。
URPの設定は以下の通りです。
- AntiAliasing(MSAA):8x
- RenderScale:1
この設定の場合のゲーム画面が以下の通りです。
▼動画
動きも重要なのでGoogleDriveにアップロードした動画を共有しますが、ストリーミング再生だと画質が劣化してしまいます
動画をダウンロードすると劣化なしの動画を見られるので、一度ダウンロードしてから視聴することをおすすめします
この品質を基準としてアップスケーリングで得られる結果の比較を行います。
## 1.2. Unity標準の機能のみ(FSR 1.0)
URPの設定を項番1.1から以下のように変更します。
- AntiAliasing(MSAA):Disabled
- RenderScale:0.5
- Upscaling Filter:FidelityFX Super Resolution 1.0
この設定の場合のゲーム画面が以下の通りです。
▼動画
なんともヒドイですね。
特にカメラを引いたときはまるでモザイクがかかっているようです。
## 1.3. Unity標準の機能のみ(STP)
STP(正式名称:Spatial-Temporal Post-processing) はUnity6で追加されたアップスケーリング機能です。
STPの詳細やSTPとFSR1.0の比較検証は以下の記事で紹介されています。
URPの設定を項番1.1から以下のように変更します。
- AntiAliasing(MSAA):Disabled
- RenderScale:0.5
- Upscaling Filter:Spatial-Temporal Post-processing
この設定の場合のゲーム画面が以下の通りです。
▼動画
アップスケーリングなしと比較して遜色ないのが分かります。
ただ動画で見ると、キャラクターが瞬きをすると目が滲んで見えるのが分かります。
またキャラクターが左右に移動した時も、キャラクターの輪郭が少しザラついています。
加えて地面に生えてる草の輪郭が潰れてしまっていますが、これほど細かい部分はアップスケーリングの性質上致し方ないものとします。
## 1.4. アップスケーリングアセット「DLSS4」
▼「DLSS 4 - Upscaling for Unity」のアセットストアページ
価格は本記事執筆時点で$32.99で、よくセールをやっています。
このアセットは「DLSS4」という名を冠していますが、NVIDIA RTX 50シリーズで登場したあのDLSS4とは無関係です。
このアセットの開発者である「The Naked Dev」さんの初代アセット「DLSS(無印)」が「DLSS2」にバージョンアップ、そして「DLSS3」を経て「DLSS4」にバージョンアップしたという経緯があります。
ややこしいですね…
▼「DLSS 3 - Upscaling for Unity」のアセットストアページ(現在は取り扱い終了)
このアセットの開発者は「DLSS4」の他にも「XeSS2」や「FSR3」など何種類ものアップスケーリングアセットをリリースしており、それぞれに良し悪しがありますが、詳細は後程説明するとして、まずは 最も品質の高いアップスケーリングアセット「DLSS4」 から見てみましょう。
URPの設定は以下の通りです。
- AntiAliasing(MSAA):Disabled(アセットの仕様により固定)
- RenderScale:1(アセットの仕様により固定)
また、アップスケーリングアセット「DLSS4」固有の設定で、Quality Modeは「Performance(2x)」にします。
これにより、描画面積はURPのRenderScaleが0.5の時と同じく4分の1になるため、条件が前項のFSR1.0やSTPと同じになります。
この設定の場合のゲーム画面が以下の通りです。
▼動画
こちらもアップスケーリングなしと比較して遜色ないのが分かります。
ただ動画で見ると、こちらもキャラクターが瞬きをすると目が滲んで見えるのが分かります。
またキャラクターが左右に移動した時も、キャラクターの輪郭が少しザラついています。
## 1.5. アップスケーリングアセット「XeSS2」
▼「XeSS 2 - Upscaling for Unity」のアセットストアページ
こちらも価格は本記事執筆時点で$32.99で、よくセールをやっています。
XeSS(正式名称:Xe Super Sampling) は、Intelが開発したAI強化アップスケーリング技術だそうです(曖昧)。
DLSSとの明確な違いは、DLSSはNVIDIA RTX系(20x0シリーズ以上)のGPU限定ですが、XeSSはIntel、AMD、NVIDIAのGPUに対応しています。
「XeSS2」はこのXeSSという技術を利用してアップスケーリングを実現しています。
URPの設定は前項の「DLSS4」と同じで、アップスケーリングアセット「XeSS2」固有の設定のQuality Modeも同じく「Performance(2x)」にします。
この設定の場合のゲーム画面が以下の通りです。
▼動画
「DLSS4」と比較すると若干品質が低下しているのが分かります。
また、「XeSS2」はフレームレートが落ちた時などにカメラが動くと被写体から残像のようなものが出る事象を確認しています。
▼残像の検証動画
# 2. アップスケーリングアセットの良し悪し
このタイミングで、本記事の主賓であるアップスケーリングアセットたちの良し悪しをご説明いたします。
▼「DLSS4」「XeSS2」等の開発者のアセットストアページ
本記事で取り上げている「DLSS4」「XeSS2」の他にも「FSR3」「SGSR2」などがありますが、これらのアセットの違いは対応している動作環境とアップスケーリングの品質です。
悲しいことに品質が高いアセットほど対応している動作環境が少なくなります。
品質が高い順に並べると以下の通りです。
| No | アセット名 | 動作環境 | 対応GPU |
|---|---|---|---|
| 1 | DLSS4 | Windows x64 (DX11, DX12 & Vulkan) | NVIDIA RTX (20x0シリーズ以上) |
| 2 | XeSS2 | Windows x64 (DX11 & DX12) | Intel、AMD、NVIDIA |
| 3 | FSR3 | ほぼ全てのプラットフォーム | ほぼ全て |
| 4 | SGSR2 | ほぼ全てのプラットフォーム (FSR3が対応してない 古いプラットフォームも対応) |
ほぼ全て |
これらのアセットは同じプロジェクトに複数種類入れることができ優先順位も設定できるので、アセットを複数購入できるのであればフォールバック用に買っておくのもアリです。
筆者の場合は「DLSS4」と「XeSS2」を導入して、第一優先に「DLSS4」を設定しているので、この場合基本は最も品質が高い「DLSS4」が適用され、対応していない動作環境では次点の「XeSS2」が適用されます。
筆者の場合はWindowsのDX11さえ対応してれば良い要件なのでこの2つで済みましたが、他のプラットフォームにも対応したい場合はその次の「FSR3」が必要となります。
「SGSR2」はFSR3が対応してない古いプラットフォームをどうしてもサポートしたい場合のみに需要が限られるので、あまり使われないのではないでしょうか。
これらのアセットの優先順位を整理すると、
- WindowsのDX11・DX12に対応したい
→ DLSS4 > XeSS2 - WindowsのDX11・DX12およびそれ以外に対応したい
→ DLSS4 > XeSS2 > FSR3 > SGSR2 - WindowsのDX11・DX12以外に対応したい
→ FSR3 > SGSR2
となるでしょうか。
# 3. アップスケーリング方法の比較
項番1のアップスケーリングの結果を踏まえ、品質・パフォーマンス・制約の観点から
それぞれのアップスケーリング方法の良し悪しを比較してみましょう。
## 3.1. Unity標準の機能のみ(FSR 1.0)
もしこのアップスケーリング方法を愛用してる方がいらっしゃったら申し訳ないのですが、他のアップスケーリング方法と比べて品質の劣化がヒドすぎるので論外です。
STPが使えず有料のアセットを買いたくないという人はFSR1.0を使うしかないのでしょうか…?
筆者は品質重視でゲーム開発をしていたので、FSR1.0が候補筆頭だった頃はアップスケーリングを諦めて使用していませんでした。
## 3.2. Unity標準の機能のみ(STP)
このアップスケーリング方法は非常に高い品質を実現できているように思います。
品質だけで比較するとアップスケーリングアセット「DLSS4」や「XeSS2」などは必要ないかもしれません。
ただしSTPが使えるのはUnity6限定で、なおかつRenderGraphを有効にする必要があります。
パフォーマンスはどうでしょうか。
以下の環境でパフォーマンスを比較してみました。
- CPU:「AMD Ryzen 5 6600H」
- GPU:「NVIDIA GeForce GTX 1650 4GB + AMD Radeon Graphics」
この環境ではアップスケーリングアセット「DLSS4」が機能しないので「XeSS2」が適用されます。
STPと「XeSS2」のパフォーマンスの比較結果が以下の通りです。
(ついでにアップスケーリング未使用時に比べてアップスケーリング使用時のパフォーマンスがどれほど改善されるかの比較もしています)
| No | 方法 | 画面解像度 | フレームレート |
|---|---|---|---|
| 1 | アプスケなし | 1920x1080 | 37 |
| 2 | アプスケなし | 2560x1440 | 24 |
| 3 | アプスケなし | 3200x1800 | 17 |
| 4 | STP | 1920x1080 | 60 |
| 5 | STP | 2560x1440 | 56前後 |
| 6 | STP | 3200x1800 | 40前後 |
| 7 | XeSS2 | 1920x1080 | 60 |
| 8 | XeSS2 | 2560x1440 | 43前後 |
| 9 | XeSS2 | 3200x1800 | 30前後 |
あれ?普通にSTPでよいのでは・・・。
## 3.3. アップスケーリングアセット「DLSS4」
このアップスケーリング方法もまた非常に高い品質を実現できているように思います。
STPはUnity6かつRenderGraphを有効にする必要がありますが、「DLSS4」は Unity2021、2022、2023、Unity6(RenderGraph無効を含む) に対応しています。
パフォーマンスはどうでしょうか。
以下の環境でパフォーマンスを比較してみました。
- CPU:「Intel Core i7-10700」
- GPU:「NVIDIA GeForce RTX 2070 SUPER」
STPと「DLSS4」のパフォーマンスの比較結果が以下の通りです。
| No | 方法 | 画面解像度 | フレームレート |
|---|---|---|---|
| 1 | アプスケなし | 1920x1080 | 60 |
| 2 | アプスケなし | 2560x1440 | 60 |
| 3 | アプスケなし | 3840x2160 | 40前後 |
| 4 | STP | 1920x1080 | 60 |
| 5 | STP | 2560x1440 | 60 |
| 6 | STP | 3840x2160 | 60 |
| 7 | DLSS4 | 1920x1080 | 60 |
| 8 | DLSS4 | 2560x1440 | 60 |
| 9 | DLSS4 | 3840x2160 | 60 |
アップスケーリングなしの4K解像度でようやくフレームレートが落ちるくらいなので、STPでも「DLSS4」でもフレームレートの低下を確認できませんでした。
なのでパフォーマンス面は推測になってしまいますが、恐らくパフォーマンス面で大幅に「DLSS4」が優れているということはないでしょうし、仮にパフォーマンス面で優勢だとしても品質がほぼ同等なので、STPが使える条件下でわざわざ「DLSS4」を選ぶ理由はないかもしれません。
比較検証としてはProfilerを使って正確に計測すべきではありますが、数ミリ秒程度の差となると作っているゲームのオブジェクトの数やポリゴン数などあらゆる条件によって結果が変わる可能性があり余り参考にならないため、本記事ではフレームレートによる簡易的な比較とさせていただきました
## 3.4. アップスケーリングアセット「XeSS2」
このアップスケーリング方法もSTPや「DLSS4」ほどではないにしろ、それなりに高い品質を実現できているように思います。
とはいえ項番3.2のSTPとの比較からしても、品質やパフォーマンスにおいて 「XeSS2」はSTPの下位互換 と言ってよいでしょう。
STPはUnity6かつRenderGraphを有効にする必要がありますが、「DLSS4」と同じく「XeSS2」は Unity2021、2022、2023、Unity6(RenderGraph無効を含む) に対応しています。
STPも「DLSS4」も使えない環境下であれば「XeSS2」はアリなのではないでしょうか。
# 4. まとめ
アップスケーリングアセット「DLSS4」や「XeSS2」などの強みは
Unity2021、2022、2023、Unity6(RenderGraph無効を含む)に対応していること
であり、
Unity6かつRenderGraphを有効化できるプロジェクトではSTPで充分である
と言ってよいのではないでしょうか。
使用しているアセットとの兼ね合いでUnity6未満またはRenderGraph無効の環境で開発せざるを得ない場合、アップスケーリングアセット「DLSS4」や「XeSS2」などを検討してみてはいかがでしょうか。
筆者がこの記事を書くまでSTPの存在を知らずに「DLSS4」「XeSS2」を使用していたのはここだけの秘密です










