1

こんにちは、Towerdefence にスレッドを追加して高速化しようとしましたが、現在はかなり遅いです。

コードの構造は非常に単純です

メインはsdl opengl initで始まり、すべてを初期化します。次にゲームループ。スレッド順序なし: 1:キーボードとマウスのイベントが最初 2:gameManager 3:drawGlScene

gameManager はすべてを計算します: モンスターの移動、モンスターの攻撃、攻撃アニメーションとサウンドの作成、勝敗のチェック、ウェーブが行われた場合、モンスターのスポーンと機能は、スピード モードがオンの場合に 2 回実行されます。その他の小さな機能。

描画関数は、すべてのデータを使用してすべてを描画します。描画機能内でのデータ変更はありません

私が使用するCPUはクアッドコアで、メインのビジュアル部分の最初のステップのinitスレッドのものです

int main ( int argc, char** argv )
{
 pthread_t t_engine;
 pthread_attr_t attr;
 pthread_attr_init(&attr);
 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

次に、他のすべての初期化とゲーム ループの開始が sdl イベント スイッチで開始されます (まだゲーム ループ内にあります)。

//calculate everything if we are in playing gamestate
    if(id == MODE_PLAY)
    {
        rc = pthread_create(&t_engine, &attr, gameManager, (void *)t);
        if (rc)
        {
            printf("ERROR; return code from pthread_create() is %d\n", rc);
            exit(-1);
        }
        //gameManager((void *)t);
    }

    //draw everything
    DrawGLScene();

if(id == MODE_PLAY)
    {
        rc = pthread_join(t_engine, &status);
        if (rc)
        {
            printf("ERROR; return code from pthread_create() is %d\n", rc);
            exit(-1);
        }
    }

ゲームマネージャー:

void *gameManager(void *t)
{
  //then lot of stuff
  //function ending like this
  pthread_exit((void*) t);
}

ps: 私は Windows 7 を使用しており、IDE はコードブロックであり、gnu gcc コンパイラを使用しています。

4

1 に答える 1

5

問題の説明からのこのビット:

その後、他のすべての初期化とゲームループの開始

pthread_create()/pthread_join()上記を実行するコードのスニペットはループで実行される と私は信じさせます。

その場合は、スレッドの作成/破棄を繰り返すとコストがかかることに注意してください。オブジェクトにゲームループを配置し、そのループを、セマフォ、条件変数、スレッドバリアなどを使用しgameMangerて実行するループと同期させることを検討する必要があります。DrawGLScene()同期手法としてスレッド終了を使用する以外のほとんどすべて。

于 2012-08-23T01:21:50.463 に答える