📄 movingobjectpool.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 + -