2009-05-29 2 views
1

시스템 구성 요소 (IE, 렌더링, 물리, 논리, 입력, 스크립팅 등)를 다른 스레드로 분할하는 게임 아키텍처를 만드는 경우 실시간 통신 필수적이다?게임 개발에서 실시간 프로세스 통신

예를 들어, 스크립트가 화면에 상자를 그리려면, 렌더링 구성 요소가 "FrameDrawn"이벤트를 발행하여 상자가 화면 상단, 마지막에 그려지는 것이 이상적입니다 각 프레임 드로우의 스크립팅 구성 요소와 렌더링 구성 요소가 서로 다른 스레드에있는 경우 어떻게 가능합니까?

답변

1

대부분의 게임은 방대한 양의 데이터와 여러 스레드가 필요할 때 데이터의 일부 하위 집합을 참조합니다. 스레드 간의 통신은 거의 명확하지 않으며 일반적으로 암시 적이며 한 스레드로 인해 발생하는 데이터의 변경을 통해 이루어지며 나중에 두 번째 스레드에 의해 통지됩니다. 변경 사항은 뮤텍스, 세마포 또는 기타 저수준 동기화 프리미티브에 의해 보호됩니다.

예를 들어, 스크립팅 스레드는 GUI 구성 요소의 일부 데이터를 변경하고 다음에 GUI를 렌더링하는 렌더링 스레드는 새 데이터를보고 이에 따라 상자를 그립니다.

그러나 대부분의 게임 개발자는 너무 많은 데이터를 공유하고 정확성을 위해 낮은 수준의 잠금에 의존하는 모델로 효과적으로 처리하기가 어렵다는 점에 유의해야합니다. . 이상적으로 더 많은 게임 개발자는 소프트 리얼 타임 프리젠 테이션 응답 요구 사항으로 인해 데이터를 공유하지는 않지만 어려운 모델로 이동합니다.

0

당신이 요구하는 것은 실제로 가능하지 않습니다. 그래서 일반적인 규칙은 하나의 UI 스레드 만 갖는 것입니다. 다른 스레드가 화면에 무엇인가를 보여주고 싶다면 UI 스레드에 메시지를 보내야합니다. UI 스레드는 렌더링 될 때 메시지를 보여줍니다.

1

일반적으로 렌더링 스레드 만이 화면에 물건을 그릴 수 있습니다. 그러나 스레드가 통신 할 수 있기 때문에 스크립팅 스레드가 렌더링 스레드에 "이봐, 다음 프레임을 그려보고 싶다."라고 말할 수 있습니다.

우리 프로젝트가 스레드 통신을 처리하는 방식은 두 가지 방법 중 하나입니다. 동적으로 편집되는 무언가, 즉 객체 목록, 움직이는 차량 등을 위해 우리는 변경 될 때 데이터를 잠그는 뮤텍스를 만듭니다. 렌더러가 드로잉하려고하지만 업데이트 스레드가 해당 객체를 삭제하는 경우 렌더러는 기다려야합니다. ui와 같은 다른 것들을 위해서 우리는 ui 스레드에 의해 쓰여지고 렌더러에 의해 읽혀지는 전역 플래그를 가지고 있기 때문에 뮤텍스는 필요하지 않습니다.