テクスチャメモリとパフォーマンスの関連性
date: 2024-02-27-09-09
メモリは処理装置ではなく記憶装置なのに処理速度を向上させるという噂がある
テクスチャメモリがパフォーマンスに大きく影響するという噂が流れているが
いくら調べても脳内推測でそうだろうという推測性資料ばかり存在し
どれくらいパフォーマンスに影響を与えるかテストした資料が全く見当たらなかったのでテストしてみた
使用されたコード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TextureMemoryTest : MonoBehaviour
{
public Renderer renderTarget;
public Texture[] textures;
public int max = 800;
public bool useTexture = false;
// Start is called before the first frame update
void Start()
{
var wid = (int)Mathf.Sqrt(textures.Length);
var i = 0;
foreach (var texture in textures)
{
var instance = Instantiate(renderTarget.gameObject);
if (useTexture)
{
instance.GetComponent<Renderer>().material.SetTexture("_MainTex", texture);
}
var x = i % wid;
var y = i / wid;
instance.transform.position = new Vector3(x * 0.5f, y * 0.5f, i * 0.01f);
i++;
if (i>max)
{
return;
}
}
renderTarget.gameObject.SetActive(false);
}
}
-テスト環境-
CPU : Ryzen 5 1600
メモリ : 32GB 1333Mhz
GPU : RTX 3050 8GB
4k~8kテクスチャ800枚使用
使用されたテクスチャメモリは14GB
あることはあるが無視してもいいレベルで小さい
ミップマップにかかったからかドライバ段階でロードを阻止しているのか
テクスチャメモリがグラフィックカードメモリの2倍にも関わらず
問題が全く発生しない
処理量が最小のUnlitでも大差ないのに
ライト処理が入るStandardやToonシェーダなどでは差がもっと少ないだろう
むしろあの多くのテクスチャを表示するためにドローコールが大幅に増えてしまい
わざと馬鹿みたいにフラグメント段でtex2D関数を数十回呼び出したりミップマップを全部オフにして使ったりカメラの真ん前にキャラクターが1000人立っていたりしない限り
一般的な状況ではバーテックスとドローコール、シェーダだけ気にすればいいだろう
実際に一部集会ではこの話だけを信じてテクスチャメモリで入場制限をかけたが当然ながら全く効果がなかった
むしろ最近はテクスチャメモリだけちょこっと調整して他は何も触らないのでラグがより酷くなったようだ
ゲーム開発者は皆理論的には知っているのでどうでもいい話だが
VRChatで論争になったのでテストしてみた
そもそも最適化技法というものはCPUやGPUの演算量をできるだけメモリに転換するのが基本だ
こんなに複雑に考える必要なく、そんなに重要な要素だったら
Unity側でStatsタブにドローコールと一緒にテクスチャメモリも一緒に表示してくれただろう(…)
ここまでやっても信じない人がいるだろうから
直接目で見られるように
下に4kテクスチャで埋め尽くしたキャラクターを立てたワールドも公開した
https://vrchat.com/home/world/wrld_10abac1c-0493-4822-9426-e0f1a5eeedd3
最近VRAMが増えたからパフォーマンスのためだと誤解しているようだが
VRAMが増えるのはパフォーマンス向上ではなくAI駆動時のメモリ不足防止だ
AI駆動時にメモリが不足すると駆動自体ができなくなる
テクスチャが一番軽いという点を利用した最適化の例
- 頂点数を減らすために、Normal Map と Height Map というテクスチャに変換して使用
- ドローコールを減らすために、Light Map というテクスチャに変換して使用
- 遠距離の複雑なオブジェクトを 2D 化するために、インポスター(カメラで作ったビルボードテクスチャ)を使用
- 反射計算を減らすために Reflection Map に置き換えて使用
After
2025. 12. 2.
その後、もう一度詳しくテストしてみたところ、4KテクスチャはVRAMをたった42.7MBしか使用していなかった。 しかも、ストリーミングミップマップのMemory Budget機能によって、合計VRAM使用量は500MB以下に自動で調整されている。 これでは影響が出ないのも当然だった。
#タグ
VRChat テクスチャメモリ 最適化