(OpenGL / Emscripten的新手)
我正在构建一个股票交易客户端应用程序,需要40多个开放式图表。其中约50%处于某种“自由绘制”状态,这意味着它们显示蜡烛图以及其他线条/箭头/图像等。
在过去几个月中尝试了很多选项后,最后得出以下结论。
- HighCharts:易于使用但速度较慢;
- CanvasJS:更快但不够快
- WebAssembly + OpenGL:速度更快,但工作量更大(仍然值得投入)
我引导单个WebAssembly应用程序实例,并调用它上面的函数,让C ++使用OpenGL创建图表,该图表映射到WebGL(2)。一切正常运作。
我之所以选择(WebAssembly + OpenGL) -> Emscripten是因为有很多数字计算,而c ++也适合这项工作 :)
问题是WebGL在Chrome(59)中有大约10个上下文限制。因此,拥有40-100个WebGL上下文(图表)并不是一个明智的想法,我的直觉告诉我这是一种浪费OpenGL资源的方式,因为几乎总是将这么多上下文输出为静态图像,除非您滚动图表等。有没有人在将单个OpenGL上下文呈现到随机画布元素(或任何其他元素,其实并不重要)方面有很好的经验?
我的想法如下:
1.使用另一个线程中的离屏画布开始c++ OpenGL, https://github.com/OleksandrChekhovskyi/emscripten-offscreen-canvas-test/blob/master/main.c#L35 2.Javascript告诉c++渲染图表
3.通过共享的Uint8Array与JS共享/渲染OpenGL后备缓冲区...SharedArrayBuffers由C++在JS Worker线程中填充,并且主(渲染)线程仅读取/转换以将图像写入画布/HTML元素。
我似乎找不到其他不创建许多OpenGL上下文的方法。
问题是:这样做的性能如何,基本上将OpenGL缓冲区复制到JavaScript等等?它是否偏离了轨道?
谢谢
p.s. 底部的图表(带红色波浪线)现在由WebAssembly和OpenGL(GLFW等)渲染
------ 更新 -----
选项2:始终将内容渲染到同一画布,并使用JS将画布上下文复制到另一个画布中(但如果上下文更新,它可能会被擦除..)