0

基本的に、私のコードでは glDeleteTextures と glBufferData 関数をフックしています。テクスチャのリストとバッファのリストを保存します。バッファー リストには、チェックサムとバッファーへのポインターが保持されます。以下のコードは、データがグラフィックス カードに到達する前にインターセプトします。

Hook_glDeleteTextures(GLsizei n, const GLuint* textures)
{
    for (int I = 0; I < n; ++I)
    {
        if (ListOfTextures[I] == textures[I])       //??? Not sure if correct..
        {
            //Erase them from list of textures..
        }
    }

    (*original_glDeleteTextures)(n, textures);
}

そして、バッファに対しても同じことを行います。バッファとテクスチャを次のようなリストに保存します。

void Hook_glBufferData(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage)
{
    Buffer.size = size;
    Buffer.target = target;
    Buffer.data = data;
    Buffer.usage = usage;

    ListOfBuffers.push_back(Buffer);
    (*original_glBufferData(target, size, data, usage);
}

クライアントが削除するたびに削除する必要があります。これどうやってするの?デバッガーを使用しましたが、どのテクスチャーとバッファーが削除されているかを正確に認識しているようです。

私はそれを間違っていますか?渡されたポインタを反復処理してテクスチャを削除する必要がありますか?

4

1 に答える 1

1

他の方法で行う必要があることに気付きました。テクスチャ情報オブジェクトのリストを用意し、それらの 1 つを削除するときに、OpenGL を呼び出してテクスチャを削除します。ところで: OpenGL 呼び出しはグラフィックス カードではなくドライバーに送られ、テクスチャは GPU メモリに保存されず、システム メモリにスワップ アウトされる場合があります。

私はそれを間違っていますか?渡されたポインタを反復処理してテクスチャを削除する必要がありますか?

はい。プログラムでデータ管理をトリガーする OpenGL 呼び出しをインターセプトしないでください。1 つには、アクティブな OpenGL コンテキストも追跡する必要があります。しかし、もっと重要なことは、最初に OpenGL 呼び出しを行うのはあなたのプログラムです。また、プログラム/コンパイラ/CPU が統合失調症でない限り、最初にデータを追跡し、これに従って OpenGL オブジェクトを管理する方が簡単なはずです。また、テクスチャ イメージ データをキャッシュに保持し、それらのイメージの OpenGL テクスチャを現在は必要なく、近い将来必要になる可能性がある場合は削除するのが通常の方法です。

あなたのアプローチは基本的に裏返しです。カートを馬の前に置いています。

于 2012-12-18T09:29:45.143 に答える