2013-10-20 3 views
3

제 2D 게임에서 큰지도가 있고 주위에 스크롤됩니다 (Age of Empires에서와 같이).화면 경계 외부의 그림이 성능에 영향을 줍니까?

그리기에서 나는 모든 요소 (텍스처/이미지)를 그립니다. 그들 중 일부는 화면에 있지만 대부분은 그렇지 않습니다 (지도의 약 10 %를보기 때문에).

XNA는 대상 사각형이 화면에 표시되지 않는지 확인하여 그리지 않는지 알고 있습니까?

아니면 수동으로 확인하고 전혀 그리지 않아야합니까?

답변

5

수동으로 계정해야하며 게임이 커질 때 게임의 성능에 크게 영향을 미칩니다. 이는 달리 컬링 (culling)이라고도합니다. 스크린에서 그림을 그리는 것이 성능을 떨어 뜨리기 때문에 컬링은 수행되지 않습니다. 많은 여분의 시간이 느리다고 Draw을 호출하기 때문입니다. 뷰포트 외부에있는 업데이트 할 필요가없는 항목은 모두 제외해야합니다. 이를 수행하는 방법과 SpriteBatchhere을 어떻게 처리하는지 자세히 볼 수 있습니다.

+0

왜 그는 그것을하지 않습니까? – OopsUser

+0

당신이 나에게 준 링크에서, 만약 그가 하나의 배치로 처리 할 수있는 것보다 더 많은 스프라이트를 가지고있을 때만 도둑질 할 필요가 있다고 쓰여졌지만, 그가 그릴 지 여부를 묻는 질문에 대답하지 않는다. – OopsUser

+0

그렇지 않다. 그것은 GPU에 데이터를 전달할 것이고 기본적으로 화면 밖에서 무엇이 빠져 나올 것입니다. 이론적으로 화면의 경계를 벗어난 드로잉은 성능을 떨어 뜨리는 것이 아닙니다. 그러나 각 프레임의 스프라이트 배치에 수천 회의 Draw 명령을 호출하면 한계를 초과하고 프레임 속도가 저하됩니다. – Sarkilas

6

가끔 SpriteBatch을 사용하면서 CPU 성능에 대한 간과 된 개념은 스프라이트를 일괄 처리하는 방법입니다. 드로어 블 게임 구성 요소를 사용하면 스프라이트를 효율적으로 일괄 처리 할 수 ​​없습니다.

기본적으로 스프라이트를 그리는 GPU는 느리지 않습니다. & 모든 스프라이트를 일괄 처리하는 CPU의 속도가 느리지 않습니다. 느린 부분은 CPU가 그리는 데 필요한 것을 GPU에 전달해야 할 때입니다 (배치 정보를 보냅니다). 이 CPU 대 GPU 통신 spriteBatch.Draw()으로 전화하면이 발생하지 않습니다. spriteBatch.End()으로 전화하면 문제가 발생합니다. 효율을 높이는 열매가 부족한 경우 spriteBatch.End()을 자주 호출하지 않습니다. (물론 이것은 Begin()을 자주 호출하지 않는 것을 의미합니다). 또한 즉시 spriteSortMode.Immediate을 사용하면 CPU가 각 스프라이트 정보를 GPU로 보내 게됩니다 (느리게). 각 게임 구성 요소 클래스에 Begin() & End() 전화, 많은 구성 요소가 그렇다면

, 당신은 불필요하게 자신에게 많은 시간을 요하고, 당신은 아마 오프 스크린 스프라이트에 대한 걱정보다 더 나은 배치 계획을 세우는 시간을 절약 할 수 .

별도 : GPU는 픽셀 쉐이더의 오프 스크린 스프라이트를 자동으로 무시합니다. 따라서 CPU에서 오프 스크린 스프라이트를 도려내면 GPU 시간이 절약되지 않습니다.

참고 here.

관련 문제