2010-11-28 2 views
0

저는 현재 Replica Island에서 영감을 얻은 디자인을 사용하여 Android에서 게임을 작성하고 있습니다. 즉, 이중 스레드 방식, 하나의 논리 스레드 및 하나의 렌더링 스레드입니다.Android 동시 렌더러 디자인

나는 경량 스레드가 로직 스레드에 앉아서 렌더링 할 수있는 게임 개체를 처리 할 수 ​​있도록 설정했다. "render sprite f at x, y"와 같이 렌더링 스레드에 렌더링 명령을 보냅니다.

저는이 디자인이 마음에 들지만 현재 나를위한 문제는 리소스 생성에 있습니다. sprite f가 텍스처를 필요로한다고 말하면,로드시 로직 쓰레드에서 요청할 것입니다. 문제는 OpenGL 컨텍스트가 렌더링 스레드에 있기 때문에 렌더러 스레드에서만 텍스처를 생성 할 수 있다는 것입니다. 현재 논리 스레드와 렌더 스레드 사이의 유일한 동기 포인트는 프레임의 끝에서 렌더링 대기열을 교환 할 때이며, 나는 그런 식으로 유지하고 싶습니다.

렌더링 스레드에서 렌더링하는 동안 논리 스레드에서 텍스처를 만들려는 문제, vbo 's 등을 어떻게 해결할 수 있습니까? OpenGL 컨텍스트를 공유하는 것이 좋은 방법일까요? 아니면 엔진의 다른 디자인일까요?

편집 : 하나의 대안은 논리 스레드의 요청을 넣을 다른 큐를 갖는 것입니다. "텍스쳐 생성"과 같습니다. 렌더링 쓰레드는 다른 큐를 렌더링하기 전에이 큐를 반복 처리합니다. 나는이 해결책을 좋아하기 시작했다.

답변

2

OpenGL은 렌더링 스레드에서 glBindTexture를 호출해야합니다. GLSurfaceView.Renderer onSurfaceCreated 메서드 (렌더링 스레드에서 호출)에서 바인딩하는 것이 좋습니다. GL 문맥이 다시 만들어지면 모든 것을 다시 바인딩하기 위해 다시 호출됩니다.

다른 스레드에서 구동하도록 선택한 경우 GLSurfaceView 객체에서 queueEvent를 호출하여 렌더링 스레드를 실행 파일에 전달하십시오. onSurfaceCreated가 아직 전화되지 않은 경주를 조심하십시오.

게임에 행운을 비네!