[英]Efficient 2D rendering with Glium
我正在使用Glium為正在編寫的仿真器進行渲染。 我拼湊了一些可行的方法(基於此示例 ),但我懷疑它的效率很低。 相關功能如下:
fn update_screen(display: &Display, screen: &Rc<RefCell<NesScreen>>) {
let target = display.draw();
// Write screen buffer
let borrowed_scr = screen.borrow();
let mut buf = vec![0_u8; 256 * 240 * 3];
buf.clone_from_slice(&borrowed_scr.screen_buffer[..]);
let screen = RawImage2d::from_raw_rgb_reversed(buf, SCREEN_DIMENSIONS);
glium::Texture2d::new(display, screen)
.unwrap()
.as_surface()
.fill(&target, MagnifySamplerFilter::Nearest);
target.finish().unwrap();
}
在高層次上,這就是我正在做的:
NesScreen
,它包含屏幕緩沖區,它是一個數組。 我的懷疑是,通過clone_from_slice
克隆整個屏幕緩沖區確實效率很低。 RawImage2d::from_raw_rgb_reversed
函數獲取傳遞給它的向量的所有權,所以我不確定如何避免克隆該如何做。
因此,有兩個問題:
這實際上效率低下嗎? 我沒有足夠的渲染知識來直覺了解。
如果是這樣,是否有更有效的方法來做到這一點? 我已經對Glium進行了很多搜索,但是2D渲染並沒有太多特定之處。
這將不是一個很好的答案,但是這里的一些內容可能會對您有所幫助。
首先:這真的效率低下嗎? 這真的很難說,尤其是OpenGL部分,因為OpenGL性能在很大程度上取決於何時需要/請求同步。
至於屏幕緩沖區的克隆:您僅復制180kb,這並不過分。 我很快在計算機上對其進行了基准測試,克隆一個180kb的向量大約需要5µs,這的確不是很多。
請注意,您可以不使用任何方法來創建RawImage2d
,因為所有字段都是公共的。 這意味着,如果您自己創建反向矢量,則可以避免簡單的5µs克隆。 但是 , 使用glium使用的方法反轉向量比克隆向量要慢得多。 在我的機器上,相同長度的向量需要170µs。 如果您只想達到60fps = 17ms每幀,這可能仍然可以忍受 ,但仍然不是很好。
您可以考慮在原始數組中使用正確的行順序來避免此問題。 或者,您可以直接在其上繪制帶有紋理的全屏四邊形(每個屏幕角一個頂點),而不是直接將紋理復制到幀緩沖區。 當然,您需要一個網格,一個着色器以及所有這些東西,但是您可以通過調整紋理坐標來“反轉”圖像。
最后,不幸的是,我對GPU執行OpenGL命令所需的時間並不了解。 我猜這不是最佳選擇,因為OpenGL沒有太多時間來安排您的命令,而是必須立即執行它們(強制同步)。 但這也許在您的情況下是無法避免的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.