【问题标题】:Android game programming - Heap issuesAndroid 游戏编程 - 堆问题
【发布时间】:2011-10-30 19:44:01
【问题描述】:

我在一家小型 Android 游戏开发公司工作,目前我遇到了问题。我正在运行一个非常标准的 windows 7 x64 机器,带有 Eclipse 和 Android SDK。

我正在阅读我的程序的 LogCat 输出,想知道为什么我的游戏甚至不显示。我很快看到所有堆都在增长,并认为我可能有太多纹理/太大的纹理等。我将问题定位为纹理加载,然后我开始使用 DDMS,发现我的堆不会增长到 19MB 以上。我剪掉了几个纹理并尝试再次构建和运行。令我震惊的是,堆不会一直增长到超过 6.6MB。有没有人有什么建议?

tl;dr:我的堆增长到 19MB 然后失败了,所以我取出了更消耗内存的纹理以将其保持在堆中的 19MB 以下,现在我的堆不会超过 6.6MB .

编辑:取出较大纹理时的 logcat 输出:

08-19 19:19:53.744:调试/dalvikvm(4699):GC_FOR_MALLOC 在 49 毫秒内释放了 91 个对象/514016 个字节 08-19 19:19:54.184:调试/dalvikvm(4699):GC_FOR_MALLOC 在 48 毫秒内释放了 104 个对象/494088 个字节 08-19 19:19:54.404:WARN/ActivityManager(59):启动超时已过期,放弃唤醒锁! 08-19 19:19:54.764:调试/dalvikvm(4699):GC_FOR_MALLOC 在 49 毫秒内释放了 85 个对象/384664 个字节 08-19 19:19:54.935: WARN/ActivityManager(59): HistoryRecord{4612eec8 com.wickeyware.zombiearcher.android/.AndroidGame} 的活动空闲超时 08-19 19:19:55.234:调试/dalvikvm(4699):GC_FOR_MALLOC 在 47 毫秒内释放了 104 个对象/504648 个字节 08-19 19:19:55.875:调试/dalvikvm(4699):GC_FOR_MALLOC 在 55 毫秒内释放了 85 个对象/505712 个字节 08-19 19:19:56.905:调试/dalvikvm(4699):GC_FOR_MALLOC 在 50 毫秒内释放了 104 个对象/522392 个字节 08-19 19:19:57.535:调试/dalvikvm(4699):GC_FOR_MALLOC 在 50 毫秒内释放了 56 个对象/388896 个字节 08-19 19:19:57.695: INFO/WindowManager(59): WIN DEATH: Window{4606a8a0 com.android.launcher/com.android.launcher2.Launcher paused=false} 08-19 19:19:57.705: INFO/ActivityManager(59): 进程 com.android.launcher (pid 4669) 已经死亡。 08-19 19:19:57.825:INFO/ActivityManager(59):内存不足:没有更多的后台进程。 08-19 19:19:57.865: INFO/dalvikvm(4699): dvmDdmHandleHpsgChunk(当 1, 什么 0, 堆 0) 08-19 19:19:58.575: DEBUG/ddm-heap(4699): 堆 GC 请求 08-19 19:19:58.685:调试/dalvikvm(4699):GC_EXPLICIT 在 106 毫秒内释放了 48 个对象/313440 个字节 08-19 19:20:01.015: INFO/ActivityManager(59): 进程 jp.co.omronsoft.openwnn (pid 4677) 已经死亡。 08-19 19:20:01.095:WARN/ActivityManager(59):计划在 5000 毫秒内重新启动崩溃的服务 jp.co.omronsoft.openwnn/.OpenWnnJAJP 08-19 19:20:01.106:INFO/ActivityManager(59):内存不足:没有更多的后台进程。 08-19 19:20:03.105: INFO/ActivityManager(59): 进程 com.wickeyware.zombiearcher.android (pid 4699) 已经死亡。 08-19 19:20:03.155: INFO/WindowManager(59): WIN DEATH: Window{46138b68 SurfaceView paused=false} 08-19 19:20:03.275: INFO/WindowManager(59): WIN DEATH: Window{4612d530 com.wickeyware.zombiearcher.android/com.wickeyware.zombiearcher.android.AndroidGame paused=false} 08-19 19:20:03.425: INFO/ActivityManager(59): 为活动 com.android.launcher/com.android.launcher2.Launcher 启动 proc com.android.launcher: pid=4710 uid=10025 gids={} 08-19 19:20:03.425:INFO/ActivityManager(59):内存不足:没有更多的后台进程。 08-19 19:20:03.775:INFO/UsageStats(59):com.android.launcher 意外恢复,而 com.wickeyware.zombiearcher.android 已经恢复 08-19 19:20:03.904: INFO/ActivityThread(4710): 发布提供者 com.android.launcher2.settings: com.android.launcher2.LauncherProvider 08-19 19:20:04.005:调试/dalvikvm(4710):GC_EXTERNAL_ALLOC 在 58 毫秒内释放了 985 个对象/73440 个字节 08-19 19:20:04.465: WARN/InputManagerService(59): 收到 RemoteException 向 pid 4699 uid 10036 发送 setActive(false) 通知 08-19 19:20:04.984:INFO/ActivityManager(59):显示的活动 com.android.launcher/com.android.launcher2.Launcher:1703 毫秒(总共 20584 毫秒) 08-19 19:20:06.124:INFO/ActivityManager(59):为服务 jp.co.omronsoft.openwnn/.OpenWnnJAJP 启动 proc jp.co.omronsoft.openwnn:pid=4718 uid=10023 gids={}

【问题讨论】:

  • 您是否收到内存不足异常?
  • 移除纹理后游戏运行了吗?您希望在当前游戏屏幕上坚持使用最大 1024x1024 的纹理表,并且一次只加载 1 个纹理表以避免堆问题。
  • 我一次加载 1 个纹理表,但没有出现内存不足异常。其他程序停止了,我的程序也停止了,然后 jp.co.omronsoft.openwnn 在我的程序死亡后大约 500 毫秒被重置。当我删除纹理时游戏没有运行,这就是问题所在。
  • 您好,请参阅下面的链接帮助您的应用程序中的完整内容 [stackoverflow.com/questions/171205/… [1]:stackoverflow.com/questions/171205/…
  • 我相信很多 Android 设备的默认堆大小为 16mb,有些为 24 或 32mb。也许您可以在模拟器中尝试并手动设置堆(属性),看看这是否有所作为。

标签: android libgdx heap-memory dalvik


【解决方案1】:
GC_FOR_MALLOC freed 104 objects / 504648 bytes in 47ms

这是垃圾收集器触发。不幸的是,没有任何来源,这里没有人可以帮助您。

但是,您似乎实例化了太多对象,而垃圾收集器几乎一直在触发。

【讨论】:

    【解决方案2】:

    你好。我不太确定我的答案是否正确,但我遇到了类似的问题。

    问题在于为某些对象创建新纹理。我做了太多次,结果是类似的例外。我的解决方案:在为对象设置新纹理之前,我删除了旧的。

    例如:

    // Delete a texture
    int[] textures = { textureId };
    gl.glDeleteTextures(1, textures, 0);
    
    // Create new texture ...
    

    或者:

    int oldTextureId = textureId;
    ...
    // Create new texture
    ...
    // Delete texture
    int[] textures = { oldTextureId };
    gl.glDeleteTextures(1, textures, 0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 2012-02-15
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      相关资源
      最近更新 更多