You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查看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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:45:15