Android、OpenGL、GLSurfaceViewの拡張?


12

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

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

ただし、質問の大部分は拡張に関するものGLSurfaceViewです。拡張せずにアプリ全体を作成しましたGLSurfaceView(そして正常に動作します)。私がGLSurfaceView出くわした質問の大部分に及ぶ理由はまったくありません。

さらに悪いことに、アンドロイドのドキュメントはあなたがすべきであることを暗示していますが、長所/短所がなぜあるのかGLSurfaceView.Renderer、私がやったようにあなた自身を実装してすべてを実行していないのかについての詳細な説明は提供していません

それでも、問題が純粋に拡張に関係している膨大な質問は、GLSurfaceView実際に私がそれを行っている方法と他の方法でそれを行うための本当に良い理由があるのか​​どうか疑問に思っていますする)。

だから、私が見逃しているものがありますか?その間に質問に答えるのをやめるべきですか?

Android OpenGLドキュメント


素敵な質問私は答えについて熱心だ。..
Tofeeq

GLSurfaceViewを拡張する理由の1つはここにあります:gamedev.stackexchange.com/questions/12629 / ...気付か ないうちに、テクスチャなどをリロードすることで、この質問で説明した問題を自分のアプリで既に回避しましたonResume()
Spoon Thumb

回答:


2

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

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

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

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


私もこれを始めましたが、質問の目的は、実際のロジックをなぜ拡張GLSurfaceViewではなく拡張するのかということGLSurfaceView.Rendererです。ポイント1ですが、レンダラーはアクティビティの変数として保持します。理論的には、コンテキストをキャストすることでどこからでも取得できます((MyActivity)view.getContext()).getRenderer()。コンテキストオブジェクトは必ずしもそうではない可能性があるため、おそらくもう少し危険ですMyActivity
スプーン親指

レンダラーが1つあれば大丈夫です。しかし、前にも言ったように、レンドラーはたくさんあり、それらは異なるSurfaceViewに接続されます-混乱!
アレックスコーン

0

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>

1
とにかくそれを行うことができます<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
スプーン親指

いい視点ね。違いは、私の例では、Androidフレームワークが余分なコード行を必要とせずにすべてを拡張およびセットアップすることです。あなたのメソッドはより多くのコードですが、実装を置き換えるために柔軟です。それ以外は、どちらの方法も似ています。
アミールウヴァル

-1

まあ... GLSurfaceViewは、あなたが気づいていると確信しているように、一般的な利益のための単なるラッパーです。これは、openglでレンダリングするために必要なすべての機能をカプセル化し、androidビュー階層にうまく組み込むオプションがあります。

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

だから、再び:あなたは、ユーザー入力の遅れを心配する必要はいけないのでGLSurfaceViewは、レンダリングのための新しいスレッドを提供します


2
はい。ただし、GLSurfaceView拡張しなくても、レンダリングスレッドを開始します。を使用しますがGLSurfaceView、拡張しません。私は利益がでちょうど持つすべてのものとは対照的に、それを拡張して、その中に異なる方法をoverrridingからあるものを求めているRenderer
スプーンの親指

welp、私は試してみました:)私は後でそれを調べるかもしれません、今私も興味があります!
グレッグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.