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

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

하지만 대부분의 질문은 GLSurfaceView 확장과 관련이 있습니다. GLSurfaceView를 확장하지 않고 전체 앱을 만들었습니다 (그리고 잘 실행됩니다). GLSurfaceView를 확장 할 이유가 전혀 보이지 않습니다. 대부분의 질문을 접하게됩니다.

안드로이드 문서는 여러분이해야 할 일을 암시하지만, 장단점이 확장되지 않은 이유와 장단점이 무엇인지에 대한 자세한 설명은 제공하지 않습니다. GLSurfaceView.Renderer 제가했던 것처럼

여전히 문제가 순전히 GLSurfaceView 확장과 관련이있는 질문의 양입니다. 내가 해왔 던 방식에 비해 실제로 그렇게하는 데 정말 좋은 이유가 있는지 궁금해집니다.

그래서, 뭔가가 있습니까? 나는 그리워 해? 그동안 질문에 대한 답변을 중단해야하나요?

Android openGL 문서

댓글

답변

, 대부분의 지혜는 GLSurfaceView.Renderer 구현에 있습니다. GLSurfaceView에 래퍼를 사용해야하는 세 가지 이유가 있습니다.

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

  2. GLSurfaceView.RendereronDetachedFromWindow() 또는 surfaceDestroyed()에 대한 알림을받지 않습니다. 이것은 내 구현에 몇 가지 문제를 일으켰습니다. 내 확장 GLSurfaceView는 이러한 메서드를 재정의하고 mRenderer 가 알 수 있도록합니다. § 1 때문에 가능합니다.

  3. 일부 메소드는 try { super. 무엇이든 ; } catch() { log( 을 추가하기 위해 래핑됩니다. 무엇이든 ) }. 예를 들어 queueEvent()는 Renderer가 설정되지 않은 경우 발생합니다.하지만 저에게는 괜찮습니다. 이러한 타임 라인 불일치를 무시하면됩니다.

댓글

  • I ' 질문은 GLSurfaceView.Renderer가 아닌 확장 된 GLSurfaceView에 실제 논리를 넣을 수있는 이유에 더 중점을 두었습니다. . 포인트 1에서는 렌더러를 내 활동의 변수로 유지합니다. 이론적으로는 ((MyActivity)view.getContext()).getRenderer() 컨텍스트를 캐스팅하여 어디서나 얻을 수 있습니다. 컨텍스트 개체가 반드시 MyActivity
  • ' 문제가있는 경우 괜찮을 수는 없으므로 조금 더 위험 할 수 있습니다. 하나의 렌더러. 하지만 이전에 말했듯이 많은 rendrers가 있고 서로 다른 SurfaceView에 연결되어 있습니다. 엉망입니다!

Answer

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> 

댓글

  • 어쨌든 <android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
  • 를 사용하면됩니다.

  • 좋은 지적입니다. 차이점은 내 예제에서 Android 프레임 워크는 추가 코드 줄없이 모든 것을 확장하고 설정한다는 것입니다. 귀하의 방법은 더 많은 코드이지만 구현을 대체하는 데 유연합니다. 그 외에는 두 가지 방법이 비슷해 보입니다.

답변

글쎄 … GLSurfaceView는 확실히 당신은 “공익을위한 래퍼”일뿐입니다. 이것은 OpenGL로 렌더링하는 데 필요한 모든 기능을 캡슐화하고, Android View 계층 구조와 멋지게 통합 할 수있는 옵션을 제공합니다.

제공하지 않았습니다. 당신의 대안이므로 비교할 수는 없지만 GLSurfaceView처럼 렌더링을 위해 다른 스레드를 생성했거나 사용자 입력이 지연 될 수 있기를 바랍니다.

다시 말하지만 : GLSurfaceView는 렌더링을위한 새 스레드를 제공하므로 사용자 입력 지연에 대해 걱정할 필요가 없습니다.

댓글

  • 예,하지만 GLSurfaceView는 다음과 같은 경우에도이를 수행합니다 (렌더링 스레드 시작). 확장하지 않습니다. ' GLSurfaceView를 사용하지만 확장하지 않습니다 '. 저는 ' Renderer

에 모든 것을 포함하는 것이 아니라 확장하고 다른 방법을 덮어 쓰면 어떤 이점이 있는지 묻습니다. li>

  • 환영합니다, 시도했습니다 🙂 나중에 살펴볼 수도 있습니다. 이제 관심도 있습니다!
  • 답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다