【发布时间】:2017-06-13 03:46:00
【问题描述】:
我创建了一个由 GLX 和 GLEW 支持的 C++ 和 OpenGL 动画引擎,通过 SWIG 封装在一个 Node.js 模块中。目标是在浏览器进程中使用 Electron 应用程序中的引擎。
引擎看起来相当稳定。它支持多上下文,在所有相关操作之前绑定正确的 OpenGL 上下文,在几乎所有可能的操作之后检查错误,并由相当大的测试套件提供支持。
在电子应用程序之外,一切正常。然而,神秘的是,通常在 Electron 之外运行的简单脚本在浏览器或渲染器进程中的 Electron 应用程序中都失败了。
症状
-
glGenX生成的任何内容都返回 0 -
glGetString(GL_VERSION)返回null,之后glGetError不返回错误
事实
按此顺序:
- OpenGL 上下文是使用
glXCreateContextAttribsARB和合理的 FB 配置创建的。返回值非零。 -
XSync(display, false)被调用以等待 X 错误。没有错误导致程序崩溃,设置 X 错误处理程序不会产生任何结果。 - 使用
glXMakeCurrent将上下文设为当前,glGetError未报告任何错误。 - 上下文是直接的,用
glXIsDirect检查。 - GLEW 初始化为
glewInit,返回GLEW_OK。 - 本例中的操作发生在同一个线程中。在 Electron 应用程序中,上下文被创建并立即在同一过程中使用;上下文的创建本身在同一方法中查询版本。 Electron 应用“就绪”前后的相同症状。
我对此感到很困惑。我正在检查的所有内容似乎表明上下文创建正确,但在其他方面显示已损坏或功能失调。
发生了什么事?我还能检查什么?
【问题讨论】:
-
Node.js 总是多线程的,你是异步调用 C++ 吗?
-
更准确地说,我所有的 C++ 调用都是同步的。上下文的创建和版本查询发生在同一个 C++ 方法中;除非 Node.js 正在执行一些我不知道的魔法(并且仅在 Electron 中?),否则这些操作肯定应该发生在同一个线程上。
-
您创建了多少个 GL 上下文?
-
@Luca 在这种情况下只有一个,但引擎可以安全地处理多个上下文。
-
你能提供一些代码吗?