![]() |
|
||||||||||
|
|||||
|
Регистрация: Feb 2008
Сообщений: 12
|
Здраствуйте знатоки.
Столкнулся с такой проблемой... строю график функии пошагово. При прорисовке все дело притормаживает... особенно, если графиков функций строится очень много. Как это избежать? // построение графика
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);
}
|
|
|||||
|
тоже была такая проблема - Спасибо 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();
}
Последний раз редактировалось Rzer; 13.05.2008 в 23:53. |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 12
|
Использовав ваш способ, Rzer, скорость прорисовки увеличилась буквально в 1.1 раз... возможно я много хочу от свего приложения. Для улучшения скорости мне пришлось увеличить шаг до 0.5 , а перелом графиков на различных участках избегать с помощью curveTo()... но... прорисовка стала не столь быстрой, как бы хотелось (
Хотя... Rzer... а не могли вы более подробно описать отображение того битмана, в котором прорисовывается график. (возможно я сделал что то не правильно - передавая в функцию resultBitmap = Clip.Bitmap) |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
У вас туча вызовов неких методов X, Y, Calculator и прочих вещей, жрущих процессорное время на раз. Это кусок кода надо переписывать совсем, а не допиливать рашпилем.
|
|
|||||
|
Регистрация: Feb 2008
Сообщений: 12
|
Ок. Как мне быть в таком случае???!!!
По заданному мат. выражению строится график функции. Не использовать: 1) X(), Y() - преобразование координат из декартовой в экранную плоскость; 2) Calculator() - высчитывание разобранное выражение (обратная польская запись) ...я не могу. Как мне быть в таком случае?! Урезать свою программу в возможностях? Подскажите... что может ускорить все это хозяйство? |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
А экранные координаты с каких пор недекартовые?
|
|
|||||
|
Регистрация: Feb 2008
Сообщений: 12
|
В методах X, Y идет отображения декартовой системы координат на экранную систему координат. На сколько мне известно... )))) экранные координаты всегда > 0
![]() |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Ради простого добавления константы писать целую функцию и вызывать её неразумно.
|
|
|||||
|
Регистрация: Feb 2008
Сообщений: 12
|
Все таки... эт не так существенно. (тем более, что там не констатна - координаты х, у - постоянно пересчитываются в этих методах). Все таки хотелось бы услышать что нить более существенное в помощь при прорисовке.
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Очень жаль, что меня не услышали.
Да и отрисовывать с точностью до одной сотой пикселя смысла никакого. Последний раз редактировалось etc; 14.05.2008 в 23:57. |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:31. |
|
|
« Предыдущая тема | Следующая тема » |
|
|