2020年1月20日バッチング処理とは画面を描画する際に、描画グラフィックAPIを呼び出す必要があり、ドローコールと呼ばれてます。ドローコールは高コストで呼ばれる回数が多くなるとCPUのパフォーマンスに影響が出ます。そのため、ドローコールを少なくすることが大切になってきます。Unityではバッチングと呼ばれる処理でドローコールを減らしています。バッチングは、描画対象のうちでまとめられるものはまとめて一回のドローコールで描画できるようにする処理です。パフォーマンスの観点からはバッチング処理をなるべく利用していくこと大切になってきます。バッチングの種類Unityでは2種類のバッチングがあります。ひとつはダイナミックバッチング、もうひとつはスタティックバッチングです。ダイナミックバッチング条件を満たしている場合にUnityで自動的に行われるバッチング処理です。条件を満たす場合にのみバッチング処理されるため条件をある程度知っておく必要があります。条件には、同じマテリアルを利用する事やメッシュの頂点数などがあります。flagにチェックを入れる場合に行われるバッチング処理です。動かないオブジェクトに対して設定してください。ダイナミックバッチングより効果的にバッチング処理を行うことができますが、形状の情報はメモリに保存するためメモリとのトレードオフになります。ダイナミックバッチングを利用するスタティックバッチングが動かないオブジェクトという制約の関係上使えるタイミングが限定的なため、基本はダイナミックバッチングを利用していくことでドローコールを減らすことになります。上のように列挙しましたが、頂点数などは変更されるかもしれないと公式ドキュメントに書いてあったり、他にも細かい条件はあるようです。共有しているオブジェクトがバッチング対象になりうる事を覚えておきたいです。同じマテリアルを利用するバッチングの前提条件として、同じマテリアルインスタンスを共有していることが必要です。注意すべきことは同じマテリアルではなく同じマテリアルインスタンスである必要がある事です。コード上でマテリアルを割り当てる際に、materialプロパティにマテリアルを代入した場合、マテリアルはコピーされ別インスタンスとなるためオブジェクトはバッチング対象になりません。一方でsharedMaterialプロパティに代入した場合、同じインスタンスを共有できバッチング対象となります。GetComponent<MeshRenderer>().sharedMaterial;1234//別インスタンスGetComponent<MeshRenderer>().material;//同じインスタンスGetComponent<MeshRenderer>().sharedMaterial;テクスチャのアトラス化でバッチングに対応する参照するテクスチャのみ異なるマテリアルがある場合は、テクスチャをアトラス化して1つのマテリアルにすることでバッチング対象にできます。Spriteの場合、同じテクスチャであればバッチング対象になります。そのため、可能であれば同時に描画したいテクスチャをアトラス化しておく事が望ましいです。FrameDebuggerでバッチング処理を追うFrameDebuggerはドローコールを順に確認できるUnityのツールです。バッチングの状況及びバッチング対象外の理由などが分かるため、バッチングの最適化で役立ちます。ツールは、Unityメニュ上のWindow/Analysis/FrameDebuggerから開く事ができます。ツールを開いたらEnableを押しましょう。画面上では、別のテクスチャーからなる3つのトランプカードを配置しています。別々のテクスチャを利用しているためバッチング処理は走りません。そのためDrawDynamicが3回走っています。..」と前のバッチングにまとめることができなかった理由が書かれています。異なるマテリアルを持っていることが原因のようです。描画オブジェクトはSpriteなのでテクスチャ起因ですね。ここで、テクスチャアトラス化したトランプで表示してみます。1回になる事を確認できました。ritsukaりつかのゲーム開発ブログ【Unity】Canvasを分けてUIを最適化する【イラスト】イラスト投稿を始めて1か月経ちました個人ゲーム開発者りつか個人でゲーム開発してます。Unityを中心にゲーム開発で学んだ事をブログに書いていきます。りつかのゲーム開発ブログ。