【发布时间】:2013-11-22 03:27:43
【问题描述】:
我正在开发带有大约 30 个小标记的 FrameMarkers 示例应用程序,用于渲染简单的 2D 平面。我的应用程序有几个 GUI 按钮,单击这些按钮会更改显示的纹理(在黄色或灰色之间)。这部分有效,但有时应用程序会崩溃并出现以下错误:
11-22 12:52:36.361: A/libc(7197): Fatal signal 11 (SIGSEGV) at 0x00000010 (code=1), thread 7278 (Thread-527)
这是我如何将灰色纹理切换为黄色的示例:
// First, set the textures in the texture array
for (int i=0;i<30;i+2) {
mTextures.set(i, textureYellow);
}
// Reinitialize the renderer
deinitApplicationNative();
initApplicationNative(mScreenWidth, mScreenHeight);
mGlView.queueEvent(new Runnable() {
public void run() {
mRenderer.initRendering();
}
});
这是在运行时切换纹理的建议方法(参见here),我让它在FrameMarkers.java 内部运行(它是通过处理程序从另一个活动中单击按钮触发的)。我应该重申,应用程序不会在每次纹理更改时崩溃。在每次运行时,它都会在不同的点崩溃,但我已将问题隔离在更改纹理和重新初始化渲染器的过程中(因为它似乎在按下按钮后发生)。
- 是什么原因导致这种情况如此频繁地崩溃?
- 是否有更安全的方法在 Vuforia 应用程序运行期间更改纹理?
在 Android 4.3 上运行。
【问题讨论】:
-
我已经与 Vuforia 的一些人澄清说,这确实是在运行时更改纹理的正确方法。您需要在主线程(
deinitApplicationNative()和initApplicationNative())上调用前两个本机方法,在 GL 线程上调用mRender.initRendering()。我删除了 Handler 并直接从主线程调用方法,它崩溃的频率要低得多。 -
另一个有趣的发现是运行 Android 2.3.3 的旧设备。不会受到这次崩溃的影响。会不会是 Android 4.3 以不同的方式处理内存/垃圾收集并导致 SIGSEGV?
标签: android augmented-reality vuforia