[英]How to draw OpenGL triangle from other thread in Rust
我正在通過這個例子學習 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
。
從其他線程繪制在窗口應用程序中至關重要,所以我猜他們想到了它,應該有一個簡單的方法來做到這一點,但我迷路了。
你不能用 Glium 做到這一點,但這不太可能成為問題。
根據問題#459 ,內存模型被重申為不再允許 API 中的圖形資源與多個線程共享。 舊版本的 Glium 無論如何都通過后台線程同步調用,這意味着並行化這些調用沒有任何好處。 盡管 OpenGL 有多種方法可以擁有多個上下文並在它們之間共享某些資源,但對於 Rust API 來說,它太復雜且效率低下,無法確保安全和正確的使用。
從其他線程繪制在窗口應用程序中至關重要
請注意,無法通過多個線程執行繪制操作並不意味着應用程序本身變為單線程。 這不是關鍵。 解決這個問題的最好方法是將同一線程專用於渲染,並將來自其他線程的命令引入其中。
也可以看看:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.