簡體   English   中英

Glium的高效2D渲染

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM