Some time ago我问Canvas3D和QQFBO是否有相同的目的。我被告知他们这样做,我选择了两者中的Canvas3D,因为我更喜欢用JS编写代码。但是现在我遇到了一些非常严重的阻塞问题(在this question of mine结尾处描述)导致我考虑转移到QQFBO。我担心QQFBO也可能有限制,对我来说有问题,所以我的问题是:两者之间究竟有什么区别?
我知道两者基本上是一样的。我知道一些不同之处:
- 对于Canvas3D,您使用JS编写代码,使用C ++编写代码的QQFBO
- 与QQFBO不同,每个Canvas3D实例都有自己的OpenGL上下文,这需要一些时间进行初始化,这会阻止在几个Canvas3D之间共享GL资源。
- Canvas3D将我的所有GL命令放入队列并稍后执行。我认为这是为了支持多线程,这可能会提高性能。此外,它还保存了我的命令,以便以后进行“无变化”重绘,这可能会提高性能。但是副作用是我不应该在
onPaintGL()
中使用同步GL命令。
- Canvas3D非常错误 - gl.colorMask and gl.depthMask break everything,requesting GL ES 3.0 breaks everything,gl.MULTISAMPLE is missing。我希望QQFB可以减少错误,因为它更接近底层的OpenGL API,因为它是一个较旧的API。
- 使用QQFBO我想我可以访问Qt非常有用的C ++ GL类,例如QOpenGLShaderProgram,而使用Canvas3D,我必须编写纯GL代码,将GL包装在我自己的类中(就像我已经完成的那样)或使用像THREE.js这样的东西有缺点。
- 使用QQFBO,必须覆盖他的QQFBO :: Renderer子类的
synchronize
方法,并在此方法中的线程之间复制数据。 Canvas3D不需要这样的样板。
我也知道一些重要的相似之处:
- 我认为两者都会分配一个FBO并让你画画,而不是让你直接画到窗口
- 在Canvas3D中,您可以使用
createTextureFromSource()
GL扩展名的QTCANVAS3D_texture_provider
函数将任何QML项目作为自动更新的纹理获取。在QQFBO中你可以做同样的事情,但有另一个功能 - textureProvider()
。