我正在使用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函数拥有传递给它的向量的所有权,所以我不知道如何避免克隆。
因此,有两个问题:
发布于 2017-03-28 14:19:31
这不是一个很好的答案,但也许这里的一些东西可以帮助你。
首先,这真的没有效率吗?这很难说,特别是OpenGL部分,因为OpenGL性能在很大程度上取决于何时需要/请求同步。
至于屏幕缓冲区的克隆:您只是在复制180 As,这并不是太多。我很快在我的机器上对它进行了基准测试,克隆180 is的载体需要大约5秒的时间,这真的不是很多。
请注意,无需使用方法就可以创建RawImage2d,因为所有字段都是公共的。这意味着,如果你自己创建一个反向向量,你就可以避免简单的5s克隆。然而,用胶质细胞使用方法反转向量要比克隆向量要慢得多;在我的机器上,相同长度的向量需要170 s才能实现。如果你只想达到60 per =17 is每帧,这可能仍然是可以忍受的,但仍然不是很好。
您可以考虑在原始数组中使用正确的行排序以避免此问题。或者,您也可以,而不是直接复制纹理到框架缓冲区,只需绘制一个全屏四角(每个屏幕角一个顶点)的纹理。当然,你需要一个网格,一个阴影和所有的东西,但是你可以通过调整纹理坐标来“反转”图像。
最后,不幸的是,我不太了解GPU执行OpenGL命令所需的时间。我猜这不是最优的,因为OpenGL没有太多的空间来调度命令,而是必须立即执行它们(强制同步)。但也许在你的情况下这是不可避免的。
https://stackoverflow.com/questions/43059662
复制相似问题