2014-11-19 4 views
0

나는 점 구름 뷰어에서 일하고 있어요, 내 디자인은 두 개의 스레드 기반으로는더 빠른 스레드 블록 느린 스레드

  • 첫 번째 스레드 (약 10 FPS)
  • 초 스레드 포인트 클라우드 데이터를 업데이트 화면 (약 90 FPS)으로 설정 점을 렌더링하는 D3D 렌더러는

그래서 내 코드는 다음과 같습니다

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); 
     } 
    } 
} 

두 번째 스레드가 첫 번째 스레드보다 훨씬 빠르다는 생각이 들었습니다. 따라서 첫 번째 스레드가 임계 영역에 들어가면 두 번째 스레드가 차단되므로 렌더러 창이 지금 또는 그 후에 고정되어야합니다. 하지만 지금 당장 볼 수있는 것은 렌더러 창이 매우 부드럽게 돌아가거나, 카메라가 회전하거나 확대/축소하는 것입니다.하지만 첫 번째 스레드는 매우 불안정합니다. fps는 10fps에서 1fps까지 다양합니다.

두 점 클라우드 버퍼에 대해 생각하고 있는데, 첫 번째 스레드는 중요한 섹션 외부를 벗어날 때 두 번째 버퍼를 업데이트 한 다음 중요한 섹션 내에서 두 개의 버퍼를 교체합니다. 작동할까요?

+0

시도 할 때 무엇이 ​​잘못 되었습니까? –

+0

@KerrekSB 나는 그것을 얻지 못한다 ... – Clones1201

+0

당신의 질문은 "Will it?" 답례로 제 질문은 당신이 왜 그렇게 믿지 않는지에 대한 이유입니다. –

답변

0

this에서 언급했듯이 CRITICAL_SECTION은 선입 선출 (FIFO) 순서를 제공하지 않습니다. 두 번째 스레드는 첫 번째 스레드보다 훨씬 빠르며 전체 루프가 중요한 섹션이기 때문에 그대로두고 나면 핵심 섹션에 들어갑니다. 이것은 항상 중요한 부분에있을 수 있으며 첫 번째 부분을 그대로 유지합니다.

제 해결책은 중요한 섹션 외부에 두 번째 스레드의 작업을 추가하는 것입니다.