从非主线程加载的 VAO 崩溃

Posted

技术标签:

【中文标题】从非主线程加载的 VAO 崩溃【英文标题】:Crash on VAOs loaded from non-main thread 【发布时间】:2013-08-28 16:00:49 【问题描述】:

在我的代码中,我有一个对象的包装类,该对象由两个缓冲区对象和一个顶点数组对象支持。我在构造函数中使用它生成它们(稍微简化):

glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(1, &ibo);
glGenBuffers(1, &vbo);
printf("Ind buffers %d %d %d\n", vao, ibo, vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

printf 在主线程的前几个创建中给出这个。

Ind buffers 1 1 2
Ind buffers 3 4 5
Ind buffers 4 6 7
Ind buffers 5 8 9
Ind buffers 6 10 11
Ind buffers 7 12 13

在 VAO #2 和缓冲区 #3 之间有一个非索引的。这对我来说看起来不错。每个数组对象都有两个附加到它的唯一缓冲区。

我稍后也会使用此代码来加载后台资源(而是生成它们)。每个线程都有自己的上下文,使用 glfwCreateContext 创建并与主窗口共享资源。首次创建这些资源时,会出现以下输出:

Ind buffers 1 14 15
Ind buffers 1 16 17
Ind buffers 1 18 19
Ind buffers 1 20 24
Ind buffers 1 21 23
Ind buffers 1 22 25
Ind buffers 1 26 27
Ind buffers 1 28 29
Ind buffers 2 30 31
Ind buffers 2 32 33
Ind buffers 2 34 35
Ind buffers 2 36 37
Ind buffers 2 39 40
Ind buffers 2 38 41
Ind buffers 2 42 43
Ind buffers 2 44 45

在此之后很快,VAO #1 被用于使用不同数量的顶点绘制 9 次,并且不可避免地会出现段错误。

我的问题是,这是一个错误还是我做错了什么?我正在运行带有 Nvidia 卡的戴尔笔记本电脑的 Linux Ubuntu 上进行测试。

【问题讨论】:

【参考方案1】:

OpenGL 规范明确禁止共享 VAO 对象。

但 VBO 仍然是共享的。您只需要在每个线程中使用轻量级 VAO。

【讨论】:

以上是关于从非主线程加载的 VAO 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

从 Frida 的非主线程调用 API 来修改应用程序的 GUI

CoreAnimation:[EAGLContext renderbufferStorage:fromDrawable:] 是从非主线程调用的

非主线程中的QApplication

Cocoa - 从非主包加载资源

在非主线程里面使用NSTimer创建和取消定时任务

如何在主线程上安全地使用[NSTask waitUntilExit]?