Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Быстрая отрисовка (http://www.flasher.ru/forum/showthread.php?t=111959)

Bad_Guy 13.05.2008 21:18

Быстрая отрисовка
 
Здраствуйте знатоки.
Столкнулся с такой проблемой... строю график функии пошагово. При прорисовке все дело притормаживает... особенно, если графиков функций строится очень много. Как это избежать?
Код:

// построение графика
public function paintGraph(Graph: TGraph, Clip: MovieClip): void {
        var I: Number = minX; // в декартовой системе координат
        var _Y: Number;
        Clip.graphics.lineStyle(Graph.thicknes, Graph.color, 1);
        do {
        _Y = Func.Calculator(Graph.Func, I); // высчитывается значение функции в экранных координатах
        if ((_Y < maxY) && (_Y > minY) && (I < maxX) && (I > minX)) {
                Clip.graphics.moveTo(X(I), Y(_Y));
                I += 0.01;
                _Y = Func.Calculator(Graph.Func, I);
                Clip.graphics.lineTo(X(I), Y(_Y));
        } else I += 0.01;
} while (I <= maxX);
}

Я во флэше новичок... программирую недавно.. поэтому буду признателен к подробным объяснениям. Спасибо

Rzer 13.05.2008 23:50

тоже была такая проблема - Спасибо Silin'у. В твоем примере все линии храняться как объекты и каждый раз перересовываются. Можешь сделать так:
Код:

// построение графика

public function paintGraph(Graph: TGraph, resultBitmap:Bitmap): void {
        var drawSprite:Sprite = new Sprite();
        var drawCanvas:Graphics = drawSprite.graphics;
        var I: Number = minX; // в декартовой системе координат
        var _Y: Number;
        drawCanvas.lineStyle(Graph.thicknes, Graph.color, 1);
        do {
        _Y = Func.Calculator(Graph.Func, I); // высчитывается значение функции в экранных координатах
        if ((_Y < maxY) && (_Y > minY) && (I < maxX) && (I > minX)) {
                drawCanvas.moveTo(X(I), Y(_Y));
                I += 0.01;
                _Y = Func.Calculator(Graph.Func, I);
                drawCanvas.lineTo(X(I), Y(_Y));
        } else I += 0.01;
} while (I <= maxX);
resultBitmap.bitmapData.draw(drawSprite);
drawCanvas.clear();
}

Все запихиваем не в мувик, а РИСУЕМ в битмап. И обязательно используй resultBitmap.smoothing = true; там где ты создаешь Bitmap.

Bad_Guy 14.05.2008 20:21

Использовав ваш способ, Rzer, скорость прорисовки увеличилась буквально в 1.1 раз... возможно я много хочу от свего приложения. Для улучшения скорости мне пришлось увеличить шаг до 0.5 , а перелом графиков на различных участках избегать с помощью curveTo()... но... прорисовка стала не столь быстрой, как бы хотелось (

Хотя... Rzer... а не могли вы более подробно описать отображение того битмана, в котором прорисовывается график. (возможно я сделал что то не правильно - передавая в функцию resultBitmap = Clip.Bitmap)

etc 14.05.2008 22:37

У вас туча вызовов неких методов X, Y, Calculator и прочих вещей, жрущих процессорное время на раз. Это кусок кода надо переписывать совсем, а не допиливать рашпилем.

Bad_Guy 14.05.2008 23:15

Ок. Как мне быть в таком случае???!!!
По заданному мат. выражению строится график функции. Не использовать:
1) X(), Y() - преобразование координат из декартовой в экранную плоскость;
2) Calculator() - высчитывание разобранное выражение (обратная польская запись)
...я не могу.

Как мне быть в таком случае?! Урезать свою программу в возможностях?
Подскажите... что может ускорить все это хозяйство?

etc 14.05.2008 23:17

А экранные координаты с каких пор недекартовые?

Bad_Guy 14.05.2008 23:23

В методах X, Y идет отображения декартовой системы координат на экранную систему координат. На сколько мне известно... )))) экранные координаты всегда > 0 ;)

etc 14.05.2008 23:26

Ради простого добавления константы писать целую функцию и вызывать её неразумно.

Bad_Guy 14.05.2008 23:36

Все таки... эт не так существенно. (тем более, что там не констатна - координаты х, у - постоянно пересчитываются в этих методах). Все таки хотелось бы услышать что нить более существенное в помощь при прорисовке.

etc 14.05.2008 23:42

Цитата:

Сообщение от Bad_Guy (Сообщение 739263)
Все таки... эт не так существенно.

Очень жаль, что меня не услышали.
Да и отрисовывать с точностью до одной сотой пикселя смысла никакого.


Часовой пояс GMT +4, время: 01:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.