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.
Receita
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:
- Qualquer simulação sensível ao dt (física, rede)
- Requisitos de replay e determinismo
- Separar FPS de renderização de Hz de simulação
- Combater jitter quando os tempos de frame aumentam
Exemplo de Trabalho
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:
- Mutação de física apenas em
FixedUpdate - Componente voltado para renderização atualizado após a simulação
- Hook
overstep_fractionpara alpha de interpolação
Análise Profunda
Como Funciona
- Loop Variável mede o tempo real do frame
delta_secs. - Acumulador Fixo consome tempo real em fatias fixas (por exemplo, 1/60 s).
- Espiral da morte se muitos passos fixos por frame - limite o número máximo de passos.
- Interpolação desenha entre as transformações de física anteriores e atuais.
Mapa de Agendamento
| 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 |
Armadilhas
- Física em
Updatecomdelta_secs- pilhas instáveis. Correção: mover apenas paraFixedUpdate. - Captura fixa sem limites - congelamento após um solavanco. Correção: número máximo de subpassos por frame (o padrão do Bevy ajuda).
- Esquecer a interpolação - a física parece travada em uma tela de 144 FPS. Correção: interpolar a transformação de renderização entre estados fixos.
- UI vinculada ao passo fixo - menus lentos. Correção: manter a UI em
Updatecom tempo variável. - Discrepância de tick de rede - dessincronização. Correção: alinhar a taxa de simulação do servidor com o Hz de
Fixed.
Alternativas
| 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 |
FAQs
Qual Hz fixo?
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.
Tipos de Tempo do Bevy?
Time variável, Time<Fixed> para agendamento fixo, Time<Virtual> para pausa/slow-motion.
Pausar o jogo?
Pausar Time<Virtual> ou desabilitar agendamentos enquanto o menu está aberto - a UI ainda anima se desejado.
Câmera lenta?
Escalar o fator de tempo virtual que afeta Update; decidir se a física também deve desacelerar.
Clamp de Delta?
Limitar um delta_secs enorme após um solavanco de carregamento para evitar teletransporte - padrão comum de no máximo 0.25s.
Orçamento de frame para profiling?
Spans do Tracy por agendamento; comparar ms de FixedUpdate vs ms de renderização.
Amostragem de entrada?
Coletar entrada uma vez por frame renderizado; aplicar no passo fixo via intenções em buffer.
Cutscenes?
Linha do tempo impulsionada pelo tempo fixo ou real, dependendo da sincronização com as necessidades da física.
Configuração do Bevy?
TimePlugin define o timestep fixo em App - consulte a documentação da versão para a API do recurso FixedTime.
Link para o básico?
Fundamentos de Desenvolvimento de Jogos Exemplo de recurso de Tempo.
Relacionado
- Física e Áudio - física fixa
- Motor Bevy - agendamentos
- Desempenho para Jogos - orçamento de frame
- Entrada e Eventos - sincronização de entrada
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+.