제 2D 게임에서 큰지도가 있고 주위에 스크롤됩니다 (Age of Empires에서와 같이).화면 경계 외부의 그림이 성능에 영향을 줍니까?
그리기에서 나는 모든 요소 (텍스처/이미지)를 그립니다. 그들 중 일부는 화면에 있지만 대부분은 그렇지 않습니다 (지도의 약 10 %를보기 때문에).
XNA는 대상 사각형이 화면에 표시되지 않는지 확인하여 그리지 않는지 알고 있습니까?
아니면 수동으로 확인하고 전혀 그리지 않아야합니까?
제 2D 게임에서 큰지도가 있고 주위에 스크롤됩니다 (Age of Empires에서와 같이).화면 경계 외부의 그림이 성능에 영향을 줍니까?
그리기에서 나는 모든 요소 (텍스처/이미지)를 그립니다. 그들 중 일부는 화면에 있지만 대부분은 그렇지 않습니다 (지도의 약 10 %를보기 때문에).
XNA는 대상 사각형이 화면에 표시되지 않는지 확인하여 그리지 않는지 알고 있습니까?
아니면 수동으로 확인하고 전혀 그리지 않아야합니까?
수동으로 계정해야하며 게임이 커질 때 게임의 성능에 크게 영향을 미칩니다. 이는 달리 컬링 (culling)이라고도합니다. 스크린에서 그림을 그리는 것이 성능을 떨어 뜨리기 때문에 컬링은 수행되지 않습니다. 많은 여분의 시간이 느리다고 Draw
을 호출하기 때문입니다. 뷰포트 외부에있는 업데이트 할 필요가없는 항목은 모두 제외해야합니다. 이를 수행하는 방법과 SpriteBatch
이 here을 어떻게 처리하는지 자세히 볼 수 있습니다.
가끔 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.
왜 그는 그것을하지 않습니까? – OopsUser
당신이 나에게 준 링크에서, 만약 그가 하나의 배치로 처리 할 수있는 것보다 더 많은 스프라이트를 가지고있을 때만 도둑질 할 필요가 있다고 쓰여졌지만, 그가 그릴 지 여부를 묻는 질문에 대답하지 않는다. – OopsUser
그렇지 않다. 그것은 GPU에 데이터를 전달할 것이고 기본적으로 화면 밖에서 무엇이 빠져 나올 것입니다. 이론적으로 화면의 경계를 벗어난 드로잉은 성능을 떨어 뜨리는 것이 아닙니다. 그러나 각 프레임의 스프라이트 배치에 수천 회의 Draw 명령을 호출하면 한계를 초과하고 프레임 속도가 저하됩니다. – Sarkilas