2010-03-23 6 views
6

Android Java & OpenGL ES 앱에서 텍스처를로드하는 데 좋은 패턴을 조언 할 수 있는지 궁금합니다.Android OpenGL ES 앱에 텍스처로드하기

첫 번째 관심사는 할당 할 텍스처 이름을 몇 개 결정하고 정점 렌더링에 앞서 효과적으로 수행 할 수있는 방법입니다.

두 번째 우려는 텍스처를로드하는 데 있습니다. 내 게임 데이터를 기반으로로드 할 텍스처를 추론해야합니다. 이것은 내가 GL 스레드에서하지 말아야 할 것을 이해하는 문자열로 놀고 있음을 의미합니다.

전반적으로 텍스처를로드 할 때 일어나는 일을 이해합니다. 단지 최상의 라이프 사이클을 얻고 싶습니다. 내가 고려해야 할 다른 것들이 있습니까?

답변

14

1) 필요한만큼 텍스처 이름을 할당해야합니다. 사용중인 텍스처마다 하나씩.

텍스처를로드하는 것은 렌더링 파이프 라인을 지연시키는 매우 과중한 작업입니다. 따라서 게임 루프 내에 텍스처를로드해서는 안됩니다. 텍스처를 렌더링하는 응용 프로그램 상태보다 먼저 로딩 상태 여야합니다. 로딩 상태는 렌더링에 필요한 모든 텍스처를로드합니다. 따라서 지오메트리를 렌더링해야 할 때 모든 텍스처가로드되고 더 이상 걱정할 필요가 없습니다.

텍스처가 더 이상 필요하지 않으면 glDeleteTextures를 사용하여 텍스처를 삭제해야합니다.

2) 서로 다른 레벨이나 다른 유사한 텍스처가 필요하다는 추론을하는 경우로드 상태의 레벨 데이터를 처리하고로드해야하는 텍스처를 결정해야합니다.

한편, 텍스트 (현재 점수와 같은)를 그릴 필요가 있다면, OpenGL에서 더욱 복잡한 일이 발생합니다. 다음과 같은 옵션이 있습니다 : 필요한 텍스트를 텍스처에 미리 렌더링하거나 (쉽게), 자신 만의 비트 맵 글꼴 엔진을 구현하거나 (더 세게) 비트 맵 및 캔버스 쌍을 사용하여 즉석에서 텍스처를 생성 할 수 있습니다.

게임 중에 표시 할 메시지가 제한되어 있다면 구현이 매우 사소하기 때문에 텍스처에 미리 렌더링하는 것이 좋습니다.

현재 점수에는 0에서 9까지의 숫자에 대한 글리프 (glyph)가있는 텍스처를 사용하고 임의의 값을 렌더링하는 데 사용할 수 있습니다. 구현은 매우 간단합니다.

더 이상 현지화 된 텍스트가 필요한 경우 즉시 텍스처 생성에 대해 생각해보십시오. 기본적으로 캔버스를 사용하여 텍스트를 렌더링하는 비트 맵을 만듭니다. 그런 다음이를 텍스처로 업로드하고 다른 텍스처로 렌더링합니다. 더 이상 필요하지 않으면 삭제할 것입니다. 이 옵션은 느리며 응용 프로그램 루프 내부에서는 피해야합니다.

3) 질감에 관해서는 GPU를 최대한 활용하려면 적어도 다음과 같은 사항을 염두에 두어야합니다 (이러한 것들은 조금 더 고급화 될 것입니다. 응용 프로그램을 얻은 후에 만 ​​신경 써야합니다. 프레임 속도를 최적화해야하는 경우) :

  • 느린 작업이므로 텍스처 변경을 최소화하십시오. 최적으로 배치의 동일한 텍스처를 사용하여 모든 객체를 렌더링해야합니다. 그런 다음 텍스처를 변경하고 객체가 렌더링되어야합니다. 등이 필요합니다.
  • 텍스처의 수를 최소화하기 위해 텍스처 아틀라스를 사용하십시오. (텍스처 변경)
  • 많은 텍스처가있는 경우 모든 텍스처를 메모리에 맞게 만들려면 8888 이상의 다른 비트 심도를 사용해야 할 수도 있습니다. 비트 심도를 낮추면 성능이 향상 될 수도 있습니다.
+2

"로딩 상태"라고 말하면, 렌더러를 초기화하는 것과 동시에 그 상태가 유지 될까요? 현재 내 생각은 내 장면 그래프를 초기화하고 장면 그래프의 모든 개체에 요청할 텍스처를 쿼리하도록하는 것입니다 (게임 모델의 이름을 추측하도록 함으로서). 텍스처를 요청한 각 객체는 요청 된 텍스처의 해당 OpenGL 정수 "이름"과 함께 제공됩니다. 소리가 나는 것처럼 보입니까? –

+2

상태 시스템을 사용하여 고급 응용 프로그램 논리를 모델링하고 싶습니다. 따라서 용어는로드 상태입니다. 나머지 초기화 작업을 수행하는 동시에이 작업을 수행하는 것이 좋습니다. 애플리케이션 로직을 어떻게 디자인 할 것인가의 문제 일뿐입니다. 그래서 소리가 들립니다. – Lauri

2

이것은 라 우리의 대답에 설명해야하지만, 내가 한 담당자와 말씀 드릴 수 없습니다, 그리고 지적해야 일이있다 :

당신은해야 다시로드 텍스처 마다이 EGL 컨텍스트가 손실됩니다 (예 : 응용 프로그램이 백그라운드로 돌아 왔을 때). 따라서로드 할 올바른 위치는 메서드에 있습니다.

public void onSurfaceChanged(GL10 gl, int width, int height) 

렌더러에 있습니다. 물론 게임 레벨에 따라로드 할 텍스처 세트가 다르면 레벨을 변경할 때 사용하지 않을 텍스처를 삭제하고 새 텍스처를로드해야합니다. 또한 EGL 컨텍스트가 손실 될 때 다시로드해야하는 항목을 추적해야합니다.