zwin
zwin copied to clipboard
Sharing vertex buffer, texture and shader among multiple virtual objects
vertex buffer, texture, shader について、それぞれ複数のvirtual objectに(間接的に)紐づけられるようにしていて、これは同じtextureなのに複数のVirtual Object に対してそれぞれ別のtextureとして作成するとGPUのメモリがもったいないからだったとおもうんだけど、 例えばtextureの中身を書き換えたとき(attach されているwl_bufferの中身を書き換えたとき)、それに紐づいたvirtual object がcommitされたタイミングで実際にGPU内のtexture用に割り当てた領域を書き換えることになるが、その場合、そのtextureを使っている別のvirtual object は commit してないのに描画内容が変わってしまって、整合性が取れなくなる可能性がでてくるという問題がある。
解決策として、
- textureなどは一つのvirtual objectにしか割り当てられなくする。 問題点としては、複数のvirtual objectで同じtextureを使う時などに効率が悪い。
- texture (zgn_opengl_texture) はその中身を変更できないよう(immutable)にする。 virtual object に紐づいたtextureを変更したい場合は zgn_opengl_textureを新しく作り直して、attachしなおす。 これなら、さきのvirtual object A でのcommitでB の内容まで変わってしまう問題は解決するが、textureの中身を書き換えるときに一旦新たに古いtextureとは別のGPUのメモリ領域を確保しないといけないので、効率が悪い。(三つ以上のvirtula object に紐づいている場合は1. よりかは効率がよい。) また、古いtextureをいつ削除して良いかの制約が面倒。zgn_opengl_texture を削除したタイミングでGPU内のメモリも開放しちゃうのが実装的に楽そうだけど、そうするとなると、なにかにattachされているtextureはdestroyできないというprotocolにする必要がある。(ここでのattachされているかどうかは、commitされているかどうかまで含む。)
- 共有用のtextureとそうでないtextureを作って、共有用は2. をそうでない方は1.を適応する。