별도의 스레드에서 장면 그래프


12

나는 재미를 위해 나만의 게임 엔진을 개발한다. 한 스레드에서 렌더링하고 다른 장면 그래프 (업데이트 등)를 업데이트했습니다. 렌더링 할 때 렌더 스레드는 가시적 노드를 새로운 선형 버퍼에 추가하고 순회합니다.

더 자세하게, 내 장면 그래프는 3 중 버퍼입니다. 씬 그래프의 각 노드에는 상대 및 절대 변환 행렬 (4x4)의 세 복사본이 있습니다. 주어진 시간에, 하나의 사본은 장면 그래프 스레드에 의해 기록되고, 하나의 사본은 렌더러에 의해 판독되고, 다른 하나는 판독기 또는 기록기가 다른 것을 기다리지 않고 다음으로 진행할 수 있도록 존재한다. 이것은 렌더링되는 동안 무언가에 쓰지 않고 반 업데이트 된 장면 그래프를 렌더링하는 것을 방지합니다. 어떻게 든 사용자가 업데이트 스레드와 충돌하지 않도록 작업 할 수 있도록 각 매트릭스의 네 번째 사본을 얻었습니다. 이것은 항상 동기화하지 않아도 잘 수행되는 것 같습니다.

그러나 이것은 혼란입니다.

이것이 시스템의 궁극적 인 목표입니다.

  • 렌더링 및 장면 그래프 업데이트는 별도의 스레드에 유지됩니다.
  • 이 스레드가 서로를 얼마나 기다려야하는지 최소화하십시오.
  • 업데이트 스레드에 의해 반쯤 업데이트 된 장면을 렌더링하지 마십시오. 이것은 카메라가 빠르게 움직이고 때로는 업데이트 전후에 렌더링되는 경우 특히 두드러집니다.
  • 메모리 사용량 감소 노드 당 너무 많은 행렬이 있습니다. 또한 행렬로 부동 소수점 드리프트가 증가하여 위치 / 회전 / 스케일을 위해 벡터로 이동하는 것을 고려하고 있습니다.
  • 수만 개의 노드를 처리 할 수있는 기능. 현재 시스템은 이것을 합리적으로 잘 수행합니다.

또한 미래에는 Bullet (물리 엔진)과 네트워킹을 통합하려고합니다.

더 나은 장면 그래프를 달성하기위한 몇 가지 방법은 무엇입니까?

답변:


4

"Pace"와 렌더러에 대한 Johannes Spohr의 논문을 읽었습니까? 소위 "제출 엔진"* 병렬 렌더러를 설명하고 몇 가지 아이디어를 줄 수 있습니다.

여기에 (독일어) 요약 페이지이며, 여기에 영어로 PDF에 대한 직접 링크입니다.

( * :이 링크 는 내가 논문에 대해 처음 들었던 기사로 이동합니다.)

편집 : 나는 이것을 이전에 훑어 보았고 방금 다시 보았고 장면 그래프 세부 사항에 대해 정말 광택이 있음을 깨달았습니다. 나는 그의 디자인이 얼마나 직각인지 몰랐다. 특별히 도움이되지 않으면 죄송합니다.


1
이 논문의 한 장은 여전히 ​​저에게 붙어 있습니다. "사실, 응용 프로그램은 장면 그래프가 전혀 없다는 것을 알지 못합니다. 데이터 모델의 변경 사항을 알려주는 뷰 구성 요소 만 알고 있어야합니다." 이것은 나에게 새로운 생각을 불러 일으켰다. 나는 전체 장면을 세 번 버퍼링 할 필요가없고, 현재 카메라를 통해 보이는 것만 볼 수있다. 컬링을 렌더 스레드에서 씬 그래프 스레드 (카메라가있을 때)로 옮길 수 있으며, 언제든지이 세 가지 버퍼 중 하나를 사용하여 렌더러가 읽을 수 있습니다.
EricP

1
또한 Game Engine Gems 1의 "멀티 스레드 렌더링을위한 카메라 중심 엔진 설계"기사 및 관련 "DirectX 9 및 DirectX 10을 사용한 실용적인 병렬 렌더링" -microsoft.com/downloads/en/…
Neverender

1
Game Engine Gems 1은 온라인에서 무료로 제공되는 것 같습니다 : books.google.com/…
EricP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.