XNA 2D 게임 최적화


56

뷰포트 외부에서 객체 렌더링을 건너 뛰기 위해 로직을 구현하는 것이 합리적입니까? 아니면 신경 쓰지 않아야합니까?

답변:


79

컬링은 성능 최적화입니다. 따라서 단지 그것을 위해서만하는 것이 이치에 맞지 않습니다. 당신은 이유가 있어야합니다.


XNA 프레임 워크가 아닌 GPU는 매우 빠른 속도로 삼각형과 픽셀을 잘라냅니다. 제출하는 모든 삼각형은 반드시 정점 셰이더를 통해 변환되어야합니다. 그런 다음 화면에서 떨어지는 것을 제거합니다. 그런 다음 나머지 삼각형을 채우고 화면에서 벗어난 픽셀을 컬링합니다. 그런 다음 나머지 픽셀은 픽셀 셰이더를 통해 백 버퍼에 그려집니다.

(내가 "그런데"라고 말하면 실제로는이 모든 작업을 대규모 병렬 파이프 라인에서 수행합니다.)

따라서 개별 삼각형을 제거해야하는 경우는 매우 드물고 드문 경우입니다. 꼭짓점 한계에 도달하려면 터무니없이 많은 수의 삼각형을 그려야합니다. 채우기 속도, 텍스처 가져 오기 또는 픽셀 쉐이딩 한계에 도달하려면 일반적으로 심도 복잡성이 높아야합니다 (이 경우 뷰포트 / 절두체 컬링이 도움이되지 않음).


따라서 일반적으로 화면 외형을 만드는 데 비용이 거의 들지 않습니다.

특히 "객체"(일반적으로 3D 객체)를 그리는 맥락에서 비용은 실제로 해당 객체를 GPU에 처음 제출하는 데 있습니다 . 너무 많은 객체를 제출하면 배치 제한에 도달합니다 ( 프레임 당 수천 * 배치가 생성됨).

배치에 대한 자세한 설명은 이 답변 과이 링크 된 슬라이드 데크 를 읽는 것이 좋습니다 .

이 때문에 절두체 컬링을 구현하면 GPU에 제출하는 배치 수를 줄일 수 있습니다. 배치 제한이있는 경우 제한을 초과 할 수 있습니다.


이제 귀하의 질문은 2D XNA에 관한 것 SpriteBatch입니다. 이것은 조금 다릅니다.

"Sprite Batch " 라고하는 것은 실수가 아닙니다 . 그것이하고있는 일은 그리는 스프라이트를 가져 와서 배치하여 가능한적은 배치로 스프라이트를 GPU에 제출하는 것입니다.

그러나 SpriteBatch는 다음과 같은 경우 새 배치를 시작해야합니다.

  • 단일 배치에 맞을 수있는 것보다 더 많은 스프라이트를 그립니다 (XNA 4의 2048 스프라이트)
  • 텍스처를 변경합니다 (텍스처별로 정렬 옵션이있는 이유)

따라서 컬링은 첫 번째 방법을 사용하는 경우 적합한 최적화입니다. 너무 많은 배치로 끝나는 엄청난 수의 스프라이트를 전송하는 경우 (대역폭을 많이 사용하고 있지만 배치 제한에 먼저 도달 할 것이라고 확신합니다). 이것은 일반적으로 당신이 진정으로 거대한 세상을 가지고있을 때만 일어날 것입니다. 그래서 당신은 일반적으로이 경우에 매우 단순하고 빠르지 만 부정확 한 컬링을 피할 수 있습니다.

- 지금 당신이 충분히 배치 한도를 초과 당신을 데려 갈 수있는 텍스처 스왑, 함께 그리는 경우 그 중 많은 실제로 스크린 떨어져 있습니다 배치 제한에서 당신을 얻을 것이다 그들을 도태. 그렇다면 예-컬링은 작동하는 최적화입니다.

그러나이 경우 추구하는 더 나은 최적화는 텍스처 아틀라스 (일명 스프라이트 시트)를 사용하는 것입니다. 이를 통해 화면상의 내용 과 관계없이 텍스처 스왑 수와 배치를 줄일 수 있습니다 . 스프라이트에 소스 사각형을 지정할 수있는 주된 이유입니다.


(항상 항상 : 이것은 성능 최적화에 대한 조언입니다. 따라서 최적화를 추가하기 위해 노력하기 전에 게임 자체의 성능과 치는 한계를 측정하고 이해해야합니다.)


5
+1이를 위해 컬링을하지 말고 성능 문제가 필요할 때 언급하는 것에 대해.
Will Marcouiller

12
스프라이트 시트가 실제로 프로그래머 / 디자이너 편의 이외의 다른 이유가 있다고 말해줘 +1
Bill

3
훌륭한 설명을 위해 +1, 나는 당신의 대답에서 많은 것을 배웠습니다.
Jesse Emond

1
"배치, 배치, 배치"pdf 링크가 끊어졌습니다. 다음은 업데이트 된 것입니다 : ce.u-sys.org/Veranstaltungen/…
Marton

13

MSDN 포럼의 게시물에 따르면 XNA 프레임 워크는 절두체 컬링을 수행하지 않습니다.

XNA 프레임 워크는 절두체 컬링을 수행하지 않습니다. 실제로 어떤 결과가 나올지에 대한 단서가 없기 때문입니다. 모든 변형은 GPU에서 수행되며 사용자 지정 셰이더 일 수 있습니다.

http://xboxforums.create.msdn.com/forums/p/22763/121897.aspx

이 포스트는 장면에 많은 오브젝트가 있다면 자신의 롤링 가치가 있다고 말합니다.


6
특히 스크롤 맵이있는 경우 (2D라고 말하면 관련이있을 수 있습니다). 필요하지 않은 큰 섹션을 그리면 낭비입니다. 그것은 어렵지 않으며 어떤 종류의 개선을 볼 수 있습니다.
Michael Coleman

1

저는 XNA에서 몇 년 동안 절차 상 복셀 지형 엔진을 개발해 왔습니다. 대부분의 프레임에서 엔진은 문자 그대로 수십만 개의 쿼드를 변형시키고 있습니다. 프로파일 링에서 절두체와 폐색 제거가 성능을 향상시키는 것으로 나타났습니다.

XNA HiDef 프로파일 (Reach가 아님)에는 Occlusion Culling을 수행하는 데 사용되는 OcclusionQuery 클래스가 있습니다. 오 클루 전 컬링은 다른 쿼드에 의해 숨겨져있는 뷰포트에서 해당 쿼드를 제거합니다.

고려해야 할 다른 사항은 생성 및 테셀레이션을 개별적으로 처리하는 것입니다.

따라서 변환되는 각 프레임에서 매우 많은 수의 쿼드에 접근 할 때 gpu 셰이더로의 트래픽을 줄여 컬링 및 스레딩 기술을 적용하여 프레임 속도를 유지하는 방법을 신중하게 고려해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.