Android,OpenGL和扩展GLSurfaceView?


12

这个问题既是技术性的,又是元的,是主观的,而且非常具体:

我是从事Android的独立游戏开发者,在过去的6个月中,我一直在苦苦挣扎,最终成功制作了自己的Android 3D游戏应用程序。所以我想我会跳出来,并帮助其他在android和openGL-ES上苦苦挣扎的人

但是,绝大多数问题与扩展有关GLSurfaceView。我没有扩展就制作了整个应用程序GLSurfaceView(并且运行良好)。GLSurfaceView对于我遇到的大多数问题,我完全看不出有任何理由要扩大。

更糟糕的是,Android文档暗示您应该这样做,但没有详细说明为什么/什么优点/缺点与不扩展以及通过GLSurfaceView.Renderer像我一样实现自己的事情来做所有事情

尽管如此,纯粹与扩展有关的大量问题仍GLSurfaceView使我怀疑,实际上是否有这样做的真正理由与我一直以来所做的方式一样(并在对他人的回答中提出建议)去做)。

那么,有什么我想念的吗?在此期间,我应该停止回答问题吗?

Android openGL文档


我很想知道答案的好问题
。– Tofeeq

其中一个原因,为什么延长GLSurfaceView可以在这里找到: gamedev.stackexchange.com/questions/12629/... 没有意识到这一点,我其实已经通过重装纹理等在回避这个问题,谈到了自己的应用程序的问题onResume()
勺拇指

Answers:


2

我对我的扩展非常少GLSurfaceView,而大多数智慧属于我对GLSurfaceView.Renderer。我出于以下三个原因使用包装器GLSurfaceView

  1. 该基地GLSurfaceView没有办法找回Renderer实例。我有多个表面,当我收到其中一个的UI事件时,我想将命令传递给相应的渲染器。因此,我覆盖setRenderer了引用并将其保留在扩展类中。

  2. GLSurfaceView.Renderer没有收到有关onDetachedFromWindow()或的通知surfaceDestroyed()。这给我的实现带来了一些问题。我的扩展GLSurfaceView覆盖了这些方法,并通知mRenderer。由于§1而可能。

  3. 有些方法只是包装以添加try { super.任何; } catch() { log(内容) }。例如,queueEvent()如果未设置Renderer ,将抛出该异常。但对我来说,可以忽略此类时间轴不一致是可以的。


我也已经开始这样做,尽管问题更多地是针对为什么您可能将实际逻辑放在扩展GLSurfaceView而不是GLSurfaceView.Renderer。尽管在第1点上,我仍将渲染器作为活动中的变量。从理论上讲,我可以通过转换上下文从任何地方获取它:((MyActivity)view.getContext()).getRenderer()。由于上下文对象不一定是危险的,所以可能更危险一点MyActivity
Spoon Thumb 2012年

如果您只有一个渲染器,那就很好。但是正如我之前说的,我们有很多rendrer,它们连接到不同的SurfaceViews-真是一团糟!
亚历克斯·科恩

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" />
Spoon Thumb

好点子。区别在于,在我的示例中,Android框架无需任何额外的代码行就可以对所有内容进行膨胀和设置。您的方法是更多代码,但是可以灵活地替换实现。除此之外,这两种方法看起来都很相似。
阿米尔乌瓦尔

-1

好吧...正如我确定您已经注意到的那样,GLSurfaceView只是实现共同利益的包装。它封装了需要使用opengl呈现的所有功能,并可以选择将其与android View层次结构很好地合并。

您没有提供替代方案,因此无法进行比较,但我希望您像GLSurfaceView一样生成另一个线程进行渲染,否则用户输入可能会滞后。

再说一遍:GLSurfaceView提供了一个新的渲染线程,因此您不必担心用户输入滞后


2
是的,但是GLSurfaceView这样做(启动渲染线程)即使没有扩展它也是如此。我使用GLSurfaceView,但不扩展它。我问的是扩展它并滥用其中的不同方法有什么好处,而不是仅仅包含所有内容Renderer
Spoon Thumb 2012年

哭了,我试过了:)我可能稍后再研究,现在我也很感兴趣!
格雷格2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.