⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 movingobjectpool.java

📁 基于java的一款游戏的故事。基于java的一款游戏的故事。基于java的一款游戏的故事。
💻 JAVA
字号:
package com.thinkenjoy.feitian;

/*
 * 创建新的对象并初始化的操作,可能会消耗很多的时间(实际上往往在程序运行状态中,从外部引入资源是
 * 个相对于其他程序动作来说非常缓慢的过程)。在这种对象的初始化工作包含了一些费时的操作的时候,尤
 * 其是这样。在需要大量生成这样的对象的时候,就可能会对性能造成一些不可忽略的影响。要缓解这个问
 * 题,除了选用更好的硬件和更棒的虚拟机以外,适当地采用一些能够减少对象创建次数的编码技巧,也是一
 * 种有效的对策。
 *
 * 对象池化的基本思路是:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,从而
 * 在一定程度上减少频繁创建对象所造成的开销。用于充当保存对象的“容器”的对象,被称为“对象池”。以此
 * 来看,对象池同样有对象创建的过程,但是这些对象会同样被保留下来用来被继续使用,以后就省略了再次
 * 创建的动作。就好比出租车和私车,出租车便捷但是每次搭都需要花时间去叫车,而私车除了第一次买的时
 * 候麻烦,以后都不用再在这上面花时间就可以直接使用了。但是,并非所有对象都适合拿来池化——因为维护
 * 对象池也要造成一定开销(内存开销)。
 *
 * 根据使用方法的不同,实际的情况可能与这一测量结果略有出入。在配置较高的机器和技术较强的虚拟机上,
 * 不宜池化的对象的范围可能会更大。不过,对于像网络和数据库连接这类重量级的对象来说,目前还是有池
 * 化的必要。 基本上,只在重复生成某种对象的操作成为影响性能的关键因素的时候,才适合进行对象池化。
 * 如果进行池化所能带来的性能提高并不重要的话,还是不采用对象池化技术,以保持代码的简明,而使用更
 * 好的硬件和更棒的虚拟机来提高性能为佳。 针对手机平台来说,因为手机本身性能相对于PC机并理想,所以
 * 池在手游中会经常被使用到。
 *
 * 是否建池往往取决于对象的级别,或者说所要创建的对象对内存的损耗,比如只是一些指针或者整形对象的
 * 创建,这样如果使用了池只是浪费内存空间而已,而如果我们创建游戏中的敌人或者子弹等等对象的时候,
 * 因为这些物体包含了图片以及很多其他信息并且被使用频率非常高,那么就非常有使用池的必要。
 *
 * 可以通过WTK自带的内存监视器来监视游戏中内存的使用状况:通过,属性--监视--(勾选)内存监视器 打开,
 * 以后在eclipse上使用模拟器的时候会有内存使用状况的显示。
 */
/**
 * 对象池
 * @author Administrator
 */
public class MovingObjectPool {
  private MovingObject firstFree;

  private MovingObject lastFree;

  private MovingObject firstUsed;

  private MovingObject oldestUsed;

  private MovingObject lastUsed;

  public MovingObjectPool(MovingObject[] initObjects) {
    if (initObjects == null || initObjects.length < 2)
      return;

    firstFree = initObjects[0];
    lastFree = initObjects[initObjects.length - 1];

    for (int i = 0; i < initObjects.length; i++) {
      if (i < initObjects.length - 1)
        initObjects[i].setNextLinked(initObjects[i + 1]);
      else
        initObjects[i].setNextLinked(null);

      if (i > 0)
        initObjects[i].setPrevLinked(initObjects[i - 1]);
      else
        initObjects[i].setPrevLinked(null);
    }
  }

  /**
   * 得到下一桢图片
   * @return
   */
  public MovingObject getNextFree() {
    if (firstFree != null) {
      if (firstFree.getNextLinked() != null)
        firstFree.getNextLinked().setPrevLinked(null);

      MovingObject newFirstFree = firstFree.getNextLinked();

      firstFree.setNextLinked(null);
      if (lastUsed != null) {
        firstFree.setPrevLinked(lastUsed);
        lastUsed.setNextLinked(firstFree);
      }
      lastUsed = firstFree;

      if (oldestUsed == null)
        oldestUsed = firstFree;
      if (firstUsed == null)
        firstUsed = firstFree;

      if (lastFree == firstFree)
        lastFree = null;

      MovingObject actorToReturn = firstFree;
      firstFree = newFirstFree;

      return actorToReturn;
    }

    MovingObject objectToReturn = oldestUsed;
    if (oldestUsed == null) {
      oldestUsed = firstUsed;
      objectToReturn = oldestUsed;
    }

    oldestUsed = oldestUsed.getNextLinked();
    return objectToReturn;
  }

  public void dump() {
    System.out.print("FREE LIST: ");
    MovingObject a = firstFree;
    while (a != null) {
      System.out.print("{" + a + "} ");
      a = a.getNextLinked();
    }
    System.out.println("");

    System.out.print("USED LIST: ");
    a = firstUsed;
    while (a != null) {
      System.out.print("{" + a + "} ");
      a = a.getNextLinked();
    }
    System.out.println("");
    System.out.println("LastUsed: {" + lastUsed + "} OldestUsed: {"
                       + oldestUsed + "} firstUsed: {" + firstUsed +
                       "} LastFree: {"
                       + lastFree + "} firstFree: {" + firstFree + "}");

  }

  /**
   * 对象释放
   * @param objectToRelease
   */
  public void release(MovingObject objectToRelease) {
    if (objectToRelease.getPrevLinked() != null)
      objectToRelease.getPrevLinked().setNextLinked(objectToRelease.getNextLinked());
    if (objectToRelease.getNextLinked() != null)
      objectToRelease.getNextLinked().setPrevLinked(objectToRelease.getPrevLinked());

    if (oldestUsed == objectToRelease)
      oldestUsed = objectToRelease.getNextLinked();
    if (firstUsed == objectToRelease)
      firstUsed = objectToRelease.getNextLinked();
    if (lastUsed == objectToRelease)
      lastUsed = objectToRelease.getPrevLinked();

    objectToRelease.setNextLinked(null);
    if (firstFree == null) {
      firstFree = objectToRelease;
      objectToRelease.setPrevLinked(null);
    }

    if (lastFree != null) {
      objectToRelease.setPrevLinked(lastFree);
      lastFree.setNextLinked(objectToRelease);
    } else
      objectToRelease.setPrevLinked(null);

    lastFree = objectToRelease;
  }

  /**
   *得到第一桢图片
   * @return
   */
  public MovingObject getFirstUsed() {
    return firstUsed;
  }

  /**
   * 动画处理,用于控制动画桢切换的快慢
   * @param num 累加器
   * @param cyc_time 单次循环时间(s)
   * @param frames 桢数
   * @return
   */
  public int move(int num, int cyc_time, int frames) {
    int frame_time = cyc_time / frames;
    int num_m = num % cyc_time;
    int frame = 0;
    frame = (num_m) / frame_time;
    return frame;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -