游戏引擎移植中须要JNI中异步加载纹理。IPhone中用上下文解决,请问如何在Android中解决这个问题。JNI中OPenGl ES的上下文如何使用,能不能解决异步加载纹理问题。急求解决方案,谢谢。JNI纹理 异步JNI Texture threadJNI Texture ThreadJNI Thread TextureJNI异步加载纹理

解决方案 »

  1.   

    别沉啊,求方法。JNI代码没有作用
    bool getEGLConfig(EGLConfig **configs_list){ EGLint num_configs;
    EGLDisplay m_eglDisplay; m_eglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    if( m_eglDisplay == EGL_NO_DISPLAY || eglGetError() != EGL_SUCCESS )
    return false;
    if( eglInitialize( m_eglDisplay, NULL, NULL ) == EGL_FALSE || eglGetError() != EGL_SUCCESS )
    return false;
    if ( eglGetConfigs( m_eglDisplay, NULL, 0, &num_configs) == EGL_FALSE || eglGetError() != EGL_SUCCESS )
    return false; *configs_list = (EGLConfig *)malloc(num_configs * sizeof(EGLConfig)); if (*configs_list == 0)
    return false;
    if( eglGetConfigs( m_eglDisplay, *configs_list, num_configs, &num_configs) == EGL_FALSE || eglGetError() != EGL_SUCCESS )
    return false; return true;}
    void *db_pthread(void *pThreadArg) {
    pthread_detach (pthread_self()); EGLContext context;
    EGLDisplay display;
    EGLSurface draw_surface;
    EGLSurface read_surface; context = eglGetCurrentContext();
    draw_surface = eglGetCurrentSurface(EGL_DRAW);
    read_surface = eglGetCurrentSurface(EGL_READ);
    display = eglGetDisplay(EGL_DEFAULT_DISPLAY);    const EGLint CONFIG_ATTRIBS[] = {
                EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
                EGL_BLUE_SIZE, 8,
                EGL_GREEN_SIZE, 8,
                EGL_RED_SIZE, 8,
                EGL_NONE
        };
        EGLConfig *configs = 0;
        if(getEGLConfig(&configs)){
         LOGI("configs[0]:%x",configs);
         LOGI("config right");
        }else{
         LOGI("config error");
        } EGLContext context =  eglCreateContext(display, *configs, NULL, NULL);
    EGLContext context2 =  eglCreateContext(display, *configs, *context, NULL);
    if(context2 == EGL_FALSE){
    LOGI("context2 == false");
    }else{
    LOGI("context2 == true");
    } if(eglMakeCurrent(display,draw_surface,read_surface,context2) == EGL_FALSE)
    LOGI("eglMakeCurrent error");
    else
    LOGI("eglMakeCurrent right");  if( g_fnLoad )
     (*g_fnLoad)(pThreadArg);  pthread_exit((void *)0);

      

  2.   

    不懂 opengl是一状态机,跑在UI线程里头,怎么能另开线程加载纹理呢?
    如果你是说把png decode到内存来,那就另开线程直接读取png的二进制然后decode,再放到cache中。opengl要用到的时候再绑定不就行了?