Почему у Беви возникают проблемы с отрисовкой многих моих компонентов Sprite?

Следующая программа является очень минималистичным примером большого количества компонентов Sprite. В этом примере с помощью счетчика FPS вы можете увидеть, насколько дорогими кажутся SpriteComponents.

Я заметил, что если я повторно использую ручку материала, это действительно ускоряет работу, но даже все же скорость невероятно низкая. Кроме того, я не уверен, насколько безопасно повторно использовать ручку материала. Я заметил в примере прорыва, они не использовали повторно ручки.

Тем не менее, без дополнительных систем я получаю около 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()));
        }
    }
}

0 ответов

Здесь, наверное, есть несколько вещей.

  1. Беви пока не выполняет пакетную обработку в рендерере,
  2. Режимы отладки Rust медленные, это обсуждается здесь https://github.com/bevyengine/bevy/issues/346.

Похоже, это в основном для вас второй вопрос. Чтобы обойти это, вы можете запустить режим отладки с некоторыми оптимизациями, установленными в вашем cargo.toml. Например, у меня есть

[profile.dev]
opt-level = 3

Это делает начальную сборку немного медленнее, но после этого, похоже, не слишком сильно влияет на время сборки. Возможно, вам потребуется изменить или удалить этот параметр, если вы хотите выполнить более подробную отладку.

Другие вопросы по тегам