iOS および Android アプリケーションのプロファイリングを行っていたところ、フレームごとに多くの冗長な glVertexAttribPointer 呼び出しがあることに気付きました。これらの状態をキャッシュし、必要な場合にのみメソッドを呼び出すという戦略を思いつきました。
glVertexAttribPointer は、次の場合にのみ呼び出す必要があると考えました。
- 属性がまだ設定されていません
- 新しいシェーダーがバインドされています (属性の場所を無効にする可能性があります)
- 頂点宣言が変更されます (オフセットまたはタイプが無効になる可能性があります)
当然のことながら、これをテストした後、冗長な glVertexAttribPointer 呼び出しはありませんでした。ただし、レンダリングが正しく機能しなくなったため、ロジックに欠陥があるに違いありません。私のキャッシュ戦略は熱心すぎて、必要な頻度で glVertexAttribPointer を再呼び出ししていないと考えました。次に、マテリアルが変更されるたびに (つまり、レンダリング状態が変更されるたびに) キャッシュを無効にしてみました。これにより、レンダリングは修正されましたが、冗長な呼び出しが返されました (ただし、以前よりは少なくなりました)。
最初のキャッシュ戦略で正しい軌道に乗っていますか?キャッシュを無効にする必要がある他の状況を特定するのを手伝ってくれる人はいますか?