이것은 오래된 게시물이지만 여전히 팝업이므로 여기에 2 센트를 추가하고 싶었습니다.
먼저 UI / 디스플레이 스레드 대 로직 스레드에 저장해야하는 데이터를 나열하십시오. UI 스레드에는 3D 메쉬, 텍스처, 라이트 정보 및 위치 / 회전 / 방향 데이터 사본이 포함될 수 있습니다.
게임 로직 스레드에서는 3D 게임 경계 크기, 경계 기본 요소 (구체, 큐브), 단순화 된 3D 메시 데이터 (예 : 자세한 충돌), 객체 속도, 회전 비율 등과 같은 움직임 / 동작에 영향을 미치는 모든 속성이 필요할 수 있습니다. 또한 위치 / 회전 / 방향 데이터.
두 목록을 비교하면 위치 / 회전 / 방향 데이터의 사본 만 로직에서 UI 스레드로 전달해야 함을 알 수 있습니다. 이 데이터가 속한 게임 오브젝트를 결정하기 위해 일종의 상관 관계 ID가 필요할 수도 있습니다.
작업 방법은 작업중인 언어에 따라 다릅니다. Scala에서는 Java / C ++에서 일종의 잠금 / 동기화에 소프트웨어 트랜잭션 메모리를 사용할 수 있습니다. 나는 불변의 데이터를 좋아하므로 매번 업데이트 할 때마다 새로운 불변의 객체를 반환하는 경향이 있습니다. 이것은 약간의 메모리 낭비이지만 현대 컴퓨터에서는 그렇게 큰 문제가 아닙니다. 여전히 공유 데이터 구조를 잠 그려면 할 수 있습니다. Java에서 Exchanger 클래스를 확인하십시오. 두 개 이상의 버퍼를 사용하면 속도가 향상 될 수 있습니다.
스레드간에 데이터를 공유하기 전에 실제로 전달해야하는 데이터의 양을 계산하십시오. 3D 공간을 분할하는 옥트리가 있고 10 개의 객체 중 5 개의 게임 객체를 볼 수있는 경우 논리가 10 개를 모두 업데이트해야하더라도 현재보고있는 5 개만 다시 그려야합니다. 자세한 내용은 다음 블로그를 참조 하십시오.
http://gameprogrammingpatterns.com/game-loop.html
이것은 동기화에 관한 것이 아니라 게임 로직이 디스플레이에서 분리되는 방법과 극복해야 할 과제 (FPS)를 보여줍니다. 도움이 되었기를 바랍니다,
표