Java Android-创建许多小的短期对象会影响性能吗?
我正在用Android创建一个2D游戏。我对如何高效地编写代码感到困惑,否则从长远来看会带来性能问题 目前我正在使用策略模式。这是我的密码Java Android-创建许多小的短期对象会影响性能吗?,java,android,performance,dalvik,strategy-pattern,Java,Android,Performance,Dalvik,Strategy Pattern,我正在用Android创建一个2D游戏。我对如何高效地编写代码感到困惑,否则从长远来看会带来性能问题 目前我正在使用策略模式。这是我的密码 public void setCharAnimDirection( CharacterAnimationDirection charAnimDirection) { if(charAnimDirection == CharacterAnimationDirection.NorthEast || charA
public void setCharAnimDirection(
CharacterAnimationDirection charAnimDirection) {
if(charAnimDirection == CharacterAnimationDirection.NorthEast ||
charAnimDirection == CharacterAnimationDirection.NorthWest) {
if (super.getCharAnimType() == CharacterAnimationType.Attack) {
super.setCharAnim(new AttackBackAnim());
} else if (super.getCharAnimType() == CharacterAnimationType.Battle) {
super.setCharAnim(new BattleBackAnim());
} else {
}
} else {
if (super.getCharAnimType() == CharacterAnimationType.Attack) {
super.setCharAnim(new AttackFrontAnim());
} else if (super.getCharAnimType() == CharacterAnimationType.Battle) {
super.setCharAnim(new BattleFrontAnim());
} else {
}
}
这里的问题是,角色在我的游戏中总是改变方向,因此每次都会创建一个小对象。
我读过一本关于创建短生命的小对象的旧书(2009年),当它们堆积起来时,它会迫使虚拟机(在我的例子中是dalvik)进行垃圾收集,从而暂停其他进程,有时会给您带来延迟。但我不确定它目前是否仍然适用于最新的虚拟机和垃圾收集
那么,将他们的方法放在一个类中并执行if-else会提高性能还是只给我一个混乱的代码?
例如,这段代码
if (character.getCharAnimDirection() == CharacterAnimationDirection.NorthWest) {
g.drawPixmap(AnimAssets.battleBackAnim, character.getX()
+ BTL_XOFFSET, character.getY() + BTL_YOFFSET,
frameBlock, 0, BTL_FRAME_WIDTH, BTL_FRAME_HEIGHT);
} else if (character.getCharAnimDirection() == CharacterAnimationDirection.SouthWest) {
g.drawPixmap(AnimAssets.battleFrontAnim, character.getX()
+ BTL_XOFFSET, character.getY() + BTL_YOFFSET,
frameBlock, 0, BTL_FRAME_WIDTH, BTL_FRAME_HEIGHT);
} else if (character.getCharAnimDirection() == CharacterAnimationDirection.NorthEast) {
g.drawMirroredPixmap(AnimAssets.battleBackAnim,
character.getX() - BTL_XOFFSET + 40, character.getY()
+ BTL_YOFFSET, frameBlock, 0, BTL_FRAME_WIDTH,
BTL_FRAME_HEIGHT);
} else {
g.drawMirroredPixmap(AnimAssets.battleFrontAnim,
character.getX() - BTL_XOFFSET + 20, character.getY()
+ BTL_YOFFSET, frameBlock, 0, BTL_FRAME_WIDTH,
BTL_FRAME_HEIGHT);
}
还是有一种更高效、更清洁的方法来实现这一点
非常感谢您的帮助,谢谢 我不知道GC会有多糟糕,但我可以回答这一部分: 那么,将他们的方法放在一个类中并执行if-else会提高性能还是只给我一个混乱的代码 不,凌乱的代码是程序员所做的。不能使用策略模式可能会使编写更干净的代码更加困难,但这不是真正的借口 共有4个案例,您可以创建4个对象并重用它们。这甚至比动态创建它们更简单 您已经有了
CharacterAnimationDirection.NorthWest
等。我们希望它是一个枚举,并向其中添加xOffset
和yOffset
等方法。现在,您的代码可以是
CharacterAnimationDirection direction = character.getCharAnimDirection();
g.drawMirroredPixmap(AnimAssets.battleFrontAnim,
character.getX() + direction.xOffset(),
character.getY() + direction.yOffset(),
frameBlock, 0, BTL_FRAME_WIDTH, BTL_FRAME_HEIGHT);
这看起来并不凌乱,对吗?使用策略模式已经是一件好事了,您应该使用Switch Case语句来代替它。事实并非如此。但是如果方向是西北或西南,我需要使用g.drawPixmap方法,否则如果方向是东北或东南,则使用g.drawMirroredPixmap方法。@steven0529:那么一个
布尔值
-返回方法就可以了。或者别的什么。。。但这不一定是一团糟。