#rust #bevy
#Ржавчина #bevy
Вопрос:
Следующая программа является очень минималистичным примером большого количества SpriteComponents. В этом примере со счетчиком кадров в секунду вы можете видеть, насколько дорогостоящими кажутся SpriteComponents.
Я заметил, что если я повторно использую дескриптор материала, это ускоряет процесс, но даже при этом скорость невероятно низкая. Кроме того, я не уверен, насколько безопасно повторно использовать дескриптор материала. Я заметил, что в примере breakout они не использовали дескрипторы повторно.
Тем не менее, без дополнительных систем я получаю около 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(amp;self, app: amp;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. Вы компилировали свою программу в режиме отладки или в режиме выпуска (
--release
)? Обратите внимание, что Cargo создает все зависимости в том же режиме, что и программа (хотяstd
предварительно скомпилирована и всегда находится в режиме выпуска).2. Это определенно проблема с отладкой. В релизе FPS соответствует ожиданиям. Возможно, я просто не могу запустить debug даже для тестирования.
3. Взгляните на профили грузов . Вы можете включить некоторые оптимизации в профиле отладки (в котором включена информация об отладке).
4. Возможно, связано: github.com/bevyengine/bevy/issues/346
Ответ №1:
Здесь, вероятно, есть несколько вещей.
- Bevy пока не выполняет пакетную обработку в программе визуализации,
- Режимы отладки Rust работают медленно, это обсуждается здесь https://github.com/bevyengine/bevy/issues/346.
Похоже, что для вас это в основном вторая проблема. Чтобы обойти это, вы можете запустить режим отладки с некоторыми оптимизациями, установленными в вашем cargo.toml
. Например, у меня есть
[profile.dev]
opt-level = 3
Это делает начальные сборки немного медленнее, но после этого, похоже, не имеет большого значения для времени сборки. Возможно, вам потребуется настроить или удалить этот параметр, если вы хотите выполнить более подробную отладку.
Комментарии:
1. Похоже, что bevy теперь поддерживает пакетную обработку спрайтов bevyengine.org/news/bevy-0-6/#sprite-batching