如何查看LibGdx中MoveToAction对象池的活跃大小等参数?
如何查看LibGdx对象池的活跃大小及状态参数?
查看池状态的方法
LibGdx的Pool类内置了几个方法直接获取池的状态参数:
getActive():返回当前被借出(活跃使用中)的对象数量getFree():返回当前池中空闲可复用的对象数量getMax():返回池的最大容量(你构造时传入的第二个参数60)getInitialCapacity():返回池的初始容量(你构造时传入的第一个参数6)
你可以在调用obtain()或动作执行的关键节点打印这些值,验证池的管理状态:
MoveToAction move = poolMoveAction.obtain(); // 打印池状态 System.out.println("当前活跃对象数: " + poolMoveAction.getActive()); System.out.println("当前空闲对象数: " + poolMoveAction.getFree()); move.setPosition(baseX, baseY + getHeight()*0.1f); move.setDuration(0.2f); addAction(move);
重要提醒:动作不会自动回池
你提到“假设动作结束后会自动重置并返回池中”——这是错误的。LibGdx的Action执行完毕后,不会自动放回对象池,必须手动调用pool.free(action)完成回收,否则被借出的对象会一直处于活跃状态,池的getActive()值会持续增长,直到达到最大容量后被迫创建新对象,失去池化的意义。
手动回收的实现方式
推荐用SequenceAction把移动动作和回收动作绑定,确保动作结束后立即回收:
MoveToAction move = poolMoveAction.obtain(); move.setPosition(baseX, baseY + getHeight()*0.1f); move.setDuration(0.2f); // 创建回收动作 RunnableAction recycleAction = new RunnableAction(); recycleAction.setRunnable(() -> poolMoveAction.free(move)); // 组合动作:先执行移动,完成后回收 SequenceAction sequence = new SequenceAction(move, recycleAction); addAction(sequence);
也可以自定义带自动回收的MoveToAction,简化代码:
class RecyclableMoveToAction extends MoveToAction { private Pool<RecyclableMoveToAction> pool; public void setPool(Pool<RecyclableMoveToAction> pool) { this.pool = pool; } @Override public boolean act(float delta) { boolean isFinished = super.act(delta); if (isFinished && pool != null) { pool.free(this); } return isFinished; } }
对应的对象池创建代码:
Pool<RecyclableMoveToAction> poolMoveAction = new Pool<>(6, 60) { @Override protected RecyclableMoveToAction newObject() { RecyclableMoveToAction action = new RecyclableMoveToAction(); action.setPool(this); return action; } };
验证效果
当你完成手动回收后,再次打印getActive()和getFree():
- 执行移动动作时,
getActive()会增加1 - 动作结束回收后,
getActive()减少1,getFree()增加1 - 重复操作后,
getFree()会稳定在合理范围,不会持续创建新对象
内容的提问来源于stack exchange,提问作者Tony Immanuvel
相关产品推荐
相关产品推荐

