创建精灵池

转自:http://blog.sina.com.cn/s/blog_a26142180101czoj.html

GenericPool类是AndEngine游戏引擎的一个非常重要的组成部分,它考虑到了移动平台硬件资源的局限性。为了开发出一款流畅的游戏,在整个漫长的过程中我们应该尽可能的创建最少数量的对象。这并不意味着我们应该限制屏幕上只有4,5个对象,我们应该考虑回收已经创建的对象,这就需要对象池来发挥作用了。

准备。。。。。。

    仔细阅读SpritePool类,需要的同学在评论中留邮箱。

它如何工作。。。。。

    GenericPool类的思想很简单,需要对象时就创建新的对象,不需要时就抛弃它们。我们可以告诉对象池只分配有限数量的对象,并存储它们供以后使用。我们可以调用obtainPoolItem()方法从池中获取一个对象,它将用于某个关卡中,可能是一个敌人。一旦这个敌人对象被玩家摧毁,我们可以调用recyclePoolItem(pItem)方法来将这个对象回收到对象池中。这让我们避免了垃圾收集调用,并可以大大降低新对象所占用的内存空间。

    类中的四种方法只有部分需要使用到池,很明显在使用池之前我们必须创建它。除构造方法的其他三种方法定义了怎样分配对象,怎样获取一个对象,一旦对象被回收会发生些什么,或当我们使用完对象后,将它们重新存储到池中,直到我们需要一个新的对象。对象池不仅仅用于回收精灵,所以我们将深入的了解每个方法的用法,从构造方法开始。

    第一步,我们必须传递池对象构造方法所需的任何对象。为了创建Sprite对象,我们需要得到TextureRegionVertexBufferObjectManager对象。这不是什么新东西,但要记住GenericPool类并不限制为精灵创建池。我们可以为任何类型的对象或数据类型创建池。关键需要注意的是,使用池的构造方法是为了获取必要的参数,然后传递到池对象中,并用于分配。

    第二步,我们重写onAllocatePoolItem()方法。如果池需要分配一个新的对象,它将在任何时候调用这个方法,直到池中所有被回收的对象都在使用中。这里我们需要注意的是这个方法会返回一个新的对象实例。

    第三步涉及到获取方法的使用,用于检索被用在游戏中的池中对象。我们可以看到obtainPoolItem()方法需要我们传入pXpY参数,并使用到setPosition(pX,pY)方法中,用于重新定位精灵。接着继续设置精灵的可见性为true,允许更新精灵,以及设置颜色初始值为白色。在任何情况下,这些方法都可以用于初始化对象的属性值,或定义为其他所需的属性值。下面将演示从池中获取一个新的精灵对象,并添加到场景中:

Sprite sprite = pool.obtainPoolItem(10, 10);

mScene.attachChild(sprite);

    最后介绍recyclePoolItem(pItem)方法,pItem表示被回收到池中的对象。使用这个方法需要注意的是,将在游戏中禁用该回收对象的所有属性。就精灵而言,为了提高性能,精灵将被存储在池中,我们设置可见性为false,忽略精灵的更新,清除任何实体修饰符和更新处理方法,因此它们将不再运行直到我们获取一个新的精灵。

    即使不使用池,当一个实体不再使用的时候,我们也应该调用它的setVisible(false)setIgnoreUpdate(true)方法。不断的添加和分离实体可能会激活垃圾收集器,并在游戏过程中出现卡帧的现象。

更多。。。。。。

    创建池来处理对象回收是非常重要的,这么做可以提高游戏性能,但是游戏第一次初始化的时候,池中并没有任何可以使用的对象。This means that, depending on how many objects the pool will need to allocate in order to satisfy the maximum number of objects throughout a full level。玩家可能会注意到在开始几分钟里游戏帧速率突然发生中断,为了避免这样的问题,我们可以在加载游戏的时候预先分配池对象,以避免在游戏过程中创建任何对象。

    为了在加载的时候分配大量的池中对象,我们可以在任何继承GenericPool的类中调用batchAllocatePoolItems(pCount)方法,pCount表示我们想要分配的对象数量。请记住,加载的对象如果多余我们所需的对象,就会造成一种资源浪费,但是如果我们不能分配足够的对象,可能会引起卡帧现象。例如,为了确定游戏中我们该分配多少敌人对象,我们可以建立一个公式,比如说默认敌人的数量乘以关卡难度。然而所有游戏都是不同的,创建对象可以使用类似的公式。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值