この質問は、部分的に技術的、部分的にメタ、部分的に主観的で、非常に具体的です。

私はインディーゲームの開発者ですアンドロイドに取り組んでいて、過去6か月間、私は苦労し、ついにアンドロイド用の独自の3Dゲームアプリを作成することに成功しました。だから私はSOに飛び乗って、AndroidとopenGL-ESで苦労している他の人を助けると思った

しかし、質問の大部分はGLSurfaceViewの拡張に関連しています。 GLSurfaceViewを拡張せずにアプリ全体を作成しました(正常に動作します)。GLSurfaceViewを拡張する理由がまったくわかりません。私が遭遇する質問の大部分。

さらに悪いことに、Androidのドキュメントでは、そうすべきであると示唆されていますが、長所/短所が拡張されていないことと、独自の実装を通じてすべてを実行していないことの詳細な説明はありません。 GLSurfaceView.Renderer私が行ったように

それでも、問題が純粋にGLSurfaceViewの拡張に関係している質問の膨大な量私がこれまでやってきた方法と比べて、実際にその方法でそれを行うのに本当に正当な理由があるのだろうかと私に思わせています(そして他の人にそうするように私の答えで提案しています)。私は行方不明ですか?その間に質問への回答を停止する必要がありますか?

AndroidopenGLドキュメント

コメント

  • 答えに熱心な素敵な質問です。
  • GLSurfaceViewを拡張する理由の1つは、 gamedevです。 stackexchange.com/questions/12629/… 気付かずに、テクスチャなどをリロードすることで、この質問で話し合った問題を自分のアプリで回避しましたonResume()

回答

であり、ほとんどの知恵は私のGLSurfaceView.Rendererの実装に属しています。 GLSurfaceViewのラッパーを使用する理由は次の3つです。

  1. ベースGLSurfaceViewは、Rendererインスタンスを元に戻す方法を提供しません。複数のサーフェスがあり、そのうちの1つでUIイベントを受け取ったら、対応するレンダラーにコマンドを渡します。そのため、setRendererをオーバーライドし、参照を拡張クラスに保持します。

  2. GLSurfaceView.RendereronDetachedFromWindow()またはsurfaceDestroyed()の通知を受け取りません。これは私の実装にいくつかの問題を引き起こしました。 GLSurfaceViewの拡張機能はこれらのメソッドをオーバーライドし、 mRenderer に知らせます。 § 1 が原因で可能です。

  3. 一部のメソッドは、try { super. 何でも ; } catch() { log( を追加するためにのみラップされます。何でも ) }。たとえば、レンダラーが設定されていない場合、queueEvent()がスローされますが、私にとっては、このようなタイムラインの不一致は無視してください。

コメント

  • I 'これも始めましたが、質問は、実際のロジックをGLSurfaceView.Rendererではなく拡張されたGLSurfaceViewに配置する理由を目的としています。 。ポイント1ですが、レンダラーをアクティビティの変数として保持しています。理論的には、コンテキストをキャストすることでどこからでも取得できます:((MyActivity)view.getContext()).getRenderer()。コンテキストオブジェクトが必ずしもMyActivity
  • 'であるとは限らないため、おそらくもう少し危険です。 1つのレンダラー。しかし、前に言ったように、私たちには多くのレンドラーがあり、それらはさまざまなSurfaceViewに接続されています-混乱です!

回答

GLSurfaceViewを拡張する少なくとも1つの理由は、他のウィジェットと同様に、レイアウト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ビュー階層にうまく組み込むオプションがあります。

提供していません代替手段なので比較することはできませんが、GLSurfaceViewのようにレンダリング用に別のスレッドを生成したことを願っています。そうしないと、ユーザー入力が遅れる可能性があります。

繰り返しになりますが、 GLSurfaceViewはレンダリング用の新しいスレッドを提供するため、ユーザー入力の遅れについて心配する必要はありません

コメント

  • はい、ただしGLSurfaceViewは(レンダリングスレッドを開始します) '拡張しないでください。 GLSurfaceViewを使用していますが、'拡張していません。 ' Renderer

にすべてを含めるのではなく、拡張してさまざまなメソッドをオーバーライドすることでどのようなメリットがあるのかを尋ねています。 li>

  • ウェルプ、試してみました:)後で調べるかもしれませんが、今も興味があります!
  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です