2012-10-28 2 views
3

저는 안드로이드에서 Java로 openGL ES 2 게임을 만들고 있습니다.3 안드로이드 쓰레드, 구조체

현재 두 개의 스레드가 있습니다. 안드로이드 UI와 OpenGL.

내가 아는 한 최고의 성능을 얻으려면 게임 논리를위한 다른 스레드가 있어야하므로 가능한 빨리 OpenGL 스레드를 렌더링 할 수 있습니다.

이렇게하면 안드로이드 UI, OpenGL 및 Game Logic이 3이됩니다. (의는 UI, OGL 및 GL을 부르 자.) 내가 틀렸다면

이 날 수정 :

UI가 시작은 OGL 및 GL한다. OGL 및 GL이 실행되어 입력 UI를 쿼리합니다. GL은 OGL의 대기열에 그리기 호출을 보냅니다.

두 가지 경우가 있습니다. GL이 OGL보다 반복하는 데 시간이 오래 걸리면 OGL의 다음 루프는 마지막 프레임 호출의 절반 만 렌더링하는 것을 피하기 위해 GL이 끝날 때까지 기다렸다가 다음 루프를 시작해야합니다. OGL이 GL보다 오래 걸리는 경우 GL은 OGL이 완료 될 때까지 기다렸다가 다시 시작하거나 더 많은 그리기 호출을 보내야합니다.

는이를 달성하기 위해 :

GL이 완료 될 때의 루프와 그것이 연신 호출 현재 큐 드로잉 끝났다 OGL 있는지 검사한다. 그렇다면 GL 및 OGL의 다음 루프를 시작합니다. 그렇지 않은 경우 기다립니다.

OGL이 완료되면 GL을 검사합니다. GL이 완료되면 두 루프가 다시 시작됩니다. 그렇지 않으면 GL을 기다리고, 완료되면 OGL을 검사하고 다시 시작합니다. 이 방법의 워크 아웃 인걸요 누워 일 :

diagram http://img840.imageshack.us/img840/2816/stackoverflowthredpictu.jpg

나에게 질문을 명확히하려면 :이 혼동 말로 조금 경우

내 생각을 illistrate하려면 ..

죄송합니다? - 그렇지 않으면 무엇이 더 좋을까요?

-What 특정 과목을 수행해야합니까? - 나는 스레드를 만드는 방법이나 스레드간에 정보를 보내는 방법을 모릅니다.

처음 질문을 묻는 질문입니다. 제대로 해 주셨으면합니다. :) 감사!

+1

OpenGL에 익숙하지 않지만 Android의 일반적인 멀티 스레딩은'AsyncTask'를 피하고 Android' Handler'에서 표준 Java Runnable을 사용하는 것이 가장 좋습니다. –

답변

0

- 이런 식으로 물건을 내놓을까요? - 그렇지 않다면 더 잘 될까요?

예,하지만이 전략은 필요한 것보다 더 복잡 할 수 있습니다. 두 스레드가 서로 기다려야 할 때 교착 상태가되는 것은 쉽습니다.

난 당신이 RENDERMODE_WHEN_DIRTY를 사용할 수 있다고 생각 :

해당 모드에서
setRenderMode(RENDERMODE_WHEN_DIRTY); 

, 당신의 렌더러 (1) 표면을 만들거나 (2) requestRender() 전화 만 프레임을 렌더링합니다.따라서 게임 논리 스레드는 queueEvent() (또는 비슷한)을 호출하여 드로어 호출을 렌더러에 푸시 한 다음 게임 논리 루프가 끝날 때 requestRender()을 호출합니다. 그것의 것을

여전히 게임 로직 스레드가 끝까지 렌더링을 기다릴 필요하다고 생각한다면, 당신은합니다 (Semaphorerelease()를 호출하여) 렌더러 신호 때까지 차단합니다 게임 논리 스레드에서 Semaphore를 만들 수 있습니다 프레임 렌더링을 완료했습니다.

면책 조항 : 게임 개발자는 아니지만 잘하면이 방법을 통해 탐색 할 수있는 길을 제시합니다.

관련 문제