1

コードを並列化したいのですが、経験者にいくつか質問があります。

1]このようなことをするのは良い考えですか?

#pragma omp parallel num_threads(2)
{
    const int threadID=omp_get_thread_num();
    if(threadID==0) while(WM_QUIT != msg.message){ // < Engine stuff
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }else{
            engine.omp_renderPrepare();
        }
    }
    if(threadID==1) while(WM_QUIT != msg.message){ // < Render stuff
        engine.omp_renderApply();
    }
}

// Functions from the engine class:
inline void omp_renderPrepare(){
    if(gDevice.omp_isReady()){
#pragma omp critical(renderPrepare)
        if(!omp_rendering){
            omp_sceneReady=0;
            renderPrepare();
            omp_sceneReady=1;
        }
    }else{
        Sleep(42); // If the device is not ready, dont spam.
    }
}
inline void omp_renderApply(){
    if(gDevice.omp_isReady()){
#pragma omp critical(omp_renderApply)
        if(omp_sceneReady){
            omp_rendering=1;
            renderApply();
            omp_rendering=0;
        }
    }else{
        Sleep(42); // If the device is not ready, dont spam.
    }
}

すでに適用しましたが、CPUに負担がかかり、ウィンドウのサイズを変更すると、コードのクロールが遅くなります。

  1. bool "omp_deviceReady"をfalseに設定して、レンダリングを停止します。
  2. 並列セクションが停止するのを待ちます。
  3. グラフィックバッファのサイズを変更します。
  4. 「omp_deviceReady」をtrueに設定して、レンダリングを再度実行できるようにします。
  5. ユーザーがウィンドウのサイズを変更する限り、繰り返します。

2]私のOMPコードはCPUに重いので[タスクマネージャーに約50%一致]、パラレルレンダリングを処理するための良い方法は何ですか?

4

1 に答える 1

0

「OMPはMTレンダリングにはあまり適していません(OMPはゲームタスクの並列処理に適しています)」– Necrolis

「遅延コンテキストは良い方法です...」– catflier

于 2012-10-18T07:47:54.717 に答える