我正在使用 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 渲染并没有太多具体的内容。