2013-10-15 3 views
0

나는 렌더링을 위해 Directx 9를 사용하는 게임 엔진을 가지고 있습니다. 주요 업데이트 및 렌더링 루프가 실행되는 동안 스프라이트 그래픽을로드 할 수 있기를 원합니다. 현재 엔진에는 하나의 메인 업데이트와 렌더 루프가 있기 때문에로드가 완료되면 메인 루프가 일시 중지되고 그래픽이로드됩니다.directx에 로더 스레드를 만드는 방법

이 작업을 수행하기 위해 POSIX 스레드를 찾고있었습니다. 스레드 함수를 생성하고 뮤텍스 잠금을 포함 시켰지만 코드 실행시 충돌이 발생합니다.

void GameApp::InternalThreadEntry() 
{ 
    pthread_mutex_lock (&mutex); 

    for(int i = 0; i < MAX_NUMBER; i++) 
    { 
     test_loader_sprites[i].loadImage(window1,"Test_Image.tga"); 
    } 

    has_finishd_loading = true; 

    pthread_mutex_unlock (&mutex); 
} 

코드 기능을 렌더링 내 엔진에 충돌 : 여기

스레드 기능입니다. 메인 애플리케이션이 렌더링을 위해 액세스하는 동안 window1 인스턴스의 멤버 인 directx 디바이스가 스레드에 의해로드되기 때문에이 것이 확실합니다.

어디가 잘못 됐는지 좀 밝혀 줄래? 새로운 스레드를 사용합니다.

는 마틴

+0

다이렉트 X 9 디바이스는 올바른 작성 플래그'D3DCREATE_MULTITHREADED'를 제공하지 않는 한 스레드로부터 안전하지 않습니다. 성능이 크게 떨어지게되는 것은 물론 나쁜 생각입니다. 가장 좋은 조언은 모든 d3d API 호출을 단일 스레드로 유지하는 것입니다. – galop1n

답변

0

스레딩은 종종 양 의류 늑대 최고 모든. 그것은 많은 문제를 해결하는 것처럼 보이지만 실제로는 해결할 수있는 것보다 더 많은 문제를 일으킬 수 있습니다. 다행스럽게도 많은 스레드가 추가 스레드를 사용하는 유효한 시나리오를 믿을 수 있습니다.

비슷한 로더를 직접 작성 했으므로 문제는 실제로 다른 곳에서 사용중인 Window1에 액세스하고있는 것입니다. 기본적으로 스레드가 실행되는 동안 주 스레드는 Window1에서 아무 것도하지 않습니다. 그렇다면 문제가되는 것입니다.

해결책은 데이터 저장소를 렌더러에서 적절하게 분리하는 것이 었습니다. 스레드의 저장소에 데이터를로드 할 수 있습니다. 이 작업이 끝나면 저장소의 해당 정보를 스레드 끝의 주 스레드로 전달합니다 (또는 나중에 주 스레드에서 직접 이동). 이렇게하면 스레드 내 Window1 개체에 대한 종속성을 피할 수 있습니다.

더 큰 규모의 시나리오를 시작하기 전에 스레드에 대한 추가 읽기를 수행하는 것이 좋습니다. 스레드로 작업하는 것은 소프트웨어 디자인의보다 까다 롭고 복잡한 영역 중 하나이며, 경험을 통해 충분히 배울 수 없습니다.

+0

조언 해 주셔서 감사합니다. 나는 그걸 막을 수 있었다. 내 probelem은 mutex를 공유하지 않은 주 스레드였다. 메인 스레드와 로더 스레드 사이에 공유 뮤텍스를 추가했습니다. 나는 관련 장소에서 공유 뮤텍스를 잠 그거나 잠금을 해제하고 충돌을 멈췄다. 작은 그래픽의 렌더링과 업데이트는 내 그래픽이로드되는 동안 계속 수행됩니다. 작은 성공, 내가해야 할 일, 그리고 쓰레드를 적절하게 처리하는 것 등이 훨씬 필요합니다. –

관련 문제