2011-08-08 6 views
1

Android OpenGL ES 응용 프로그램에 오버레이를 추가하려고하는데 현재 ImageView를 지정하고 SurfaceViewOverlay API 데모에서 코드 작업을하면서 내가 작성한 두 응용 프로그램을 효과적으로 병합합니다. 캔버스 기반이고 하나는 OpenGL ES입니다.OpenGL ES를 통한 Android ImageView 오버레이 예기치 않은 동작

두 프로젝트를 병합하기 때문에 많은 양의 복사 붙여 넣기가 있었고 실수로 널 서피스 홀더를 사용하게되었습니다. 놀랍게도 이것은 효과가 있었지만 많은 경고를 던졌습니다. 그러나 OpenGL 패널의 서페이스 홀더로 변경하면 응용 프로그램이 멈추고 OpenGL 또는 ImageView의 내용이 표시되지 않습니다.

나는 확실히 내가 무엇을 초기화되지 않은 확인하기 위해 코드와 함께 놀았 곳과 HTC의 욕망과 삼성 갤럭시 (모두 2.2을 실행)

Canvas c = null; 
SurfaceHolder surfaceHolder2D = null; // this works but throws occational Null Pointer exceptions on the first canvas.drawText 
//SurfaceHolder surfaceHolder2D = rsurfaceHolder; // this locks the application. 
//rsurfaceHolder is initialized with getHolder() in the opengl class and this worked with both when they where separate. 
//The change to ImageView was to get around issues with multiple SurfaceViews in an application having indeterminate Z order 

try 
{ 
    if (Global.RUNNING == 1) 
    { 
     c = surfaceHolder2D.lockCanvas(null); // when canvas is null this line can be ommited and it still works 
     synchronized (surfaceHolder2D) 
     { 
      rpanel2D.onDraw(c); 
     } 
    } 
    else 
     sleep(1000); 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 
finally 
{ 
    if (c != null) 
    { 
     surfaceHolder2D.unlockCanvasAndPost(c); 
    } 
} 

그래서 지구에 무슨 일이 모두에서 동작을 확인 계속하고 이것을 수행하는 올바른 방법은 무엇입니까? 나는 널 캔버스에 쓸 때 컴파일러가 무언가를하고 그것을 올바른 위치로 보내고 있다고 가정하고있다.

여러 가지 이유로 안드로이드의 여러 버전에서 작동한다는 것을 믿지 않는 등 여러 가지 이유 때문에 실제로는 옵션이 아닙니다. 로그에 상당한 프레임 속도 저하가있는 지속적인 경고 스트림이 넘쳐 흐릅니다. 각 호출에서 onDraw가 무효화되면 작동합니다. 이 단지는 this.invalidate()

호기심 새로운 캔버스를 만들고 그 드로잉 및 무효화하려고 또는 setImageResource를 사용하여 canvas.drawText를 사용하는 onDraw는 기능에 관해서는

(신규 또는 널 (null)와 중)는 "CalledFromWrongThreadException : 뷰 계층 구조를 만든 원래 스레드 만 해당 뷰를 만질 수 있지만 null 캔버스로 그리는 것은 불가능합니다." 이에 대한 답변으로 ImageView가 업데이트를 중지 한 직후에 몇 초 동안 작동하지만 OpenGL 스레드에서 호출되도록이 객체를 이동했습니다. 드로우 중입니다. 카운터가 디스플레이에 표시되어 있지 않아도 증가했음을 확인하기 위해 카운터에 넣은 이후로 여전히 호출 중입니다. 오버레이를 숨기고 다시 표시하면 몇 초 동안 다시 작동합니다.

도움을 주시면 감사하겠습니다. 내가 잘못된 길로 빠져있다면 알려주세요. 나의 대안은 이것을 BMP로 렌더링하고, 새로운 텍스처를 만들어 쿼드로 그려 넣는 것이지만, 수천 개의 텍스처로 인해 수분의 문제가 발생할 것이라고 생각합니다.

미리 감사드립니다. -K

답변

1

당신이 달성하려고하는 것이 확실하지 않습니다 - 두 렌더링이 모두 OpenGL을 사용하면 더 좋지 않습니까? 다른 방법이 없다고 가정하면 FrameLayout을 만들고 두보기 (GLSurfaceViewImageView)를 추가하는 것이 좋습니다. UI 스레드에서 UI 요소를 변경해야하는 경우 GL 스레드에서 요소를 변경하면 오류가 발생합니다. 따라서 반드시 runOnUiThread Runnable 내부에서 변경하십시오.

+0

안녕 MichalisB, 이것은 거의 끝까지가는 길 이었지만 순수한 OpenGL로 돌아갈 수도 있습니다. 로우 엔드와 하이 엔드 디바이스 모두에서 빠르게 실행해야하는 동적 UI 무거운 OpenGL 애플리케이션을 구축하려고했습니다. HTC Desire는 너무 많은 쿼드를 밀어 내면서 프레임 속도가 떨어지는 것을 경험합니다. 따라서 캔버스를 겹쳐서 1/5 초마다 업데이트하면 시간이 좋은 아이디어처럼 보일뿐입니다. 현재 그것은 모든 프레임을 안드로이드 루퍼의 일부로 업데이트하여 성능을 절반으로 줄이지 만, 나중에 내가 할 수있는 것을 보게 될 것입니다. 고마워요 – Kactus

+0

2D 렌더링을 어떻게하는지 모르겠다. 이미이 작업을 해본 적이 있다면 줄일 수 있지만 최적화를 시도해 보셨습니까?예를 들어, 텍스처 아트라스를 사용하여 텍스처를 변경하거나 축퇴 삼각형 스트립을 사용하여 한 번의 그리기 호출로 전체 UI를 그립니다. – MichalisB

+0

내 주요 문제는 인터페이스가 변경 될뿐만 아니라 레이블 자체가 끊임없이 변화하는 숫자 데이터를 표시한다는 것입니다. 나는 소수의 x 자리에 float 값을 쉽게 표시 할 수 있도록 숫자 tex 배열/디스플레이 래퍼 클래스를 만들었습니다. 원래 벤치 마크했던 벤치 마크보다 빠릅니다. 그러나 요구 사항이 늘어남에 따라 이제 몇 백 tex 바인드 및 쿼드 그리기 작업이 각 프레임을 의미합니다. 그만. 나의 대안적인 생각은 하나의 비트 맵을 사용하고 캔버스 도구를 사용할 수 있다는 것입니다. 동적 텍스트가 많을수록 확장 성이 좋지만 초기 오버 헤드는 가파르게 나타납니다. – Kactus

관련 문제