2016-12-23 3 views
-3

투명한 오버레이에서 데이터 표현을 효율적으로 렌더링하는 방법을 만드는 데 문제가 있습니다. 모든 것이 효과적이지만 실용적이지는 않습니다.채우기/렌더링 스레드를 효율적으로 설정

현재 엔티티의 링크 된 목록을 반복하고 있습니다. 끊임없이 업데이트되기 때문에 명확한 끝은 없지만 20k에서 100k 개의 고유 한 개체가 포함되어 있습니다. 내 조건과 일치하는 엔티티를 std :: vector에 추가합니다. 현재 끝점 (마지막 링크가 처음으로 되돌아가는 지점)으로 간주되면 TryEnterCriticalSection을 사용하고 내부에서는 렌더링 스레드에서 사용할 벡터 사본을 만듭니다. 그런 다음 벡터를 지 웁니다.

내 렌더링 스레드에서 다시 TryEnterCriticalSection을 실행하고 벡터 복사본의 엔티티를 렌더링합니다. 완료되면 나는 그것을두고 시작 온통.

내 문제는 내 오버레이가 자주 깜박이며 부드럽게 추적하지 않는다는 것입니다.

이것은 내가 뭘하려고하는지 개념적으로 끔찍한 방법입니까?

+1

에 오신 것을 환영합니다. [The Tour] (http://stackoverflow.com/tour)를 읽으신 후 [Help Center] (http://stackoverflow.com/help/asking)의 자료를 참조하십시오. 여기에 물어보십시오. –

+0

만약 당신의 문제를 해결할 수 있을지 모르겠지만, 당신은 명확하게 사본을하기보다는 두 벡터에서 std :: swap()을 수행하여 크리티컬 섹션에서 보내는 시간을 크게 줄일 수있다. (std :: swap()은 단순히 벡터의 모든 데이터의 O (N) 복사본을 수행하는 대신 두 개의 내부 포인터를 스왑합니다) –

답변

0

귀하는 귀하의 목록이 지속적으로 업데이트되고 있다고 귀하는 씁니다. 다른 스레드에서 업데이트 된 경우 목록을 뮤텍스 또는 중요 섹션으로 보호해야합니다. 그렇지 않으면 스레드 읽기가 데이터를 느슨하게하거나 예외를 throw 할 수 있습니다. 예를 들어 : 는 업데이트 스레드에서 전역 객체
mutex m;

만들기 :

m.lock(); 
UpdateList(); 
m.unlock(); 

읽기 스레드에서 : 스택 오버플로하는

m.lock(); 
// loop through list, create vector 
// enter critical section, update vector for render thread, leave critical section 
m.unlock();