2013-11-22 36 views
1

我正在使用大約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上運行此操作。

+0

我已經在Vuforia與一些人澄清,這確實是在運行時更改紋理的正確方法。您需要在GL線程上調用主線程上的前兩個本地方法('deinitApplicationNative()'和'initApplicationNative()')和'mRender.initRendering()'。我刪除了處理程序並直接從主線程調用方法,並且崩潰頻率更低。 – ashatte

+0

另一個有趣的發現是運行Android 2.3.3的舊設備。不會遭受這次崩潰。難道Android 4.3會以不同的方式處理內存/垃圾回收並導致SIGSEGV? – ashatte

回答

1

我似乎已經解決了這個錯誤。事實上,原始文章中的代碼是在運行時切換紋理的正確方法(這已經由Vuforia論壇上的管理員確認)。

問題是一個線程問題。我從Dominoes示例應用程序中檢索了GUIManager類的代碼,以將按鈕和其他元素添加到屏幕。該課程使用Handler來接收消息,然後執行適當的GUI相關任務。

問題是,你必須確保在主線程上調用initApplicationNative(),而在GLThread上調用mRenderer.initRendering()。不僅如此,如果紋理陣列在initApplicationNative()調用和mRenderer.initRendering()調用之間的任何點發生變化,它可能會導致本機代碼失敗(有一些assert()調用)。

有關於這裏Vuforia線程一些更多的信息:https://developer.vuforia.com/forum/faq/android-which-methods-are-called-ui-vs-opengl-thread

我相信,有計時問題,以及有時函數被調用錯誤的線程上。爲了使程序正常工作,我從FrameMarkers.javaGUIManager.java中刪除了處理程序,並從主線程調用了所有我的紋理更新代碼。

這確保deinitApplicationNative()initApplicationNative()始終從主線程調用,而mGlView.queueEvent()確保GL代碼在該線程上運行。

相關問題