graph LR
subgraph "Host 每 22ms"
A["_batch_sync_entity_positions"] --> B["PackedFloat32Array [eid,x,y,eid,x,y,...]"]
C["_batch_sync_entity_health"] --> D["PackedFloat32Array [eid,hp,maxhp,...]"]
end
B --> E["@rpc unreliable → Client"]
D --> E
E --> F["_apply_entity_interpolation"]
# main.gd func _batch_sync_entity_positions() -> void: if _entities.is_empty(): return var data := PackedFloat32Array() var shield_data := PackedFloat32Array() var rotation_data := PackedFloat32Array() for eid: intin _entities: var node = _entities[eid] if is_instance_valid(node): data.append(eid asfloat) data.append(node.global_position.x) data.append(node.global_position.y) # 护盾和旋转数据也一并打包 if node.has_method("get_network_shield"): shield_data.append(eid asfloat) shield_data.append(float(node.get_network_shield())) shield_data.append(float(node.get_network_max_shield())) if node.has_method("get_network_rotation"): rotation_data.append(eid asfloat) rotation_data.append(float(node.get_network_rotation())) if data.size() > 0: _rpc_sync_entity_positions.rpc(data) if shield_data.size() > 0: _rpc_sync_entity_shields.rpc(shield_data) if rotation_data.size() > 0: _rpc_sync_entity_rotations.rpc(rotation_data)