问题描述
以下程序是大量SpriteComponents的非常简单的示例。在此示例中,使用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()));
}
}
}
解决方法
这里可能有几件事。
- Bevy尚未在渲染器中进行任何批处理,
- 锈调试模式很慢,这在https://github.com/bevyengine/bevy/issues/346中进行了讨论。
像这样的声音主要是给您的第二个问题。要解决此问题,您可以运行调试模式,并在cargo.toml
中进行一些优化。例如我有
[profile.dev]
opt-level = 3
这会使初始构建速度变慢,但之后似乎对构建时间没有太大影响。如果您想进行更详细的调试,可能会发现需要调整或删除此设置。