停止函数创建位图/减少CPU过载/减少滞后

时间:2013-04-19 22:37:54

标签: actionscript-3 bitmap lag bitmapdata enterframeevent

您好我注意到以下代码在合并时会产生明显的延迟。

    public function impassable_collisions():void { //prevent player from moving through impassable mcs

        for each(var mc:MovieClip in impassable) {

        var bitmap = createBitmapClone(mc); //return clone of bitmap of mc, accounting for transformations

        var bounds:Rectangle = player.getRect(bitmap);
        var playerCenterX:Number = bounds.left + bounds.width * .5;
        var playerCenterY:Number = bounds.top + bounds.height * .5;

        //Test for a pixel perfect collision against a shape based on a point and radius, 
        //returns the angle of the hit or NaN if no hit.
        var hitAngle:Number = hitTestPointAngle(bitmap, playerCenterX, playerCenterY, player.height/2);

        if(!isNaN(hitAngle)){
            // move player away from object
            player.x -= int(Math.cos(hitAngle) * player.speed*timeDiff);
            player.y -= int(Math.sin(hitAngle) * player.speed*timeDiff);
        }
    }
}

所以这个函数是从另一个从enterFrame监听器调用的函数调用的。我在任何给定时间循环遍历包含5-30个动画片段的数组,然后将给定的mc克隆到位图,该位图将用于测试自身与另一个位图(“播放器”)之间的冲突。我假设正在发生一些相当低效的事情,从而产生滞后 - 当“玩家”被移动时,更加波涛汹涌的动作。有谁知道问题是什么/解决方案呢?

对于相当模糊的问题标题

抱歉

感谢

1 个答案:

答案 0 :(得分:1)

Pixel Perfect碰撞检测非常昂贵。我不能说这是唯一的问题,但我可以告诉你,它在处理方面很昂贵。

在此循环中的每次迭代中创建新位图也很昂贵。

您可以尝试的一件事是在进行更密集的检查之前消除对象。例如,如果物体不在一定距离内,则非常快速的距离检查可以消除测试物体的需要。

if (distance <= threshold)
{
    // create the bitmap for the check
    // do the expensive pixel perfect collision check
}

你的目标是消除明显不足以碰撞的物体。