Loops e Sincronização de Jogos
Timestep fixo vs. variável no Bevy - física estável, renderização suave e independência da taxa de quadros.
Busque em todas as páginas da documentação
Timestep fixo vs. variável no Bevy - física estável, renderização suave e independência da taxa de quadros.
fn physics_step(mut q: Query<&mut Position>, time: Res<Time<Fixed>>) {
let dt = time.delta_secs();
for mut pos in &mut q {
pos.0 += dt * 10.0;
}
}
// App::new().add_systems(FixedUpdate, physics_step);Quando usar isso:
use bevy::prelude::*;
#[derive(Component)]
struct SimPosition(f32);
#[derive(Component)]
struct RenderPosition(f32);
fn fixed_sim(mut q: Query<&mut SimPosition>, time: Res<Time<Fixed>>) {
for mut sim in &mut q {
sim.0 += 100.0 * time.delta_secs();
}
}
fn interpolate_render(
sim_q: Query<&SimPosition>,
mut render_q: Query<&mut RenderPosition>,
time: Res<Time<Fixed>>,
) {
let alpha = time.overstep_fraction();
for (sim, mut render) in sim_q.iter().zip(render_q.iter_mut()) {
// Simplificado: no motor completo, armazene a simulação anterior para lerp real
render.0 = sim.0;
let _ = alpha;
}
}O que isso demonstra:
FixedUpdateoverstep_fraction para alpha de interpolaçãodelta_secs.| Agendamento | Sistemas Típicos |
|---|---|
FixedUpdate | Física, simulação determinística |
Update | Entrada, máquinas de estado de animação |
PostUpdate | Câmera segue a transformação interpolada |
Update com delta_secs - pilhas instáveis. Correção: mover apenas para FixedUpdate.Update com tempo variável.Fixed.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Tudo Variável | Arcade simples sem física | Pilhas, ragdolls, física competitiva |
| Simulação Fixa de 30 Hz | Orçamento de celular | PC de alta taxa de atualização competitiva |
| Rede lockstep determinística | RTS peer-to-peer | Apenas single-player |
| Motor personalizado com acumulador manual | Não Bevy | Já nos agendamentos do Bevy |
60 Hz é um padrão comum; 30 Hz em dispositivos móveis economiza CPU; jogos de luta podem precisar de 60+ com netcode de rollback.
Time variável, Time<Fixed> para agendamento fixo, Time<Virtual> para pausa/slow-motion.
Pausar Time<Virtual> ou desabilitar agendamentos enquanto o menu está aberto - a UI ainda anima se desejado.
Escalar o fator de tempo virtual que afeta Update; decidir se a física também deve desacelerar.
Limitar um delta_secs enorme após um solavanco de carregamento para evitar teletransporte - padrão comum de no máximo 0.25s.
Spans do Tracy por agendamento; comparar ms de FixedUpdate vs ms de renderização.
Coletar entrada uma vez por frame renderizado; aplicar no passo fixo via intenções em buffer.
Linha do tempo impulsionada pelo tempo fixo ou real, dependendo da sincronização com as necessidades da física.
TimePlugin define o timestep fixo em App - consulte a documentação da versão para a API do recurso FixedTime.
Fundamentos de Desenvolvimento de Jogos Exemplo de recurso de Tempo.
Versões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026