2013-04-28 2 views
0

저는 Android에서 게임 개발을 해왔으며 단순히 GL 확장 라이브러리의 glDrawTexfOES 메서드를 사용하여 대부분의 드로잉을 수행 할 수있었습니다. 이것을 사용하여 스프라이트를 그리면 좋은 성능을 얻는 것처럼 보였고 비트 맵 글꼴로 사용할 때까지 아무런 불만도 없었습니다.OpenGL ES에서 동적 비트 맵 글꼴을 렌더링하는 최적의 방법

필자는 현재 비트 맵 글꼴을 설정 한 상태에서 글꼴 클래스를 초기화하기 위해 XML 파일에서 문자 정의, 질감 및 문자 속성을 읽습니다. 이러한 속성을 사용하면 glDrawTexfOES가 호출되고 요청 된 문자가 원하는 크기로 그려지고 크기가 조정될 수 있도록 서식이 지정됩니다. 더 작은 문자열에서는 잘 작동하지만 불행히도 glDrawTexfOES를 호출 할 때마다 하나의 문자를 별도로 호출해야합니다. 상상할 수 있듯이, 큰 문자열에 대해서는 눈에 띄는 지연 및 성능 문제가 발생합니다.

누구에게 내가 이것을 더 지능적으로 표현할 수있는 조언이 있습니까? VBO를 정적 객체의 큰 그룹에 사용하는 것에 대해 들었습니다. 그러나 이것이 동적이어야하는 텍스트를 갖는 유즈 케이스에 적절한 지 확실하지 않습니다. OpenGL ES와 비슷한 것을 구현 한 사람으로부터 조언을 많이 주시면 감사하겠습니다.

답변

0

코드의 리더링 속도를 향상시키는 데는 여러 가지 방법이 있습니다. glDrawTexfOES의 문서는 많은 세부 정보를 제공하지 않으며 조각에만 텍셀을 직접 매핑하는 것에 대해 언급하고 있으므로 사용중인 구현이 너무 최적화되어 있지 않으며 속도 문제의 주 원인입니다. OpenGL ES 1.1을 사용하고 있다고 가정).

내 제안은 glDrawTexfOES를 없애고 삼각형 스트립을 사용하는 사용자 정의 렌더링 기능으로 바꾸고 degenerate triangles을 사용하여 다른 스트립을 연결하는 것입니다.

1)는 정점 위치, 텍스처 좌표를 저장하는 버퍼를 생성하고, 일괄 적으로 삼각형을 그리는와 indices :

그것은 다음과 같이 작동한다. 각각의 글자는 두 개의 삼각형을 사용하여 그려지며 다른 세그멘테이션은 다른 글자와 연결하기 위해 사용되거나 무시됩니다.

2) 다음과 같은 알고리즘을 사용하여 퇴화 삼각형 만들기 : 모든 무승부는 1 단계에서 만든 버퍼를 호출

for (int k = 0; k < MAX_NUMBER_OF_LETTERS ; k++) 
{ 
    indices[k*6] = k*4; 

    for (int p=0; p<4; p++) 
     indices[k*6+p+1] = k*4+p; 

    indices[k*6+5] = k*4+3; 
} 

3) 일괄 당신은 glDrawArrays를 사용하여 렌더링 파이프 라인에 삼각형을 보낼 수 있습니다. 원하는만큼의 삼각형을 배치 할 수 있습니다. 렌더링 속도를 높이기위한 트릭은 OpenGL의 상태가 변경 될 때까지 glDrawArrays를 호출하는 것입니다 (바인드 된 텍스처 변경과 같음).

4) 분명히 texture atlas을 사용해야합니다.

일부 기본 2D 작업을 수행하는 경우 VBO를 수행하지 않는 것이 좋습니다. 이 경로는 1.1 대신 OpenGL ES 2.0으로 코드를 변경한다는 것을 의미하며 완전히 다릅니다.

관련 문제