1

首先,我想说这是我正在开发的一款安卓游戏的一部分。垃圾收集器大约每三秒运行一次,这会导致我的游戏出现短暂(但明显)的延迟。我已将其缩小为我的代码中的一种方法(粘贴在下面)。当不使用这部分时,垃圾收集器大约每 11 秒运行一次,并且延迟更少。此代码是对象的一部分,该对象使用树结构来检测与对象的碰撞。对象 topLeft、topRight、bottomLeft 和 bottomRight 是相同类型的对象,它们递归地检查碰撞。我主要想知道如果每帧都运行它,这里是否有任何东西会产生大量垃圾。

public HashSet<Integer> getCollisionTiles(Rect r)
{
    resetTempList();

    if(topLeft!=null && topLeft.containsTiles() && Rect.intersects(r, topLeft.getBounding()))
        topLeft.addCollisionTiles(tempList, r);
    if(topRight != null && topRight.containsTiles() && Rect.intersects(r, topRight.getBounding()))
        topRight.addCollisionTiles(tempList, r);
    if(bottomLeft != null && bottomLeft.containsTiles() && Rect.intersects(r, bottomLeft.getBounding()))
        bottomLeft.addCollisionTiles(tempList, r);
    if(bottomRight != null && bottomRight.containsTiles() && Rect.intersects(r, bottomRight.getBounding()))
        bottomRight.addCollisionTiles(tempList, r);

    return tempList;
}

private void addCollisionTiles(HashSet<Integer> tList, Rect r)
{
    if(level==maxLevel)
    {
        for(Integer i: keyListTiles) 
            tList.add(i);
    }
    else
    {
        if(topLeft!=null && topLeft.containsTiles() && Rect.intersects(r, topLeft.getBounding()))
            topLeft.addCollisionTiles(tList, r);
        if(topRight != null && topRight.containsTiles() && Rect.intersects(r, topRight.getBounding()))
            topRight.addCollisionTiles(tList, r);
        if(bottomLeft != null && bottomLeft.containsTiles() && Rect.intersects(r, bottomLeft.getBounding()))
            bottomLeft.addCollisionTiles(tList, r);
        if(bottomRight != null && bottomRight.containsTiles() && Rect.intersects(r, bottomRight.getBounding()))
            bottomRight.addCollisionTiles(tList, r);
    }
}
4

2 回答 2

1

topLeft.getBounding()每次 调用都会创建一个新的 Rectangle 。

如果您经常调用,这将是很多对象getCollisionTiles()。您可能会在调用getCollisionTiles()很多次之前提取一次边界矩形。

于 2013-01-26T02:08:26.437 回答
0

好吧,我想我已经解决了这个问题。HashMaps 在我的程序中经常使用,我从它们切换到 SparseArray。此外,渲染图块的方式是为每个绘制的图块创建一个新的 Rect,因此我对其进行了优化以更有效地使用此方法并创建更少的垃圾。

于 2013-01-26T19:26:09.553 回答