각 문자에 고유 한 VBO를 주어야합니까 아니면 단일 VBO로 배치해야합니까?


10

3D 1 인칭 게임을 만들고 있습니다. 각 문자에 고유 한 VBO를 제공해야합니까, 아니면 모든 문자를 단일 VBO로 일괄 처리해야합니까? 장단점은 무엇입니까?


이것은 중복 질문입니다. 무엇을, 나는 확실하지 않지만, 속임수입니다.
DeadMG

그것은 비슷 다른 질문에 deformables에 대한 반면,하지만 난 그게 당 자체 중복 시작을 위해, 있다고 생각하지 않는다, 이것은 오픈 GL은 (특정 차이가 있는지 잘 모르겠어요)입니다 DirectX11 (따라서 테셀레이션을 사용하는 것으로 추정 됨).
토마스 러셀

답변:


11

이것은 실제로 성능과 유연성 사이의 선택이지만 이에 대한 의견을 제시하겠습니다.

하나의 단일 VBO

긍정적 인면은 다음과 같습니다.

  • 한 번의 호출로 장면을 그립니다. 성능 이 향상 됩니다. 응용 프로그램에 여러 번의 그리기 호출이 필요할 수 있지만 여전히 단일 VBO를 가질 수 있으며 카운트와 오프셋으로 그리기를 결정할 수 있습니다.
  • 객체 사이의 상태 변경이 필요하지 않습니다. 성능 이 향상 됩니다.

그리고 부정적인면은 다음과 같습니다.

  • 관리하기가 어렵지만, 코드가 올바르게 설계된 경우 코드 작성 방법에 따라 다릅니다.
  • 관리하기 어렵다고 말하면 VBO 업데이트, 모든 객체 등에 올바른 오프셋 설정 등을 의미합니다.

개별 VBO : s

긍정적 인면은 다음과 같습니다.

  • 구현하기 쉽습니다.
  • 처음부터 쉽게 관리 할 수 ​​있습니다.

그리고 부정적인면은 다음과 같습니다.

  • 많은 상태 변경. 성능이 저하됩니다.
  • 많은 무승부 전화. 성능이 저하됩니다.

요약

응용 프로그램을 프로파일 링하는 것이 좋습니다. 볼 수있는 데이터에서 실제 병목 현상이 발생합니다. 조기 최적화는 (이 경우) 불필요한 것으로 표시 될 수 있습니다. 그러나 개별 VBO 시나리오 시나리오에서 애플리케이션에서 실제 성능 손실을 발견 하면 단일 VBO 구현을 시작할 수 있습니다.

그러나 필요하지 않은 한 (개체 수가 적거나 상태가 전반적으로 많이 변경되지 않는 등) 개별 VBO와 함께 사용하는 것이 좋습니다.

편집하다

여러 번의 그리기 호출로 괜찮을 것이라고 언급하지 않았습니다. 성능 결정 시간에서 가장 중요한 것은 상태 변경을 최소로 유지하는 것입니다. 처리 할 인덱스 수와 모든 드로우 콜에 대한 오프셋을 간단히 설정할 수 있습니다. 그러나 상태 변경을 가능한 한 낮게 유지하고 가능한 한 적은 호출을하십시오. 이 답변 의 가장 큰 인사 이거나 적어도 내가 말하려고 한 것입니다.


드로우 콜을 1 회만 수행하면 정점이 아닌 메시 당 상태 변경 (균일 등)으로 인해 스크류가 발생합니다. 또한 모든 것을 그리도록 모두 또는 전혀 강제하지 않습니다. 물론 VBO 다중 드로우 콜이 1 회만 가능하도록 분류 할 수 있지만 새 메시를 추가하려면 어떻게해야합니까?
감속

1
@Daniel : 새로운 메시를 VBO에 간단히 업데이트 / 추가해야합니다. 여러 번의 그리기 호출로 괜찮을 것이라고 언급하지 않았습니다. 성능 결정 시간에서 가장 중요한 것은 상태 변경을 최소로 유지하는 것입니다. 처리 할 인덱스 수와 모든 드로우 콜에 대한 오프셋을 간단히 설정할 수 있습니다. 그러나 상태 변경을 가능한 한 낮게 유지하고 가능한 한 적은 호출을하십시오. 이 답변 의 가장 큰 인사 이거나 적어도 내가 말하려고 한 것입니다. :-)
Wroclai

2005 년의 배치, 배치, 배치 는 드로우 콜만 처리하여 CPU에 완전히 바운드되기 전에 1GHz CPU에서 10k 및 25k 배치를 감당할 수 있다는 결론에 도달했습니다. 60Hz 프레임 당 수백 개의 배치로 변환되므로 모든 것을 단일 VB에 배치하는 것이 중요하지는 않지만 유사한 특성 (수명, 업데이트 속도, 속성)을 가진 형상을 동일한 VB에 묶는 것이 도움이됩니다.
Lars Viklund

1
나는 절두체 컬링도 고려해야한다고 생각합니다.
타라
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.