2014-03-05 11 views
2

Android 4.3 애플리케이션에서 로컬 png의 텍스처를 TextureView로로드하고 싶습니다. OpenGL을 모르며 GLTextureActivity 하드웨어 가속 테스트 코드를 사용하고 있습니다. 나는 두 장치의 코드를 실행하고일부 기기에서 OpenGL ES 2.0이 느린 Android 드로잉 텍스처

private int loadTexture(int resource) { 
     int[] textures = new int[1]; 

     glActiveTexture(GL_TEXTURE0); 
     glGenTextures(1, textures, 0); 
     checkGlError(); 

     int texture = textures[0]; 
     glBindTexture(GL_TEXTURE_2D, texture); 
     checkGlError(); 

     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

     Bitmap bitmap = BitmapFactory.decodeResource(mResources, resource); 

     GLUtils.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap, GL_UNSIGNED_BYTE, 0); 
     checkGlError(); 

     bitmap.recycle(); 

     return texture; 
    } 

: 넥서스 7와 갤럭시 넥서스 전화를, 나는 둘 사이에 큰 속도 차이를 느낄 여기 또한 로딩 텍스처 부분을 붙여 넣기하고있다. Nexus 7의 경우 드로어 부분은 약 170ms가 걸리지 만, 갤럭시 넥서스의 경우 459ms가 걸립니다. 시간이 많이 걸리는 작업은 텍스처로드이며 특히 texImage2D 호출입니다. 나는 그 장치가 느린 칩을 갖고 있다고 읽었습니다. texImage2D - texSubImage2D 함수는 어떻게 그 장치인지를 알 수 있고, 같은 결과를 얻기 위해 어떻게 그러한 함수를 사용하지 않아도됩니까?

미리 감사드립니다.

// 편집 : glDrawArrays(GL_TRIANGLE_STRIP, 0, 4) 전화도 전화 장치에서 상당히 느린 것 같습니다. 왜 이런 일이 일어나는 걸까요? 나는 그것을 어떻게 피할 수 있습니까?

+0

FWIW, Grafika (https://github.com/google/grafika)에 'glTexImage2D()'타이밍 테스트를 추가했습니다. 대부분의 기기에서 512x512 RGBA 텍스처 업로드를 비교하는 간단한 방법이 있습니다. – fadden

답변

1

각 프레임마다 텍스처를로드합니까? 그건 좋지 않습니다. 메인 렌더링 루프 전에 텍스처를 한 번만로드해야합니다. 가능한 가장 빠른 장치에서도 즉석 텍스처를로드하지 않습니다. 리소스를로드하고 비트 맵을 디코딩 한 다음 GPU에로드합니다. 이것은 약간의 시간이 걸립니다.

+0

loadTextures() 메서드를 수정하여 작업이 초기화 시간에 완료되고 각 프레임마다 다시 호출하는 작업이 GLUtils.texImage2D 인 경우 드로잉이 필요하므로 여러 비트 맵을 그릴 필요가 있으므로 여러 PNG를 그릴 필요가 있습니다. 때마다. 잘못인가? 어떻게 그럴 수 있니? 예를 들어 프레임이 SurfaceTexture의 카메라 또는 미디어 플레이어에서 나오는 경우 어떻게 더 빨리됩니까? – drgr

+0

'texImage2D()'는 리소스를 많이 소비하는 작업입니다. 소스 비트 맵을 처리하여 GPU에 업로드합니다. '인스턴트'작업과는 거리가 멀다. 'loadTexture()'메소드를 변경할 필요가 없다. GPU에 적합한 텍스처를 많이 가질 수 있습니다. 배열이나 정수 컬렉션을 만들고 메인 렌더링 루프 전에 모든 텍스처 ID ('loadTexture()'에서 반환)를 저장 한 다음 유니폼을 통해 필요한 ID 만 쉐이더에 전달하십시오. – keaukraine