我正在使用大約30個小標記在FrameMarkers示例應用程序中繪製簡單的2D平面。我的應用程序有幾個GUI按鈕,點擊後會更改顯示的紋理(黃色或灰色之間)。這部分工作,但存在這樣的情況,有時一個問題應用程序崩潰,並提供了以下錯誤:如何避免Vuforia for Android中的致命信號11崩潰?
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與一些人澄清,這確實是在運行時更改紋理的正確方法。您需要在GL線程上調用主線程上的前兩個本地方法('deinitApplicationNative()'和'initApplicationNative()')和'mRender.initRendering()'。我刪除了處理程序並直接從主線程調用方法,並且崩潰頻率更低。 – ashatte
另一個有趣的發現是運行Android 2.3.3的舊設備。不會遭受這次崩潰。難道Android 4.3會以不同的方式處理內存/垃圾回收並導致SIGSEGV? – ashatte