Rust 使用Glium的高效二维渲染

Rust 使用Glium的高效二维渲染,rust,glium,Rust,Glium,我正在使用Glium为我正在编写的模拟器进行渲染。我已经拼凑了一些基于的东西,但我怀疑这是相当低效的。以下是相关功能: fn update_screen(display: &Display, screen: &Rc<RefCell<NesScreen>>) { let target = display.draw(); // Write screen buffer let borrowed_scr = screen.borrow()

我正在使用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();
}
在高层次上,这就是我正在做的:

这是一个包含屏幕缓冲区的屏幕,它是一个数组。 将屏幕缓冲区克隆到向量中 从矢量数据创建纹理并进行渲染 我的怀疑是,通过克隆片克隆整个屏幕缓冲区是非常低效的。rawmage2d::from_raw_rgb_reversed函数拥有传递给它的向量的所有权,因此我不确定如何以避免克隆的方式执行此操作

因此,有两个问题:

这真的是低效的吗?我没有足够的经验直观地理解渲染的内容

如果是,有没有更有效的方法?我已经搜索了很多神经胶质细胞,但是对于2D渲染并没有太多的特殊性

这不是一个很好的答案,但这里可能有一些东西可以帮助你

首先:这真的是低效的吗?这真的很难说,尤其是OpenGL部分,因为OpenGL的性能很大程度上取决于何时需要/请求同步

至于屏幕缓冲区的克隆:您只是复制180kb,这并不太多。我很快在我的机器上对它进行了基准测试,克隆一个180kb的载体大约需要5µs,这真的不是很多

请注意,由于所有字段都是公共字段,因此可以不使用方法创建RawImage2d。这意味着,如果您自己创建反向向量,则可以避免简单的5µs克隆。然而,用克隆技术反转载体要比仅仅克隆载体慢得多;在我的机器上,相同长度的向量需要170µs。如果您只想达到每帧60fps=17ms,这可能仍然可以接受,但仍然不是很好

您可以考虑在原始数组中使用正确的行顺序来避免此问题。或者,您也可以不直接将纹理复制到帧缓冲区,只需为每个屏幕角绘制一个全屏四边形,每个顶点上都有纹理。当然,然后你需要一个网格,一个着色器和所有的东西,但是你可以通过调整纹理坐标来反转图像

最后,不幸的是,我不太了解GPU执行OpenGL命令所需的时间。我猜这不是最优的,因为OpenGL没有太多的空间来调度您的命令,但必须立即执行它们,强制同步。但在您的情况下,这可能是无法避免的。

我的怀疑是,通过克隆片克隆整个屏幕缓冲区是非常低效的。-你的档案怎么说?没有理由猜测。