处理贝弗利引擎中许多精灵的最快方法



我正在构建一个元胞自动机可视化"游戏";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(),
_ => (),
}
}

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

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

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

元胞自动机的状态基本上是一个图像(可能是一个像素相当粗的图像(。因此,可以这样处理:将细胞状态复制到纹理中,然后绘制纹理。如果你想让细胞看起来比小方块更漂亮,可以对碎片着色器进行编程。(例如,您可以读取CA状态纹理,并使用它来决定在一个正方形的边界内绘制其他几个纹理中的哪一个。(

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

最新更新