나는 재미를 위해 나만의 게임 엔진을 개발한다. 한 스레드에서 렌더링하고 다른 장면 그래프 (업데이트 등)를 업데이트했습니다. 렌더링 할 때 렌더 스레드는 가시적 노드를 새로운 선형 버퍼에 추가하고 순회합니다.
더 자세하게, 내 장면 그래프는 3 중 버퍼입니다. 씬 그래프의 각 노드에는 상대 및 절대 변환 행렬 (4x4)의 세 복사본이 있습니다. 주어진 시간에, 하나의 사본은 장면 그래프 스레드에 의해 기록되고, 하나의 사본은 렌더러에 의해 판독되고, 다른 하나는 판독기 또는 기록기가 다른 것을 기다리지 않고 다음으로 진행할 수 있도록 존재한다. 이것은 렌더링되는 동안 무언가에 쓰지 않고 반 업데이트 된 장면 그래프를 렌더링하는 것을 방지합니다. 어떻게 든 사용자가 업데이트 스레드와 충돌하지 않도록 작업 할 수 있도록 각 매트릭스의 네 번째 사본을 얻었습니다. 이것은 항상 동기화하지 않아도 잘 수행되는 것 같습니다.
그러나 이것은 혼란입니다.
이것이 시스템의 궁극적 인 목표입니다.
- 렌더링 및 장면 그래프 업데이트는 별도의 스레드에 유지됩니다.
- 이 스레드가 서로를 얼마나 기다려야하는지 최소화하십시오.
- 업데이트 스레드에 의해 반쯤 업데이트 된 장면을 렌더링하지 마십시오. 이것은 카메라가 빠르게 움직이고 때로는 업데이트 전후에 렌더링되는 경우 특히 두드러집니다.
- 메모리 사용량 감소 노드 당 너무 많은 행렬이 있습니다. 또한 행렬로 부동 소수점 드리프트가 증가하여 위치 / 회전 / 스케일을 위해 벡터로 이동하는 것을 고려하고 있습니다.
- 수만 개의 노드를 처리 할 수있는 기능. 현재 시스템은 이것을 합리적으로 잘 수행합니다.
또한 미래에는 Bullet (물리 엔진)과 네트워킹을 통합하려고합니다.
더 나은 장면 그래프를 달성하기위한 몇 가지 방법은 무엇입니까?