【问题标题】:Application only works correctly on first run应用程序仅在首次运行时正常工作
【发布时间】:2012-07-31 23:40:04
【问题描述】:

几天前,我开始制作我的第一个 Android 游戏。我选择使用 OpenGL ES 2.0,因为它是最熟悉的替代方案。但是,我目前无法在真实设备上测试游戏,所以我决定改用 AVD,使用安装了 Intel HAXM 的 4.0.3 虚拟设备。这似乎工作得很好,但我现在遇到了一个非常奇怪的问题。

从 Eclipse 编译和运行游戏时,它运行良好。但是,如果我再次运行游戏,无论是通过 AVD 还是从 Eclipse,除了背景颜色之外什么都没有绘制。如果我更改代码中的任何内容以使 Eclipse 必须重新编译应用程序,那么一切都会再次正常运行,但仅在第一次运行期间。

我不知道发生了什么。如果我不得不猜测,我会说 AVD 以某种方式出现了问题,但有人知道解决这个问题的方法吗?如果需要,我会提供相关的源代码,但由于我不知道是什么导致了这种问题,所以我现在无法提供。

【问题讨论】:

  • 重启模拟器能解决吗?是否清除数据(无需重新安装)?
  • 否,重新创建 AVD 也不能解决问题。然而,我发现重新安装应用程序,就像 Eclipse 在重新编译时所做的那样,是让它在单次运行时工作的原因。
  • 这很奇怪。我会说这听起来像某些资源没有被正确释放,但因为它仍然会在你停止模拟器并重新启动它之后发生,所以情况可能并非如此。我想说下一步是清除整个模拟器上的数据,但这会卸载您的应用程序,然后重新安装它似乎可以修复它......您可以发布您的应用程序中的任何清理代码吗?跨度>
  • 这有点尴尬,但这其实也是我第一次使用Java。我的印象是它自己负责所有垃圾收集。但是,我想我还没有实现 glDelete* 调用,因为 Java 没有析构函数,而且我的程序结构仍然有点模糊。这可能是导致问题的原因吗?不过,我觉得这在两次运行之间如何持续存在有点奇怪。
  • 它可能是,虽然像你一样,我觉得很奇怪,它会在重新启动后持续存在。但是,在您尝试之前无法知道。 :) 话虽如此,本机库在 Java 中没有 GC。只有纯本机 Java 的东西,或者设计用于 Java 垃圾收集的东西。

标签: android eclipse opengl-es-2.0 avd


【解决方案1】:

您是否有任何代码无法保存或加载您的应用程序状态。也许通过 onCreate/onStart/onPause 函数?当您暂停或关闭被错误读回的应用程序时,也许您正在写一些状态?调用 Application->Clear Data 将重置此状态,除非您正在写入公共区域,例如 sd 卡。

【讨论】:

  • 看来我们正在做点什么。我错误地认为应用程序已停止,但它仍在后台运行。强制停止然后重新启动它恢复了正确的行为。正如您所说,这可能意味着问题出在其中一个功能上。给我一分钟,我会检查他们。
  • 读了一会儿,似乎 OpenGL 上下文在游戏暂停时被破坏了...... 唉,我想我必须重新加载所有纹理,VBO 等。当我尝试过时,我会回来的。 编辑:似乎只有重新加载纹理才有效!我可以安全地假设 VBO、着色器等不必重新加载吗?
  • 我无法帮助您,因为我之前没有在 Android 应用程序中尝试过 OpenGL。话虽如此,我还以为您必须重新加载所有内容。取决于您的应用程序是暂停、停止还是销毁我猜...
  • onResume 正是为此而设计的 - 当您的应用停止运行并且 Android 执行另一个活动时重新加载您需要的任何数据,并在此过程中破坏数据。
  • @PeterCarpenter 我想我现在也应该重新加载着色器和 VBO,以确保安全。
【解决方案2】:

似乎在应用程序暂停时纹理正在被删除,这导致它没有在屏幕上绘制任何东西。在 onResume 函数中重新加载纹理解决了这个问题。

【讨论】:

  • 你应该选择彼得的答案,并在 STO 上给他一些认可点
  • @Martin 我想这样做,但这需要他编辑他的答案并提供问题的实际解决方案。如果人们有同样的问题,他们将不得不阅读 cmets 以了解如果我现在接受他的回答必须做什么。但是,如果他确实编辑了他的答案,我会毫不犹豫地接受并投票。
猜你喜欢
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 2020-11-01
  • 2023-03-09
  • 2012-03-28
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
相关资源
最近更新 更多