2013-01-29(Tue)
Draw Call Batching[Unity]
見やすくするために、一部のオブジェクトのmaterial変更して、
Shaderを切り替えたりしたのですが、そのときdraw callのbatchが効かなくなったのでメモ
コードはこんな感じに書いていました。
オブジェクトプールしているので、インスタンスは使い回し。
なので、初期化時(init_exec)にmaterialを初期設定に戻しています。
あとは、適当なタイミングで、設定されたmaterialに切り替え。
それだけなんですが、これをやると、draw callのbatchがマルッと効かなくなりました。
全然気づかずにやっちゃっていたのですが、たまたまStats見たときbatchが効いてないのに気付いて、
間違いに初めて気づきました。
Awakeの以下がまずかったです。
this.origMaterial = mRenderer.material;
これで、materialのインスタンスが生成されたものを参照してしまうみたいです。
なので、設定は同じだが、全materialが別インスタンスになって、ノーバッチ。
this.origMaterial = mRenderer.sharedMaterial;
上記の変更で、インスタンスが生成されずに参照できて、バッチが効きました。
後、MaterialPropertyBlock というのをはじめて知りました。
Renderer.SetPropertyBlock
これで、同一マテリアルで、異なる色など設定できるのかな。
Shaderを切り替えたりしたのですが、そのときdraw callのbatchが効かなくなったのでメモ
コードはこんな感じに書いていました。
オブジェクトプールしているので、インスタンスは使い回し。
なので、初期化時(init_exec)にmaterialを初期設定に戻しています。
あとは、適当なタイミングで、設定されたmaterialに切り替え。
それだけなんですが、これをやると、draw callのbatchがマルッと効かなくなりました。
全然気づかずにやっちゃっていたのですが、たまたまStats見たときbatchが効いてないのに気付いて、
間違いに初めて気づきました。
Awakeの以下がまずかったです。
this.origMaterial = mRenderer.material;
これで、materialのインスタンスが生成されたものを参照してしまうみたいです。
なので、設定は同じだが、全materialが別インスタンスになって、ノーバッチ。
this.origMaterial = mRenderer.sharedMaterial;
上記の変更で、インスタンスが生成されずに参照できて、バッチが効きました。
後、MaterialPropertyBlock というのをはじめて知りました。
Renderer.SetPropertyBlock
これで、同一マテリアルで、異なる色など設定できるのかな。
スポンサーサイト