1

ここに画像の説明を入力

目的は何ですか:

私はスレッド化に比較的慣れていません。高速かつ効率的にレンダリングされる 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 つから移行する場合には機能しません。小さいタイルではなく大きいタイルの中心までの範囲であるため、範囲を使用して作成することはできません。また、数秒ごとにマップ全体を削除しようとしましたが、これもうまくいくようですが、ラグが大きくなります。作成と破棄を行うためのより良い方法はありますか?

異なる解像度の間にはギャップがあります。これらを減らす方法はありますか?現在、タイルを必要以上に大きくレンダリングしていますが、これは主要な解像度の変更には役立ちません。

これらのエラーのいずれかを修正する方法があれば、非常にありがたいです。

コード (ここにアップロードするには多すぎます)

http://pastebin.com/MwXaymG0

http://pastebin.com/2tRbqtEB

4

1 に答える 1

5

OpenGL コンテキストは、(Windows では wglMakeCurrent() を介して) 一度に 1 つのスレッドにのみバインドできます。

したがって、Mutex を使用してメモリ内の特定の変数へのアクセスを保護したとしても、スレッド間で gl* 関数を使用しないでください。呼び出しは失敗します。

gl* 呼び出しをレンダリング スレッドに移動することをお勧めします。レンダリング スレッドは、オブジェクトに新しいデータがあるかどうかを確認し、その更新/レンダリングの一部として適切な GL 呼び出しを実行するだけで済みます。

于 2013-08-19T12:23:51.377 に答える