Как объяснено в ' Предварительная загрузка текстур OpenGLES в другой поток ', существует два отдельных шага: создание растрового изображения и выгрузка растрового изображения. В большинстве случаев у вас все будет в порядке, просто создавая растровое изображение во вторичном потоке - что довольно просто.
Если вы испытываете пропадание кадров при загрузке текстур , вызовите texImage2D
из фонового потока. Для этого вам нужно создать новый контекст OpenGL, который делится своими текстурами с вашим потоком рендеринга, потому что каждому потоку нужен свой собственный контекст OpenGL.
EGLContext textureContext = egl.eglCreateContext(display, eglConfig, renderContext, null);
Получить параметры для eglCreateContext
немного сложно. Вам нужно использовать setEGLContextFactory
на вашем SurfaceView
, чтобы подключиться к созданию EGLContext:
@Override
public EGLContext createContext(final EGL10 egl, final EGLDisplay display, final EGLConfig eglConfig) {
EGLContext renderContext = egl.eglCreateContext(display, eglConfig, EGL10.EGL_NO_CONTEXT, null);
// create your texture context here
return renderContext;
}
Тогда вы готовы запустить поток загрузки текстуры:
public void run() {
int pbufferAttribs[] = { EGL10.EGL_WIDTH, 1, EGL10.EGL_HEIGHT, 1, EGL14.EGL_TEXTURE_TARGET,
EGL14.EGL_NO_TEXTURE, EGL14.EGL_TEXTURE_FORMAT, EGL14.EGL_NO_TEXTURE,
EGL10.EGL_NONE };
EGLSurface localSurface = egl.eglCreatePbufferSurface(display, eglConfig, pbufferAttribs);
egl.eglMakeCurrent(display, localSurface, localSurface, textureContext);
int textureId = loadTexture(R.drawable.waterfalls);
// here you can pass the textureId to your
// render thread to be used with glBindTexture
}
Я создал рабочую демонстрацию приведенных выше фрагментов кода в https://github.com/perpetual-mobile/SharedGLContextsTest.
Это решение основано на многих источниках в Интернете. Самые влиятельные, где эти три: