Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止GLSurfaceView频繁地(在Android上)重新创建OpenGL曲面?_Android_Opengl Es - Fatal编程技术网

如何防止GLSurfaceView频繁地(在Android上)重新创建OpenGL曲面?

如何防止GLSurfaceView频繁地(在Android上)重新创建OpenGL曲面?,android,opengl-es,Android,Opengl Es,我有一个应用程序,其主要活动显示GLSurfaceView。每次启动一个新活动(例如设置活动)时,OpenGl曲面都会被销毁,当用户返回到主活动时,会创建一个新的曲面 这是非常缓慢的,因为我每次都需要重新生成纹理,以便它们可以绑定到新曲面。(缓存纹理是可能的,但这将是我的第二选择,因为内存有限。) 是否有办法防止每次都重新创建曲面 我自己的分析是: 有两个触发器可触发要销毁的曲面: GLSurfaceView.onPause()由活动调用 视图与窗口分离 启动一项新活动时,有没有办法防止“2”

我有一个应用程序,其主要活动显示
GLSurfaceView
。每次启动一个新活动(例如设置活动)时,OpenGl曲面都会被销毁,当用户返回到主活动时,会创建一个新的曲面

这是非常缓慢的,因为我每次都需要重新生成纹理,以便它们可以绑定到新曲面。(缓存纹理是可能的,但这将是我的第二选择,因为内存有限。)

是否有办法防止每次都重新创建曲面


我自己的分析是:

有两个触发器可触发要销毁的曲面:

  • GLSurfaceView.onPause()
    由活动调用
  • 视图与窗口分离
  • 启动一项新活动时,有没有办法防止“2”的发生?

    简短回答:没有

    长答覆: 您可以在获取OnPause()时缓存/保存所有纹理,并在OnResume()时恢复它们。但除此之外,android活动生命周期要求在Resume()上从头恢复视图

    如果某个活动被暂停或停止,系统可以通过要求该活动完成或简单地终止其进程,将其从内存中删除。当它再次向用户显示时,必须完全重新启动并恢复到以前的状态

    一种解决方法是,如果您在自己的应用程序中,而不是启动新的活动,则在当前活动上创建一个覆盖/对话框,并将设置视图放在其中

    可以通过以下方式缓存纹理: 这将是我的第二选择,因为 内存可用性有限的问题

    如果有很多纹理,唯一的解决方案是缓存它们,没有办法在活动重新启动期间保持曲面和纹理的活动状态。顺便说一句,您可以在本机代码中使用比Java多得多的内存

    在安卓ndk上,这一点已经引起了广泛的关注。特别是,我发布了一些,这表明位图解码可以占用高达85%的纹理加载时间,而texImage2D只占用剩下的15%


    因此,缓存解码的图像数据可能是一个很好的性能提升器,通过将其与内存映射文件(mmap)相结合,您甚至可以缓存大量图像数据,同时保持内存友好。

    如果您的目标是3.0或更高版本,请查看
    GLSurfaceView.setpreserveglcontextonpause()
    。请记住,设备一次可能只支持一个OpenGL上下文,因此,如果您要切换到使用OpenGL的另一个活动并返回到您的活动,您无论如何都必须重新加载–因此我建议保留一个缓存,并在活动的
    onLowMemory()时将其删除
    被调用。

    启动设置视图(通常)的标准/推荐方法是什么?覆盖/对话框/活动?我一直使用活动,假设它们是标准约定。“标准”假设是设置活动。但对于这种情况,有两种设置是有意义的。1.A预运行设置(例如难度/对象纹理)2。A在设置期间(例如音乐音量、背景颜色),在我的例子中,纹理是在Java运行时创建的。我想是时候深入研究本机代码了。谢谢你的链接。我的目标是2.1,所以你的回答证实了这在我的情况下是不可能的。