fix(bullet): _swap_and_pop 回收末尾子弹时遗留冷数据,被下一颗复用槽位的子弹继承
pre-existing bug(非本期归航引入):冷数据的搬移与擦除都写在 if idx != last 分支内,
故 idx == last(回收最后一颗子弹)时它的 _bullet_contexts[idx] 被原样留在该 key 上,
下一颗复用该槽位的普通子弹会继承整份冷数据。运行时已复现:
after recycle: active=0 ctx_keys=[0]
plain bullet idx=0 inherits_cold=true cold={"homing_strength":3.0,...,"pierce_remaining":7}
归航之前症状只是一次隐形的多余穿透,故长期未被发现;归航把它放大成肉眼可见的
「普通子弹拐弯追敌」,且继承 homing 的幽灵弹会持续走重选路径付出查询开销。
修法是把 erase 移出该 if(缺键时 erase 为安全 no-op),idx != last 的搬移行为一行不改。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -148,6 +148,10 @@ func _swap_and_pop(idx: int) -> void:
|
||||
_bullet_contexts.erase(last)
|
||||
elif _bullet_contexts.has(idx):
|
||||
_bullet_contexts.erase(idx)
|
||||
else:
|
||||
# idx == last:无搬移,但它的冷数据同样必须清掉,
|
||||
# 否则遗留在该 key 上被下一颗复用此槽位的子弹继承(erase 缺键为安全 no-op)
|
||||
_bullet_contexts.erase(idx)
|
||||
_active_count -= 1
|
||||
|
||||
# ── 对外接口 ─────────────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user