【问题标题】:Android NDK: OpenGL draw calls in thread outside of android_mainAndroid NDK:在 android_main 之外的线程中调用 OpenGL
【发布时间】:2011-09-14 19:43:14
【问题描述】:

我有一个纯原生的 Android NDK 应用。主循环在

 android_main

由 android_native_app_glue.h 提供。

我需要在一个单独的线程中渲染一些东西,所以我尝试通过 android_main:

 pthread_t thread1;
 pthread_create(&thread1, NULL, renderstuff, NULL);

void *renderstuff( void *ptr )
{
  // some opnegl es draw calls
}

但是这不会渲染任何东西。如果我在 android_main 中执行相同的绘制调用(但没有创建新线程),它会呈现良好:S

【问题讨论】:

    标签: android multithreading opengl-es pthreads android-ndk


    【解决方案1】:

    只是出于兴趣,我看到了你的帖子,这是我的 0.02 美元(我在使用共享上下文的 Android 上工作的后台线程中有纹理):

    eglCreateContext 必须从拥有要共享的上下文的线程中调用。在调用eglCreateContext 之后,您对eglMakeCurrent 的调用(从新生成的线程中)应该可以工作了。

    【讨论】:

    • 如果您对编辑工具感到满意,您可以在答案中突出显示代码,这通常会使事情更容易阅读。
    【解决方案2】:

    你有没有在你的新线程中调用eglMakeCurrent()?您需要在新线程上的任何绘图调用之前执行此操作。

    【讨论】:

    • 嗯不,我没有,但我知道我的新线程正在输入,因为我还打印了一些日志语句。
    • 是的,这是多线程 OpenGL 渲染的要求。如果您不想处理此类事情,请初始化并绘制新线程。
    • hmm 不幸的是我尝试使用 eglMakeCurrent,但它返回 EGL_FALSE! :s
    • 在我这样做之前,我发现我得到的错误是“EGL_BAD_ACCESS”。我只是使用 eglCreateContext 在新线程中创建一个新的 EGLContext,同时重用我的 EGLSurface 和 EGLDisplay。 (基本上我需要使用两个不同的线程渲染到同一个窗口)。
    • 所以你想进行多线程渲染而不是在另一个线程中渲染所有内容?在为每个线程创建 EGLContexts 时,不要忘记在任何渲染调用之前传入 EGLContext 以共享并调用 makeCurrent()
    【解决方案3】:

    我最终重新设计了一些东西以确保只有一个线程执行渲染。

    【讨论】:

      猜你喜欢
      • 2012-05-04
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      相关资源
      最近更新 更多