2010-05-14 4 views
0

저는 여러 프로젝트에서 사용되는이 2 차원 타일 기반 게임 엔진을 제작 해 왔습니다.OpenGL에서 여러 개의 쿼드를 그리는 가장 효율적인 방법

나는 주로 키가 어디에 화면의 타일을 렌더링하는 표시하는 것입니다

Dictionary<Point, Tile> 

점의로 구성되어있다 "ScreenObject"라는 클래스를 가지고 있고, 타일로 하나 개 이상의 텍스처를 포함 그 시점에서 그려졌다. 이 ScreenObject는 타일이 수정, 삭제, 추가되는 곳입니다.

필자가 해본 테스트에서 타일을 그리는 원래의 방법은 ScreenObject를 반복하고 각 위치에서 각 쿼드를 개별적으로 그렸습니다. 읽은 바에 따르면 이것은 엄청난 자원 낭비입니다. 테스트에서 끔찍한 속도는 아니었지만 애니메이션 수업과 효과 수업을 마친 후에는 매우 느릴 것이라고 확신합니다.

마지막으로 한 가지만 생각해도 괜찮습니다. 앞서 말했듯이, Tile 클래스는 화면의 Point 위치에 그려지는 여러 텍스처를 포함 할 수 있습니다.

아마도 여기에 두 가지 옵션이 있습니다. 그려지는 각 텍스처에 대해 해당 위치에 쿼드를 추가하거나, 어떻게 든 동일한 쿼드에 대해 여러 텍스처를 사용합니다 (가능한 경우). 각 타일에 텍스처가 하나만 포함되어 있어도 64 개의 쿼드가 화면에 그려집니다. 대부분의 타일에는 2-5 개의 텍스처가 포함되므로이 방법을 사용하면 전체 쿼드 수가 크게 늘어납니다. 각각의 새로운 텍스처에 대해 쿼드를 추가하는 것이 타당할지, 아니면 더 나은 방법을 무시하고 있습니까?

답변

0

사전을 사용하는 것이 단지 직선 배열을 사용하는 것보다 느릴 것이라고 생각합니다. 귀하의 세계가 512x512 타일로 구성되어 있다면 배열 길이 512x512 (262144)를 할당하십시오. Y 배열은 "array [x + (y * 512)]"를 사용하여 해당 배열의 타일을 가져올 수 있습니다.

얼마나 많은 타일이 있는지 알고 계시므로 각 타일이 해당 위치의 타일을 가리키거나 목록의 타일에 대한 인덱스를 갖습니다. (아마도이 ​​방법으로 메모리를 절약 할 수 있습니다. 타일 ​​크기가 65536보다 작거나 심지어 256 인 경우에도 인덱스를 16 비트로 저장합니다.

그런 다음 렌더링 할 영역을 찾으십시오. 가능한 한 텍스처를 바꾸지 마십시오. 그래서 타일의 크기가 큰지 확인하기 위해 먼저 텍스처의 크기를 1 개의 큰 텍스처로 결합하려고 시도합니다. 그런 다음 자외선을 설정하여이 부분의 샘플을 채우십시오 큰 텍스쳐를 사용하면 몇 개의 큰 텍스쳐로 텍스처의 수를 제한 할 수 있습니다. 물론 당신은 bly는 주어진 타일 세트 (예를 들어 바위 같은 곳)가 동일한 텍스처 그룹을 사용한다는 것을 알 수 있습니다. 어딘가에 풀을 섞을 수도 있습니다. 너무 많은 텍스쳐 스왑을 피하기 위해 큰 텍스쳐 모두에서 잔디 텍스처를 유지할 가치가 있습니다. 즉 속도를 위해 비디오 메모리를 희생합니다.

그런 다음 배열의 보이는 부분을 반복하고 텍스처 1을 사용하여 모든 타일을 그린 다음 텍스처 2를 사용하여 모든 타일을 그립니다.

0

삼각형 + 색인으로 구성된 단일 VAO 개체를 사용하는 것이 좋습니다. 클라이언트 측에서 위치를 계산하고 각 프레임 (스트리밍)에서 업데이트하십시오.

텍스처 아트라스를 사용하여 모든 것을 단일 텍스처로 저장합니다 (전환 상태를 방지하기 위해). 텍스처 패커 도구를 사용할 수 있습니다.

한 번에 렌더링 (깊이 버퍼가 활성화 된 경우). 그렇지 않으면 첫 번째 오브젝트를 불투명하게 렌더링 한 다음 블렌딩해야 할 모든 것을 렌더링합니다.