rust - 为什么 Bevy 在绘制我的许多 SpriteComponent 时遇到困难?

标签 rust bevy

以下程序是大量 SpriteComponent 的一个非常简单的示例。在此示例中,通过 FPS 计数器,您可以看到 SpriteComponent 的成本有多么高。

我确实注意到,如果我重复使用 Material 句柄,它确实会加快速度,但即使如此,速度仍然非常慢。另外,我不确定重复使用 Material handle 是否安全。我注意到在突破示例中,他们没有重用句柄。

尽管如此,在没有额外系统的情况下,我每秒可以获得大约 10 帧。

use bevy:: {
    prelude::*,
};

struct Box;
struct Name(String);
#[derive(Default)]
struct FPSCounter(Timer,u32);


const WIDTH: f32 = 640.0;
const HEIGHT: f32 = 480.0;

pub struct drawPlugin;

impl Plugin for drawPlugin {
    fn build(&self, app: &mut AppBuilder) {
        app
            .add_resource(FPSCounter(Timer::from_seconds(1.0,true),0))
            .add_startup_system(setup.system())
            .add_system(fps_counter.system());
    }
}

fn fps_counter(time: Res<Time>, mut timer: ResMut<FPSCounter>) {
    timer.0.tick(time.delta_seconds);
    timer.1 += 1;
    if timer.0.finished {
        println!("One-{}",timer.1);
        timer.1 = 0;
    }
}

fn main() {
    App::build()
        .add_resource(WindowDescriptor {
            title: "Test Prog!".to_string(),
            width: WIDTH as u32,
            height: HEIGHT as u32,
            vsync: true,
            resizable: false,
            ..Default::default()
        })
        .add_default_plugins()
        .add_plugin(drawPlugin)
        .run();
}

fn setup(mut cmds: Commands, mut mats: ResMut<Assets<ColorMaterial>>,asset_server: Res<AssetServer>) {
    const sq_width: f32 = 10.0;
    const sq_height: f32 = 10.0;
    let left = -(WIDTH /2.0) + sq_width / 2.0;
    let right = (WIDTH / 2.0) - sq_width / 2.0;
    let top = (HEIGHT / 2.0) - sq_height / 2.0;
    let bot = -(HEIGHT / 2.0) + sq_height / 2.0;
    let mymat = mats.add(Color::rgb(1.0,0.0,0.0).into());
    cmds
    .spawn(Camera2dComponents::default())
    .spawn(UiCameraComponents::default());
    for box_num2 in 1..=30 {
        for box_num in 1..=30 {
            cmds.spawn(SpriteComponents {
                material: mymat,
                translation: Translation(Vec3::new(left + ((sq_width + 1.0) * box_num as f32),top - ((sq_height + 1.0) * box_num2 as f32),0.0)),
                sprite: Sprite {
                    size: Vec2::new(sq_width,sq_height),
                },
                ..Default::default()
            }).with(Box {}).with(Name("Box1".to_string()));
        }
    }
}

最佳答案

这里可能有几件事。

  1. Bevy 尚未在渲染器中进行任何批处理,
  2. Rust Debug模式很慢,这在此处讨论 https://github.com/bevyengine/bevy/issues/346 .

听起来这对你来说主要是第二个问题。要解决此问题,您可以运行 Debug模式并在 cargo.toml 中设置一些优化。例如我有

[profile.dev]
opt-level = 3

这使得初始构建速度有点慢,但之后似乎对构建时间没有太大影响。如果您想要进行更详细的调试,您可能会发现需要调整或删除此设置。

关于rust - 为什么 Bevy 在绘制我的许多 SpriteComponent 时遇到困难?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63590141/

相关文章:

rust - 没有显示过分的文字,我也不知道为什么

rust - 如何迭代 Bevy 查询并保留对迭代值的引用以便稍后使用它?

rust - println 中链迭代器之间的不同行为!从变量

rust - 无法在 self.attribute 上移出 Box::into_raw 的借用内容

rust - 如何将编译时未知数量的迭代器压缩在一起?

rust - 在字符串上创建闭包返回迭代器

使用rust (Bevy) : ECS Network data structure

rust - 使用Bevy,如何在创建后获取和设置Window信息?

types - 使用相同的 Rust channel (mpsc) 发送不同的类型