我正在使用OpenGL ES的應用程序,我試圖在啓動應用程序邏輯之前將紋理加載到內存中。我嘗試了一些解決方案,但都沒有成功。Android OpenGLES在GLThread中加載紋理,然後告訴UI線程運行方法
我的動態創建代碼。 我的活動:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create a GLSurfaceView instance and set it
// as the ContentView for this Activity.
view = new GLSurfaceView(this);
// Initiate the game renderer
renderer = new AppRenderer(this);
view.setRenderer(renderer);
// Only render when we tell it to
view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
// Set the custom renderer as our view
setContentView(view);
startApplication();
}
上面的代碼使用錯誤,我加載紋理我AppRenderers onsurfacechanged功能。問題是startApplication()在onsurfacechanged之前運行,導致startapplication()運行時綁定的紋理不能加載並顯示白色。
我知道opengles會在它自己的線程上運行。
所以我嘗試使用下面的異步任務和標誌示例。
public class loadTextureTask extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(Void... params) {
textureLoad = renderer.getTextureLoaded();
while (textureLoad == false) {
textureLoad = renderer.getTextureLoaded();
}
startApplication();
}
}
後,我只是取代了「startApplication()」在OnCreate發起這個異步任務,所以當紋理加載了,我可以檢查。
loadTextureTask = new loadTextureTask();
loadTextureTask.execute((Void) null);
這引起以下錯誤「線程ID = 14:螺紋與未捕獲的異常(組= 0x40de82a0) 退出」和需要更多的時間用這種方法加載紋理大約20倍,只要它會加載如果這個異步任務不存在..
我想完成的是在紋理加載後運行startApplication()方法。
注:我的紋理是2
所有電源任何幫助將不勝感激!先謝謝你。
將'Thread.Sleep(100);'放入while循環(壞的解決方案,但應該有所幫助)...更好的解決方案是:添加監聽器(fx:'ITextureLoaddedListener'和'done'方法)渲染器然後執行這個監聽程序在'done'方法中調用'startApplication'並在程序加載所有紋理後調用方法'done'完成監聽程序(當你將_textureLoaded標誌設置爲true時)# – Selvin
嗨Selvin謝謝你的回答,你能詳細說明這個方法? –