## SpellContextPool — SpellContext 对象池(Autoload: SpellContextPool) ## 权威来源:implementation_plan.md §2.1、S1 验收 P-S1-04 extends Node const POOL_SIZE: int = 32 # P-S1-04: pool size 不超过 32 var _pool: Array = [] # Array[SpellContext] var _in_use: PackedByteArray = PackedByteArray() var _slots: Array = [] # Array[SpellContext] 固定槽位 func _ready() -> void: _slots.resize(POOL_SIZE) _in_use.resize(POOL_SIZE) for i in POOL_SIZE: _slots[i] = SpellContext.new() _in_use[i] = 0 _pool.append(i) # 空闲 ID 表 ## 取出一个 SpellContext。若 has_persistent_memory=true 则保留 registers func acquire(caster_id: int, has_persistent_memory: bool = false) -> SpellContext: if _pool.is_empty(): push_warning("SpellContextPool: 池已耗尽,动态创建 SpellContext(建议上调 POOL_SIZE=%d)" % POOL_SIZE) var ctx_dyn := SpellContext.new() ctx_dyn.caster_id = caster_id if not has_persistent_memory: ctx_dyn.clear_registers() return ctx_dyn var slot_id: int = _pool[_pool.size() - 1] _pool.resize(_pool.size() - 1) var ctx: SpellContext = _slots[slot_id] _in_use[slot_id] = int(1) ctx.reset() ctx.caster_id = caster_id if not has_persistent_memory: ctx.clear_registers() return ctx func release(ctx: SpellContext) -> void: for i in _slots.size(): if _slots[i] == ctx: if _in_use[i] != 0: _in_use[i] = 0 _pool.append(i) return # 动态分配的(池已耗尽时)直接丢弃 func get_available_count() -> int: return _pool.size() func reset() -> void: _pool.clear() for i in _slots.size(): _in_use[i] = 0 _pool.append(i)