diff --git a/scripts/autoloads/bullet_manager.gd b/scripts/autoloads/bullet_manager.gd index f112cc0..d79386f 100644 --- a/scripts/autoloads/bullet_manager.gd +++ b/scripts/autoloads/bullet_manager.gd @@ -39,7 +39,7 @@ func _gd_integrate(delta: float) -> void: while i < _active_count: var base: int = i * BULLET_STRIDE # homing 判别在调用方完成:绝大多数冷数据子弹(纯 pierce/bounce/状态/荷载) - # 不归航,避免为它们付一次完整函数调用(实测 1500 弹省约 87%) + # 不归航,避免为它们付一次完整函数调用(实测 1500 弹省约 64%) if has_cold and _bullet_contexts.has(i) and _bullet_contexts[i].has("homing_strength"): _apply_homing(i, base, delta) # 转向须在位置积分之前,子弹当帧即沿新方向前进 _data[base + 0] += _data[base + 2] * delta # x += vx * dt @@ -123,6 +123,7 @@ func _check_collision(bullet_idx: int, base: int) -> bool: _data[base + 7] *= float(cold.get("bounce_decay", 0.9)) if cold.has("homing_strength"): cold["homing_target_id"] = next_id # bounce 选目标,homing 接手追上去 + cold.erase("homing_retry_at") # 新目标有效,撤销退避(与重选成功路径对称) cold["bounce_remaining"] = bounce - 1 cold["visited_targets"] = visited _bullet_contexts[bullet_idx] = cold @@ -258,9 +259,9 @@ func _apply_homing(bullet_idx: int, base: int, delta: float) -> void: # 达 22.5ms,直接击穿 16.67ms 帧预算)。 # 用「bullet_idx 在活跃弹数中的占比」而非 bullet_idx % HOMING_RETRY_MS:后者在 # 弹数少于窗口宽度时只铺开 _active_count 毫秒(20 颗弹 → 20ms ≈ 1.2 帧,等于没 - # 打散),占比式则不论弹数多少都铺满整窗。取模仅作越界兜底(循环内 bullet_idx - # < _active_count 已保证不越界),使到期时刻无条件落在 [200, 400) ms。 + # 打散),占比式则不论弹数多少都铺满整窗。到期时刻落在 [200, 400) ms。 var jitter: int = (bullet_idx * HOMING_RETRY_MS) / maxi(1, _active_count) + # 取模在循环内不可达(bullet_idx < _active_count ⟹ jitter ≤ 199),仅作索引越界兜底 cold["homing_retry_at"] = now + HOMING_RETRY_MS + jitter % HOMING_RETRY_MS return cold.erase("homing_retry_at")