안드로이드, OpenGL 및 확장 GLSurfaceView?


12

이 질문은 부분 기술, 부분 메타, 부분 주관적이며 매우 구체적입니다.

나는 안드로이드에서 일하는 인디 게임 개발자이며 지난 6 개월 동안 나는 안드로이드 용 3D 게임 앱을 만드는 데 어려움을 겪고 마침내 성공했습니다. 그래서 나는 SO에 뛰어 들었고 안드로이드와 openGL-ES로 어려움을 겪고있는 다른 사람들을 도울 것이라고 생각했습니다.

그러나 대부분의 질문은 확장과 관련이 GLSurfaceView있습니다. 확장하지 않고 전체 앱을 만들었습니다 GLSurfaceView. 내가 만나는 GLSurfaceView대부분의 질문에 대해 확장해야 할 이유가 전혀 없습니다 .

더 나쁜 것은 안드로이드 문서는 당신이해야한다는 것을 암시하지만, 장단점이 왜 또는 무엇을 확장하지 않고 GLSurfaceView.Renderer내가 한 것처럼 자신의 구현을 통해 모든 것을 수행하는지에 대한 자세한 설명은 제공하지 않습니다.

여전히 문제가 확장과 관련이있는 단순한 질문의 양은 GLSurfaceView실제로 그렇게하는 이유와 내가하고있는 방식에 비해 실제로 그만한 이유가 있는지 궁금해합니다. 할 것).

그래서 내가 놓친 것이 있습니까? 그동안 질문에 답변을 중단해야합니까?

Android OpenGL 설명서


좋은 질문 나는 대답에 열심입니다 ..
Tofeeq

왜 GLSurfaceView를 확장해야하는지에 대한 한 가지 이유는 여기에서 찾을 수 있습니다. gamedev.stackexchange.com/questions/12629/… 그것을 깨닫지 못하고 실제로 텍스처 등을 다시로드하여이 질문에서 언급 한 문제를 이미 회피했습니다.onResume()
Spoon Thumb

답변:


2

나는 나의 확장 성을 최소한으로 가지고 있으며 GLSurfaceView, 대부분의 지혜는 나의 구현에 속한다 GLSurfaceView.Renderer. 래퍼를 사용해야하는 다음 세 가지 이유가 있습니다 GLSurfaceView.

  1. 기본 GLSurfaceViewRenderer인스턴스를 다시 가져올 수있는 방법을 제공하지 않습니다 . 표면이 여러 개 있는데 그 중 하나에 대한 UI 이벤트를 수신하면 해당 렌더러에 명령을 전달하고 싶습니다. 따라서 setRenderer확장 클래스에서 참조를 재정의 하고 유지합니다.

  2. GLSurfaceView.RendereronDetachedFromWindow()또는에 대한 알림을받지 않습니다 surfaceDestroyed(). 이로 인해 구현에 문제가 발생했습니다. 내 확장은 GLSurfaceView이러한 방법 을 무시하고 mRenderer 에게 알려줍니다. §1 때문에 가능합니다 .

  3. 어떤 메소드는 try { super.무엇 ; } catch() { log(이든 추가하기 위해 랩핑됩니다 ) }. 예를 들어 queueEvent()렌더러가 설정되어 있지 않으면 throw됩니다. 그러나 저에게는 그러한 타임 라인 불일치를 단순히 무시하는 것이 좋습니다.


이 작업을 시작하기 시작했지만 실제 논리를 왜 확장이 GLSurfaceView아닌 확장에 넣을 수 있는지에 대한 질문이 더 많이 제기되었습니다 GLSurfaceView.Renderer. 포인트 1에 있지만 렌더러를 활동의 변수로 유지합니다. 이론적으로 나는 컨텍스트를 캐스팅하여 어디서나 얻을 수 있습니다 ((MyActivity)view.getContext()).getRenderer(). 문맥 객체가 반드시 그런 것은 아니기 때문에 조금 더 위험 할 수도 있습니다.MyActivity
Spoon Thumb

렌더러가 하나 있으면 괜찮습니다. 그러나 이전에 말했듯이 많은 rendrers가 있으며 다른 SurfaceView에 연결됩니다.
Alex Cohn

0

GLSurfaceView를 확장하는 최소한 하나의 좋은 이유는 다른 위젯과 마찬가지로 레이아웃 xml 파일에서 직접 인스턴스화 할 수 있기 때문입니다.

    <RelativeLayout ... >
      <com.example.MyGlSurfaceView
        android:id="@+id/my_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
      />
     </RelativeLayout>

1
당신은 어쨌든 사용 할 수<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
스푼 엄지 손가락

좋은 지적. 차이점은 내 예제에서 Android 프레임 워크가 추가 코드 줄 필요없이 모든 것을 팽창시키고 설정한다는 것입니다. 귀하의 메소드는 더 많은 코드이지만 구현을 대체하기 위해 유연합니다. 그 외에는 두 가지 방법이 비슷해 보입니다.
Amir Uval

-1

글쎄 ... GLSurfaceView는 당신이 알고 있듯이 일반적인 이익을위한 포장지입니다. 그것은 OpenGL로 렌더링하는 데 필요한 모든 기능을 캡슐화하며, Android View 계층 구조와 멋지게 통합하는 옵션이 있습니다.

대안을 제공하지 않았으므로 비교가 불가능하지만 GLSurfaceView와 같이 렌더링을 위해 다른 스레드를 생성했거나 사용자 입력이 지연 될 수 있기를 바랍니다.

그래서 다시 : 사용자 입력 지연에 대한 걱정이 필요 없다, 그래서 GLSurfaceView는, 렌더링을위한 새 스레드를 제공합니다


2
예, 그러나 GLSurfaceView확장하지 않아도 렌더링 스레드가 시작됩니다. 나는 사용 GLSurfaceView하지만 확장하지는 않습니다. 나는 이점은 단지 가진 모든 반대를 확장하고 그 안에 다른 방법을 overrriding에서이 무슨 부탁 해요Renderer
스푼 엄지 손가락

welp, 나는 시도했다 :) 나는 나중에 그것을 볼지도 모른다, 지금 나는 또한 흥미있다!
Greg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.