首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Glium的高效二维渲染

基于Glium的高效二维渲染
EN

Stack Overflow用户
提问于 2017-03-28 02:29:53
回答 1查看 1.1K关注 0票数 0

我正在使用Glium为我正在编写的模拟器进行渲染。我拼凑出了一些有用的东西(基于这个例子),但我怀疑这是相当低效的。以下是相关的功能:

代码语言:javascript
复制
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渲染。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-28 14:19:31

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

首先,这真的没有效率吗?这很难说,特别是OpenGL部分,因为OpenGL性能在很大程度上取决于何时需要/请求同步。

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

请注意,无需使用方法就可以创建RawImage2d,因为所有字段都是公共的。这意味着,如果你自己创建一个反向向量,你就可以避免简单的5s克隆。然而,用胶质细胞使用方法反转向量要比克隆向量要慢得多;在我的机器上,相同长度的向量需要170 s才能实现。如果你只想达到60 per =17 is每帧,这可能仍然是可以忍受的,但仍然不是很好。

您可以考虑在原始数组中使用正确的行排序以避免此问题。或者,您也可以,而不是直接复制纹理到框架缓冲区,只需绘制一个全屏四角(每个屏幕角一个顶点)的纹理。当然,你需要一个网格,一个阴影和所有的东西,但是你可以通过调整纹理坐标来“反转”图像。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43059662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档