【问题标题】:Android - Do creating many small short lived objects affect performance?Android - 创建许多小的短期对象会影响性能吗?
【发布时间】:2014-05-08 00:48:51
【问题描述】:

我正在 Android 中创建 2D 游戏。我对如何有效地编写代码感到困惑,否则从长远来看它会带来性能问题。

目前我正在使用策略模式。这是我的代码。

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);
        }

或者有没有更有效和更清洁的方法来实现这一点?

非常感谢您的帮助,谢谢!

【问题讨论】:

标签: java android performance dalvik strategy-pattern


【解决方案1】:

我无法判断GC会有多糟糕,但我可以回答这部分:

那么,将他们的方法放在一个类中并执行 if-else 会提高性能还是只是给我一个混乱的代码?

不,杂乱的代码是程序员所做的。不能使用策略模式可能会更难编写更简洁的代码,但这不是真正的借口。

有 4 种情况,您可以创建 4 个对象并重复使用它们。这比动态创建它们更简单。

您已经拥有CharacterAnimationDirection.NorthWest 等。希望它是一个枚举,并向其中添加xOffsetyOffset 之类的方法。现在你的代码可以像

CharacterAnimationDirection direction = character.getCharAnimDirection();
g.drawMirroredPixmap(AnimAssets.battleFrontAnim,
    character.getX() + direction.xOffset(),
    character.getY() + direction.yOffset(),
    frameBlock, 0, BTL_FRAME_WIDTH, BTL_FRAME_HEIGHT);

这看起来并不凌乱,对吧?

【讨论】:

  • 它没有。但是如果它的方向是 NorthWest 或 SouthWest,我需要使用 g.drawPixmap 方法,否则如果它的方向是 NorthEast 或 SouthEast,我需要使用 g.drawMirroredPixmap。
  • @steven0529:那么一个boolean-returning 方法应该可以。或者别的什么......但它不需要是一团糟。
【解决方案2】:

使用策略模式已经是一件好事了,你应该使用 Switch Case 语句来代替。

【讨论】:

    猜你喜欢
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多