Рисование линий приводит Flash к выходу из-под контроля! - PullRequest
0 голосов
/ 04 мая 2010

У меня проблемы с некоторым кодом AS3, который просто рисует объект Sprite Graphics. Рисование происходит как часть более крупной процедуры, вызываемой для каждого ENTER_FRAME события stage.

Flash не вылетает и не возвращает ошибку. Вместо этого он начинает работать на 100% ЦП и захватывает всю память, которая может, до тех пор, пока я не завершу процесс вручную, или мой компьютер не прогнется под давлением, когда он достигает примерно 2-3 ГБ. Это произойдет в произвольное время и без какого-либо непредвиденного замедления.

WTF? Кто-нибудь видел что-нибудь подобное?

PS: Раньше я рисовал в обработчике событий MOUSE_MOVE, что еще больше ускорило эту проблему.

PPS: я занимаюсь разработкой для Linux, но воспроизвел ту же проблему в Windows.

ОБНОВЛЕНИЕ : Вы попросили некоторый код, так что мы здесь. Функция рисования выглядит следующим образом:

public static function drawDashedLine(i_graphics : Graphics, i_from : Point, i_to : Point, i_on : Number, i_off : Number) : void
{
    const vecLength : Number = Point.distance(i_from, i_to);

    i_graphics.moveTo(i_from.x, i_from.y);

    var dist : Number = 0;
    var lineIsOn : Boolean = true;
    while(dist < vecLength)
    {
        dist = Math.min(vecLength, dist + (lineIsOn ? i_on : i_off));
        const p : Point = Point.interpolate(i_from, i_to, 1 - dist / vecLength);
        if(lineIsOn) i_graphics.lineTo(p.x, p.y);
        else i_graphics.moveTo(p.x, p.y);

        lineIsOn = !lineIsOn;
    }
}

и называется так (m_graphicsLayer является Sprite):

m_graphicsLayer.graphics.clear();
if (m_destinationPoint)
{
    m_graphicsLayer.graphics.lineStyle(2, m_fixedAim ? 0xff0000 : 0x333333, 1);
    drawDashedLine(m_graphicsLayer.graphics, m_initialPos, m_destinationPoint, 10, 10);
}

Ответы [ 2 ]

0 голосов
/ 05 мая 2010

while (dist

Это всегда должно появляться как красный флаг во время отладки и проверки кода, особенно если аргументы основаны на вычислениях, которые вы не можете точно предсказать при написании кода, или значения не имеют строгого верхнего предела (например Point.distance () или Math.min ()).

Был укушен этим несколько раз. : -)

0 голосов
/ 05 мая 2010

Ну, CookieOfFortune была права - был бесконечный цикл в том случае, если одна из конечных точек была на бесконечности (чего не должно было быть;)

Спасибо за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...