【问题标题】:Android OpenGL ES game not free memory when out and in of Activity GameSurfaceAndroid OpenGL ES 游戏在 Activity GameSurface 进出时无法释放内存
【发布时间】:2011-06-24 01:53:03
【问题描述】:

我有一个正常的 Main Activity,它调用 Game Activity Surface(在 Open GL 中),它会加载所有纹理以便玩游戏。

如果我放弃使用 OpenGL 表面的活动,引擎会删除纹理并关闭活动游戏。看起来不错,但是……

在主要活动(正常活动)中,如果我调用游戏活动(重复加载纹理),游戏会在堆中消耗大量内存(似乎重复)并且游戏的帧速率会变慢。如果我重复这个过程,内存堆正在增加。

如果我关闭整个应用程序会发生什么? Android 释放,我可以以正常速度和内存消耗重新打开应用程序。

我试过垃圾......似乎与opengl表面有关。

我的问题:关闭包含Open gl的表面活动,open gl缓冲区仍然分配在堆中?关闭后,使用 open gl 打开一个新活动会复制 open gl 大小?在记忆中似乎发生了,但我可以找出原因。

【问题讨论】:

    标签: android memory opengl-es


    【解决方案1】:

    我得到了解决方案。

    由于弱引用,Android 保护了内存中的所有上下文。

    我的游戏在游戏主线程中暂停并显示 Toast 消息。用户可以离开或重新进入游戏。如果他离开屏幕,Android会在内存中保留死活动的引用,也可能在所有打开的gl表面的情况下,只是因为Toast消息,在关闭最后一个活动后仍然会弹出死活动引用。我只是使用 getApplicationContext()。

    【讨论】:

      【解决方案2】:

      尝试在 onDestroy() 方法中处理所有纹理。这样,当您退出/完成活动时,所有纹理都会被破坏。

         @Override
      protected void onDestroy() {
          super.onDestroy();
          for(Texture t:textures) {
              t.dispose();
          }
      }
      

      注意:我真的不知道 Android 有它自己的纹理类。我使用了 libgdx,并且有一个 dispose 方法可以调用。也许你应该找到一种方法来处理所有这些垃圾。如果我记得 Bitmap 类中有一个 recycle() 方法可以做类似的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-11
        相关资源
        最近更新 更多