目的は何ですか:
私はスレッド化に比較的慣れていません。高速かつ効率的にレンダリングされる Quad-Tree レンダリングされた地形を作成しようとしています。現在レンダリングされている地形の量は、すべてが最大のディテールである場合、ユーザーに大きな遅れをもたらします。これが、レンダリングに QuadTree を使用した理由です。エンジンは入力と物理演算もサポートしているため、レンダリング スレッドを使用することにしました。これは多くの問題を引き起こしました。
問題: スレッド化していないとき、エンジン内の他のシステムが原因で少しラグがありました。遅延の主な原因は、QuadTree での地形の読み込みと削除です (これが最適な方法かどうかはわかりません)。現在、レンダリングは非常に高速に行われ、遅延はないようです。カメラが静止している場合、ゲームは正常に実行されます。ゲームを 1 時間実行したままにしましたが、クラッシュは見つかりませんでした。
地形が読み込まれると、レンダリング コードが使用するいくつかの変数が使用されます。つまり、バッファをバインドします-
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), &vertices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), &normals[0], GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, uvbuffer);
glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(glm::vec2), &uvs[0], GL_STATIC_DRAW);
この変数は、他のスレッドと同時にアクセスされていると思います。これはクラッシュを引き起こします。これをどのように修正しますか?Mutexes を使用してみましたが、うまくいかないようです。これを修正するには、どこでミューテックスをロックおよびロック解除しますか?
同じエラーの原因と思われる別の変数は「IsLeaf」です。
大量の地形をロードした後、別のクラッシュ (std::badAlloc) が発生します。掃除中なのに。これは私の削除コードによるものだと思いますが、何が悪いのかわかりません。
私が現在タイルを追加および削除する方法は、カメラからの範囲を確認し、タイルを削除/作成することです。私がいるタイルとその周りのタイルをレンダリングしたい。ただし、これは 4 つのメイン タイルの 1 つから移行する場合には機能しません。小さいタイルではなく大きいタイルの中心までの範囲であるため、範囲を使用して作成することはできません。また、数秒ごとにマップ全体を削除しようとしましたが、これもうまくいくようですが、ラグが大きくなります。作成と破棄を行うためのより良い方法はありますか?
異なる解像度の間にはギャップがあります。これらを減らす方法はありますか?現在、タイルを必要以上に大きくレンダリングしていますが、これは主要な解像度の変更には役立ちません。
これらのエラーのいずれかを修正する方法があれば、非常にありがたいです。
コード (ここにアップロードするには多すぎます)