【问题标题】:Fastest way to deal with many sprites in bevy-engine在 bevy-engine 中处理许多精灵的最快方法
【发布时间】:2021-07-16 10:19:50
【问题描述】:

我正在使用 Rust 和 BevyEngine 构建一个元胞自动机可视化“游戏”。目前,在初始化世界时,我为每个单元生成一个精灵。在每次更新中,精灵的颜色都会根据它是活着还是死亡而改变。

for (grid_pos, mut color_mat)  in query.iter_mut() {
    let cell_state = world.0[grid_pos.1][grid_pos.0];

    match cell_state {
        0 => *color_mat = materials.dead_cell.clone(),
        1 => *color_mat = materials.alive_cell.clone(),
        _ => (),
    }
}

问题是,当处理越来越大的地图时,精灵的数量会变得非常多。所以我想知道当我只在活细胞的位置生成一个精灵并在细胞死亡时将其移除时是否会更快。

所以我的问题是:如果我为每个网格位置生成所有精灵会更快,还是只在细胞存活时生成精灵并在细胞死亡时将其移除是更好的方法。

【问题讨论】:

  • 这是一个很难从远处回答的问题,而真正明确回答的唯一方法是对两个版本进行基准测试。

标签: rust bevy


【解决方案1】:

我不熟悉 Bevy 的性能特征,但通常情况下,要获得绘制元胞自动机的良好性能,您不希望为每个单元存储“精灵”对象,而是存储一组只是细胞状态,并以某种有效的批处理形式绘制它们。

元胞自动机的状态基本上是一个图像(可能是一个具有相当大块像素的图像)。所以,这样对待它:将细胞状态复制到纹理中,然后绘制纹理。如果您希望单元格看起来比小方块更漂亮,请对片段着色器进行编程来做到这一点。 (例如,您可以读取 CA 状态纹理并使用它来决定在一个正方形的边界内绘制其他几个纹理中的哪一个。)

这可能必要为您的用例获得可接受的性能,但它肯定会比管理单个精灵更快。

【讨论】:

  • 完美。没想到。我已经将单元状态存储在一个单独的数组中。但是从各州构建纹理是一个好主意。谢谢。
猜你喜欢
  • 2023-02-08
  • 2013-10-05
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2021-03-31
  • 1970-01-01
相关资源
最近更新 更多