3

iOS / Androidゲームでパフォーマンスの問題が少し発生しており、いくつかのVBOを時々更新する必要があります。私のゲームをプロファイリングした後、glDeleteBuffers()はVBOの更新ごとに最大7msかかることがわかりました。もちろん、これにより、フレームのレンダリングに通常4ミリ秒しかかからない場合に問題が発生します。

VBOを更新する部分は次のとおりです。

Chunk* chunk;
pthread_join(constructionThread, (void**)&chunk);
building = false;

if (vboID)
{
    //takes 7 milliseconds
    glDeleteBuffers(1, &vboID); 
    vboID = 0;
}
if (offset)
{
    glGenBuffers(1, &vboID);
    glBindBuffer(GL_ARRAY_BUFFER, vboID);

    //takes about 1-2 milliseconds, which is acceptable
    glBufferData(GL_ARRAY_BUFFER, offset * 4, constructionBuffer, GL_STATIC_DRAW);
}

ここで、offsetはインスタンス変数であり、基本的には新しいVBOのサイズであり、かなり可変です。vboIDはそれ自体を物語っています、私は推測します;)

4

1 に答える 1

6

glGenBuffersおよびglDeleteBuffersは、それぞれ初期化とクリーンアップでのみ実行されるように設計されています。実行時にそれらを呼び出すのは悪いことです。

glBufferData現在のバッファデータを新しいデータセットに置き換えます。これにより、バッファのサイズが自動的に変更されます。glGenBuffers/もの全体を安全に削除し、glDeleteBuffers初期化とクリーンアップに移すことができます。

さらに、静的バッファーとしてバッファーを作成しています。これは、OpenGLに変更することはほとんどないことを示しているため、GPUでのアクセスは高速ですが、システムの他の部分からのアクセスは低速です。またはに変更GL_STATIC_DRAWしてみてください。詳細はこちら:http ://www.opengl.org/wiki/Buffer_Objects#Buffer_Object_UsageGL_DYNAMIC_DRAWGL_STREAM_DRAW

于 2012-05-26T19:07:46.770 に答える