이 질문은 부분 기술, 부분 메타, 부분 주관적이며 매우 구체적입니다.
저는 인디 게임 개발자입니다. Android에서 작업하고 있으며 지난 6 개월 동안 어려움을 겪고 마침내 Android 용 3D 게임 앱을 만드는 데 성공했습니다. 그래서 저는 “안드로이드와 openGL-ES로 어려움을 겪는 다른 사람들을 도와 줄 것이라고 생각했습니다.
하지만 대부분의 질문은 GLSurfaceView
확장과 관련이 있습니다. GLSurfaceView
를 확장하지 않고 전체 앱을 만들었습니다 (그리고 잘 실행됩니다). GLSurfaceView
를 확장 할 이유가 전혀 보이지 않습니다. 대부분의 질문을 접하게됩니다.
안드로이드 문서는 여러분이해야 할 일을 암시하지만, 장단점이 확장되지 않은 이유와 장단점이 무엇인지에 대한 자세한 설명은 제공하지 않습니다. GLSurfaceView.Renderer
제가했던 것처럼
여전히 문제가 순전히 GLSurfaceView
확장과 관련이있는 질문의 양입니다. 내가 해왔 던 방식에 비해 실제로 그렇게하는 데 정말 좋은 이유가 있는지 궁금해집니다.
그래서, 뭔가가 있습니까? 나는 그리워 해? 그동안 질문에 대한 답변을 중단해야하나요?
댓글
- 답이 궁금합니다.
- GLSurfaceView를 확장하는 이유 중 하나는 gamedev에서 찾을 수 있습니다. stackexchange.com/questions/12629/… 깨닫지 못한 채, 실제로는 텍스처 등을 다시로드하여 내 앱에서이 질문에서 언급 한 문제를 이미 회피했습니다.
onResume()
답변
, 대부분의 지혜는 GLSurfaceView.Renderer
구현에 있습니다. GLSurfaceView
에 래퍼를 사용해야하는 세 가지 이유가 있습니다.
-
기본
GLSurfaceView
는Renderer
인스턴스를 다시 가져올 수있는 방법을 제공하지 않습니다. 여러 개의 표면이 있는데 그중 하나에 대한 UI 이벤트를 받으면 해당 렌더러에 명령을 전달하고 싶습니다. 따라서setRenderer
를 재정의하고 확장 클래스에 참조를 유지합니다. -
GLSurfaceView.Renderer
은onDetachedFromWindow()
또는surfaceDestroyed()
에 대한 알림을받지 않습니다. 이것은 내 구현에 몇 가지 문제를 일으켰습니다. 내 확장GLSurfaceView
는 이러한 메서드를 재정의하고 mRenderer 가 알 수 있도록합니다. § 1 때문에 가능합니다. -
일부 메소드는
try { super.
무엇이든; } catch() { log(
을 추가하기 위해 래핑됩니다. 무엇이든) }
. 예를 들어queueEvent()
는 Renderer가 설정되지 않은 경우 발생합니다.하지만 저에게는 괜찮습니다. 이러한 타임 라인 불일치를 무시하면됩니다.
댓글
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>
GLSurfaceView.Renderer
가 아닌 확장 된GLSurfaceView
에 실제 논리를 넣을 수있는 이유에 더 중점을 두었습니다. . 포인트 1에서는 렌더러를 내 활동의 변수로 유지합니다. 이론적으로는((MyActivity)view.getContext()).getRenderer()
컨텍스트를 캐스팅하여 어디서나 얻을 수 있습니다. 컨텍스트 개체가 반드시MyActivity