0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ひとりアドベントカレンダーAdvent Calendar 2024

Day 11

【Unity】大量のテクスチャを表示する【RenderMeshInstanced】

Last updated at Posted at 2024-12-10

概要

大量のテスクチャを表示したい時がある
例えば、ヴァンパイアサバイバーライクな2Dの敵が大量に出現する場合などが考えられる

上記のスライドでは、そのようなゲームを実装する際のパフォーマンスチューニングについてわかりやすく説明している

気になったのがここのスライド
スクリーンショット 2024-12-11 0.18.47.png

参考動画が貼られており、自分でも試せそうだと思ったので試してみた

実験

スクリーンショット 2024-12-11 0.20.17.png
男の子の画像を用意した

この子をいっぱい表示することにする

動画では3Dだったが、今回はテクスチャを表示する四角のメッシュさえあればいいのでスクリプトで作ってしまう

簡単なメッシュ生成
    void CreateMyMesh()
    {
        _myMesh = new Mesh
        {
            // 頂点は4つ
            // 2---0
            // |   |
            // 3---1
            vertices = new Vector3[]
            {
                new(1, 1, 0),
                new(1, -1, 0),
                new(-1, 1, 0),
                new(-1, -1, 0)
            },
            subMeshCount = 1,
            uv = new Vector2[]
            {
                new(1, 1),
                new(1, 0),
                new(0, 1),
                new(0, 0),
            }
        };

        _myMesh.SetTriangles(new[] { 0, 1, 3, 0, 3, 2 }, 0);
    }

描画には、GraphicsAPIにはDrawMeshなど低レベル高レベル様々なAPIが用意されている
動画ではGraphics.RenderMeshInstancedを使っており、パターンによってGraphics.RenderMeshがいいそう

描画部分
for(var offs = 0; offs < matrices.Length; offs += 1023)
{
    var count = Mathf.Min(1023, matrices.Length - offs);
    Graphics.RenderMeshInstanced(rparams, _myMesh, 0, matrices, count, offs);
}

ひとまず動画の最終系通りに実装してみる

スクリーンショット 2024-12-11 0.30.30.png

大量に表示することができた

歩かせたりもしてみる

画面収録 2024-12-11 0.33.37.gif

撮影時は100FPSほどだが、撮影を止めると300FPSぐらい出ていた

プロファイラで見るとUpdate()に0.07msかかっている
スクリーンショット 2024-12-11 0.38.25.png

試しにRenderMeshを使ってみる

RenderMeshを使ってみる
for(var offs = 0; offs < matrices.Length; offs++)
{
    Graphics.RenderMesh(rparams, _myMesh, 0, matrices[offs]);
}

動かしてみると...

スクリーンショット 2024-12-11 0.40.15.png

Updateに0.17msかかっている
確かにRenderMeshInstancedの方がパフォーマンスに良さそう

もっと表示させてみよう

試しに500*500の250000個表示してみる

スクリーンショット 2024-12-11 0.42.31.png

RenderMesh

スクリーンショット 2024-12-11 0.43.28.png

スクリーンショット 2024-12-11 0.43.13.png

RenderMeshInstanced

スクリーンショット 2024-12-11 0.45.29.png

スクリーンショット 2024-12-11 0.44.24.png

顕著な差が出た
カメラ外のテクスチャをカリングするようにすればRenderMeshの方が有利になるかもしれない

今度試してみる

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?