2012-12-28 2 views
1

편집 : 세 개의 타일 레이어가 전체 화면을 채우는 경우에도 150+ fps를 얻었으므로 두 번째 방법을 선택했습니다.XNA에서 2D 타일 게임 렌더링을 최적화하는 좋은 방법은 무엇입니까?

EDIT 2 : 정점 버퍼 오브젝트에 대해 많이 읽었고 정적 지오메트리에 얼마나 유용할까요? 2D 타일을 VBO로 변환하고 GPU 메모리에 저장하는 방법은 아직 모릅니다. 다른 누군가가 정적 인 기하학/쿼드를 빠르게 렌더링 할 방법을 찾고 있다면 이동하는 것처럼 보입니다.

저는 Super Meat Boy와 같은 게임을 만들고 배열 목록에 레벨 타일을 저장하고 렌더링해야하는지 카메라 경계 범위 테스트를 수행하는 것이 더 빠르고 더 빠른지 궁금합니다.

foreach(Tile tile in world.tiles) { 
    if(Overlap(camera.bounds, tile)) 
     render(tile); 
} 

또는 2 차원 배열은 모든 그리드 광장을 저장하는 것입니다 만 더 나은 카메라 경계 사이에 떨어져 읽기?

int left = (int)(camera.position.x - camera.width/2); 
int right = (int)(camera.position.x + camera.width/2) + 1; 
int top = (int)(camera.position.y - camera.height/2); // WHY XNA DO YOU UPSIDE DOWN!!! 
int bottom = (int)(camera.position.y + camera.width/2) + 1; 
for(int x = left; x < right; x++) { 
    for(int y = top; y < bottom; y++) { 
     render(world.tiles[x][y]); 
    } 
} 

카메라는 후자의 방법을 사용하여 읽으면 2300 개 홀수 타일하지만 레벨의 모든 타일 나아와 중복 검사를하고 화면에 64 개 * 36 타일을 맞출 수? 인접한 타일을 더 큰 쿼드에 결합하고 질감을 반복하는 것에 대한 대답을 읽었습니다. (텍스처 아트 라이트를 사용하고 있기는하지만 텍스처에서 영역을 반복하는 방법을 모르겠습니다.)

건배!

+0

렌더링은 무엇입니까? Spritbatch 시작/끝내기를 원하십니까? –

+0

2D 렌더링 용 카메라는 무엇이 필요합니까? – kunjee

+0

@Cyril ALFARO Yeh 일괄 처리 시작과 끝은이 루프 전후입니다. – Mazk1985

답변

0

내 과거 경험에 비추어 볼 때 세부 사항을 공유 할 수 있습니다. 2D 맵에서, 보통 맵은 0 - N과 같습니다. 이제 N은 화면 크기보다 훨씬 길다. 이제는 처음에 모든 것을 한 번에로드하려고했습니다. 그러나 그것은 약간의 오버 헤드입니다. 좋아, 그것은 매우 오버 헤드와 같았다. 그리고 나는 0FPS로 오래갑니다. 나는 다른 종류의 물건을 원한다. 따라서 동일한 객체를 반복하고 메모리를 절약하더라도 작동하지 않습니다. 그런 다음 화면을 참조하여 경계를 잡으려고했습니다. 따라서 객체는 거기에 있지만 렌더링되지 않습니다. 그래서, 그것은 그리기 파이프 라인에서 멀리 이동합니다. 그리고 인생을 다시 게임.

이제 C# 4.0의 성능 향상을 위해 TPL과 비동기를 사용할 수 있으며 그리기를 기다리고 있습니다. 그것은 스레딩의 더 나은 버전과 같습니다. 그래서 물건을 던져 버리고 의지대로 렌더링 할 수 있습니다.

XNA 또는 기타 그래픽 라이브러리와 거래합니다. 완벽한 그래픽 렌더링 파이프 라인이 있습니다. 그리고 그것은 모든 것을 훨씬 느리게 만듭니다. 특히 PC가 오래된 경우에만 64MB 그래픽 카드 만 가지고 와이드 스크린 만 지원할 수 있습니다. 당신의 게임은 어떤 종류의 기계에 배치 될 것입니다.

그래서 XNA의 언어로 설명하면 업데이트는 간단한 코드이며 최대한 빨리 실행하십시오. 중지 할 것이 없습니다. 그러나 무승부에는 앞서 완전한 파이프 라인이 있습니다. 그리고 그것이 시작과 끝이있는 유일한 이유입니다. 그래서, 끝나면 파이프 라인으로 물건을 밀어 넣을 수 있습니다. [여기] (http://classes.soe.ucsc.edu/cmps020/Winter11/readings/hlsl.pdf) 기사를 참조하십시오.

여기 파이프 렌더링이 필요하지만 렌더링 속도가 느리고 차단되어야 할 필요는 없습니다. 그냥 멀티 스레드로 만들면 모든 것이 훨씬 빠를 것입니다. 좀 더 간결하게하려면 링크 된 목록과 물건을 포함하여 C#을 최대한 사용해야합니다. 그러나 그것은 마지막 단계와 같을 것입니다.

답변을 드릴만큼 세부 사항을 알려 주시기 바랍니다. 더 자세한 정보가 필요하면 알려주십시오.

관련 문제