如何从 Rust 中的其他线程绘制 OpenGL 三角形

How to draw OpenGL triangle from other thread in Rust

我正在通过这个例子学习 OpenGL 是 Rust:https://github.com/glium/glium/blob/84f82d3098fbc75aa22160b47bf0a2bdada01f07/examples/triangle.rs#L141

它使用称为 glutin 的 window 包装器,并像这样绘制三角形 一次

let draw = move || {
    // building the uniforms
    let uniforms = uniform! {
        matrix: [
            [1.0, 0.0, 0.0, 0.0],
            [0.0, 1.0, 0.0, 0.0],
            [0.0, 0.0, 1.0, 0.0],
            [0.0, 0.0, 0.0, 1.0f32]
        ]
    };

    // drawing a frame
    let mut target = display.draw();
    target.clear_color(0.0, 0.0, 0.0, 0.0);
    target.draw(&vertex_buffer, &index_buffer, &program, &uniforms, &Default::default()).unwrap();
    target.finish().unwrap();
};

问题是:如何从其他线程中提取?为了调用 draw,我必须与其他线程共享它,但是像 programindex_buffervertex_bufferdisplay 这样的类型不是 Send+Sync.

从其他线程中提取在 window 应用程序中至关重要,所以我猜他们想到了它并且应该有一种简单的方法来做到这一点,但我迷路了。

你不能用 Glium 做到这一点,但这不太可能成为问题。

根据问题 #459,重申内存模型不再允许 API 中的图形资源与多个线程共享。旧版本的 Glium 无论如何都通过后台线程同步调用,这意味着并行化这些调用没有任何好处。尽管 OpenGL 有多种方法可以拥有多个上下文并在它们之间共享某些资源,但对于 Rust API 来说太复杂且效率低下,无法确保安全和正确使用。

Drawing from other threads is crucial in a window application

请注意,无法通过多线程执行绘制操作并不意味着应用程序本身就变成了single-threaded。这并不重要。处理此问题的最佳方法是将同一个线程专用于渲染并将来自其他线程的命令引入其中。

另请参阅:

  • OpenGL multithreading/shared context and glGenBuffers