2012-07-26 62 views
3

我嘗試爲我的Android NDK遊戲項目編寫加載屏幕 - 預加載所有紋理。 如果在其他線程中創建紋理,我會得到類似於正確設置紋理寬度的值,但即使glGetError返回0,也只是得到黑色精靈而不是紋理值。在同一線程中,一切正常,因此假設精靈或紋理中沒有錯誤碼。Android NDK - 從其他線程加載紋理

我認爲這是因爲我嘗試從另一個線程調用opengl es 2.0函數,沒有EGL提供的上下文。但是,如何從EGL中獲得opengl ES 2.0上下文,這是使用Java(Android)創建的,並將其綁定到本地C中的opengl es 2.0函數中?

的Java(機器人)

public class OGLES2View extends GLSurfaceView 
{ 
private static final int OGLES_VERSION = 2; 

public OGLES2View(Context context) 
{ 
    super(context); 
    setEGLContextClientVersion(OGLES_VERSION); 
    setRenderer(new OGLES2Renderer()); 
} 

private GLSurfaceView ogles2SurfaceView = null; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    ogles2SurfaceView = new OGLES2View(this); 
    setContentView(ogles2SurfaceView); 
} 

Ç

#define TRUE 1 
#define FALSE 0 

typedef unsigned char bool; 

typedef struct game_data 
{ 
bool loaded; 
tex* t; 
}game_data; 

static void* loader_thread_func(void* arg) 
{ 
JavaVM* jvm = get_java_vm(); //get java VM to detach in the end 
JNIEnv* env = get_jni_env(); //== attach current thread 
game_data* to_load = (game_data*) arg; 
to_load->t = malloc(sizeof(tex)); 
set_tex(to_load->t,"textures/bonus.png");//textures width and height set correctly 
to_load->loaded = TRUE; 
(*jvm)->DetachCurrentThread(jvm); 
return NULL; 
} 

void load_game_data(game_data* res) 
{ 
pthread_t loader_thread; 
pthread_create(&loader_thread, NULL, loader_thread_func, res); 
} 

/*in render manager file*/ 
static game_data* g_d = NULL; 

/*in onInit func*/ 
g_d = malloc(sizeof(game_data)); 
g_d->loaded = FALSE; 
load_game_data(g_d); 

/*in onDraw function*/ 
if(g_d->loaded) 
/*draw sprite*/ 

回答

2

要從必須創建2個線程之間的共享的OpenGL ES上下文另一個線程調用OpenGL ES的功能。

有一個更簡單的解決方案 - 將事件發送到擁有OpenGL ES上下文的線程,以便在第二個線程中加載後立即更新紋理。

-1

Android不支持共享OpenGL上下文,因此您必須使用主上下文來創建紋理。您可以將紋理數據加載到後臺線程上,但使用該數據創建紋理必須使用主要上下文來完成。在加載紋理數據之後,Sergey建議將事件發送到主線程是Android上的正確方法。

+0

自從GLES20以來,Android肯定支持共享上下文。任何使用GLSurfaceView卡住的人都必須使用共享上下文才能訪問GLES30函數(如位塊傳輸)。使用GLES30,真正的緩衝區對象可以打包,並用於異步傳輸紋理到GL線程。 – 2015-12-23 18:09:15