gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:29:41 27 4
gpt4 key购买 nike

我通过以下示例学习OpenGL is 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,我必须与其他线程共享它,但是像programindex_buffervertex_bufferdisplay这样的类型不是Send+Sync
在窗口应用程序中,从其他线程进行绘制至关重要。因此,我想他们想到了它,应该有一个简单的方法来完成它,但是我迷路了。

最佳答案

您无法使用Glium做到这一点,但这不太可能成为问题。
根据问题#459,重申了内存模型以不再允许与多个线程共享API中的图形资源。无论如何,旧版本的Glium都通过后台线程同步调用,这意味着并行执行这些调用没有任何好处。而且,尽管OpenGL有多种方法可以具有多个上下文并在其中共享某些资源,但是对于Rust API而言,要确保安全正确地使用它太复杂且效率低下。

Drawing from other threads is crucial in a window application


请注意,无法通过多个线程执行绘制操作并不意味着应用程序本身成为单线程的。这不是至关重要的。最好的方法是将同一线程专用于渲染并将其他线程中的命令传递到该线程中。
也可以看看:
  • OpenGL multithreading/shared context and glGenBuffers
  • 关于opengl - 如何从Rust中的其他线程绘制OpenGL三角形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64262940/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com