2

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

它使用名为 glutin 的窗口包装器,并像这样绘制一次三角形:

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,我必须与其他线程共享它,但是像program, index_buffer, vertex_buffer,这样display的类型不是Send+Sync

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

4

1 回答 1

3

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

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

从其他线程绘图在窗口应用程序中至关重要

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

也可以看看:

于 2020-10-08T13:41:28.537 回答