私はポイントクラウドビューアで作業しています、そして私のデザインは2つのスレッドに基づいています
- 最初のスレッドは点群データを更新します(約10 fps)
- 2番目のスレッドは、ポイントセットをスクリーンにレンダリングするD3Dレンダラです(約90 fps)。
だから私のコードはこのようになります:
std::shared_ptr<PointCloud> pointcloud;
CRITICAL_SECTION updateLock;
void FirstThreadProc()
{
while(true)
{
/* some algorithm processes point cloud, takes time */
EnterCriticalSection(&updateLock);
pointcloud->Update(data,length,...); //also takes time to copy and process
LeaveCriticalSection(&updateLock);
}
}
/*...*/
std::shared_ptr<D3DRenderer> renderer;
void SecondThreadProc()
{
MSG msg = { 0 };
while (WM_QUIT != msg.message)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
EnterCriticalSection(&updateLock);
renderer->Render(pointcloud);
LeaveCriticalSection(&updateLock);
}
}
}
2本目のスレッドはもっともっと多いと思いました最初のものよりも速いので、最初のものがクリティカルセクションに入ると、2番目のものはブロックされます。しかし、私が今注目しているのは、レンダラウィンドウが非常に滑らかに動作し、カメラの回転やズームイン/ズームアウトがうまくいっていることです。
2つのポイントクラウドバッファについて考えているのですが、最初のスレッドがクリティカルセクションの外側にあるときに2番目のバッファを更新してから、クリティカルセクション内で2つのバッファを交換します。
回答:
回答№1は0前述したように このCRITICAL_SECTIONは先入れ先出しでは提供されません。先入れ先出し(FIFO)順序付け。 2番目のスレッドは最初のスレッドよりもはるかに高速であり、そのループ全体がクリティカルセクションであるため、終了後すぐにクリティカルセクションに入ります。これは常にクリティカルセクションにあり、そのうちの最初のセクションを除外します。
私の解決策は、クリティカルセクションの外側に2番目のスレッドのより多くの仕事を置くことです、そしてそれはうまく機能します。