Вход

Просмотр полной версии : Быстрая отрисовка


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
14.05.2008, 23:51
Шаг задается не в пикселях...
Если задавать шаг в 0.1 или 0.5 - график функии получается ломаной. Если использовать curveTo() с таким шагом... то при сложных математических выражениях.. хде график функции сильно колебается на маленьких интервалах - ведет себя не очень верно. Избежать этого можно с уменьшением шага (