0

マルチスレッドのゲーム エンジンを作成していますが、スレッドの待機に関するベスト プラクティスについて疑問に思っています。私が実装したものよりもはるかに優れたオプションがそこにある可能性があると思います。

オプション A)「wait()」メソッドは、クラス内の他のすべてのメソッドの先頭で呼び出されます。これは私の現在の実装であり、理想的ではないことを認識しています。

class Texture {
public:
    Texture(const char *filename, bool async = true);
    ~Texture();

    void Render();

private:
    SDL_Thread *thread;
    const char *filename;

    void wait();
    static int load(void *data);
}

void Texture::wait() {
    if (thread != NULL) {
        SDL_WaitThread(thread, NULL);
        thread = NULL;
    }
}

int Texture::load(void *data) {
    Texture *self = static_cast<Texture *>(data);

    // Load the Image Data in the Thread Here...

    return 0;
}

Texture::Texture(const char *filename, bool async) {
    this->filename = filename;
    if (async) {
        thread = SDL_CreateThread(load, NULL, this);
    } else {
        thread = NULL;
        load(this);
    }
}

Texture::~Texture() {
    // Unload the Thread and Texture Here
}

void Texture::Render() {
    wait();

    // Render the Texture Here
}

オプション B)「wait()」メソッドを関数ポインタに変換します。これにより、他のすべてのメソッドの先頭にある jmp からプログラムを保存し、すべてのメソッドの先頭にある "thread != NULL" をチェックするだけです。まだ理想的ではありませんが、ジャンプが少ないほど良いと感じています。(関数で「インライン」キーワードを使用することも検討しました...しかし、本当に必要なのは「if(スレッド!= NULL)」チェックだけである場合、これには待機関数の内容全体が含まれますかどうかを判断します残りのコードを実行する必要がありますか?)

オプション C)すべてのクラスのメソッドを関数ポインタに変換し、実際にテクスチャをロードする間を除き、「wait()」を呼び出すという概念全体を捨てます。このアプローチには長所と短所があります...つまり、これは実装と追跡が最も難しいと感じています。確かに、GCC の最適化とアセンブリ、特にメモリ -> CPU -> メモリ通信に関する内部の仕組みに関する私の知識は最善ではないため、関数ポインタの束を使用すると、実際には適切に定義されたクラスよりも遅くなる可能性があります。

誰にももっと良いアイデアがありますか?

4

1 に答える 1