2012-10-14 136 views
1

我想讓我的代碼平行,但對於有經驗的人員有一些問題。DirectX渲染和OMP

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. 設置一個布爾「omp_deviceReady」來假,所以渲染將停止。
  2. 等待平行部分停止。
  3. 調整圖形緩衝區大小。
  4. 將「omp_deviceReady」設置爲true,以便再次發生渲染。
  5. 只要用戶調整窗口大小就重複。

2]由於我的OMP的代碼是CPU [約50%一致的沉重任務經理],什麼是處理並行渲染的好辦法?

+0

從我的編碼經驗看,準備緩衝區和單獨顯示緩衝區不是一個好主意。我應該使用多個交換鏈來查找。 – RandomClown

+1

您使用的是什麼版本的DirectX?根據API版本,多線程渲染技術可能會有很大差異。 – catflier

+0

Ohh,我正在使用DX 10/11 – RandomClown

回答

0

「OMP是不是太適合於MT渲染(OMP將更好地爲遊戲任務的並行處理)」 - Necrolis

「遞延上下文是一個很好的路要走......」 - catflier