Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Программное рисование сильно затормаживает скорость ролика (http://www.flasher.ru/forum/showthread.php?t=83462)

Огнеметчик 05.08.2006 16:34

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

layer.clear();
for(i = 1; i <= N; i++)
{
layer.lineStyle(4, color[i], a[i]);
layer.moveTo(X[i], Y[i]);
layer.lineTo(X[i] + R[i], Y[i] + R[i]);
layer.lineTo(X[i] - R[i], Y[i] + R[i]);
layer.lineTo(X[i] - R[i], Y[i]);                       
}

Координаты каждого квадратика меняются по 50 раз в секунду, и 50 раз в секунду слой (слой - это простой мувиклип) очищается и на нем заново рисуется N квадратиков с новыми координатами.

Так вот, чем больше N тем заметнее тормозит вывод изображения, при N = 30 на моем п3 1,3 ролик отображается со скоростью примерно 5 кадров в секунду... Если из программы убрать выше приведенный код, но оставить расчет параметров квадратиков, то скорость ролика заметно увеличится, отсюда я могу сделать вывод, что тормозит именно программная отрисовка.

Пробовал вместо программной отрисовки сделать один мувиклип с нарисованным в нем квадратиком, а затем с помощью attachMovie продублировать его N раз, но опять же при N = 30 скорость очччень сильно падает...

Что посоветуете? Как нарисовать на экране несколько десятков примитивных объектов, да так, чтобы скорость отрисовки была приличной?

alkonaft 05.08.2006 19:54

Цитата:

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

layer.clear();
for(i = 1; i <= N; i++)
{
layer.lineStyle(4, color[i], a[i]);
layer.moveTo(X[i], Y[i]);
layer.lineTo(X[i] + R[i], Y[i] + R[i]);
layer.lineTo(X[i] - R[i], Y[i] + R[i]);
layer.lineTo(X[i] - R[i], Y[i]);                       
}

Координаты каждого квадратика меняются по 50 раз в секунду, и 50 раз в секунду слой (слой - это простой мувиклип) очищается и на нем заново рисуется N квадратиков с новыми координатами.

Так вот, чем больше N тем заметнее тормозит вывод изображения, при N = 30 на моем п3 1,3 ролик отображается со скоростью примерно 5 кадров в секунду... Если из программы убрать выше приведенный код, но оставить расчет параметров квадратиков, то скорость ролика заметно увеличится, отсюда я могу сделать вывод, что тормозит именно программная отрисовка.

Пробовал вместо программной отрисовки сделать один мувиклип с нарисованным в нем квадратиком, а затем с помощью attachMovie продублировать его N раз, но опять же при N = 30 скорость очччень сильно падает...

Что посоветуете? Как нарисовать на экране несколько десятков примитивных объектов, да так, чтобы скорость отрисовки была приличной?

совет прост убей всякие ненужные циклы.
И вообще апгрейд компа решает.
я лично адаптирую свой флеш под П4 1.7
Но даже этот слабенький комп превратиться в более мощный, через неделю.

Но есть вариант делаеш шейп и несколько дорожек, муторно и гиморно но как не странно помогает.

Огнеметчик 05.08.2006 23:00

Цитата:

совет прост убей всякие ненужные циклы.
Хммм... То есть если заменить код
Код:

for(i = 1; i <= N; i++)
{
layer.lineStyle(4, color[i], a[i]);
layer.moveTo(X[i], Y[i]);
layer.lineTo(X[i] + R[i], Y[i] + R[i]);
layer.lineTo(X[i] - R[i], Y[i] + R[i]);
layer.lineTo(X[i] - R[i], Y[i]);                       
}

на код:
Код:

layer.lineStyle(4, color[1], a[1]);
layer.moveTo(X[1], Y[1]);
layer.lineTo(X[1] + R[1], Y[1] + R[1]);
layer.lineTo(X[1] - R[1], Y[1] + R[1]);
layer.lineTo(X[1] - R[1], Y[1]);

layer.lineStyle(4, color[2], a[2]);
layer.moveTo(X[2], Y[2]);
layer.lineTo(X[2] + R[2], Y[2] + R[2]);
layer.lineTo(X[2] - R[2], Y[2] + R[2]);
layer.lineTo(X[2] - R[2], Y[2]);       

............................................

layer.lineStyle(4, color[30], a[30]);
layer.moveTo(X[30], Y[30]);
layer.lineTo(X[30] + R[30], Y[30] + R[30]);
layer.lineTo(X[30] - R[30], Y[30] + R[30]);
layer.lineTo(X[30] - R[30], Y[30]);

я получу прирост производительности? Сейчас попробую, хотя странно всё это...
Цитата:

И вообще апгрейд компа решает.
я лично адаптирую свой флеш под П4 1.7
Дык апгрейд компа не проблема, просто я боюсь что потенциальные пользователи тоже сидят с таким древним железом как у меня и хочется чтобы и у них все летало...
Цитата:

Но есть вариант делаеш шейп и несколько дорожек, муторно и гиморно но как не странно помогает.
Ой... Я чего-то этой фразы не понял, можешь поподробнее описать процесс? Спасибо.

alkonaft 05.08.2006 23:25

Цитата:

Сообщение от Огнеметчик
Хммм... То есть если заменить код
Код:

for(i = 1; i <= N; i++)
{
layer.lineStyle(4, color[i], a[i]);
layer.moveTo(X[i], Y[i]);
layer.lineTo(X[i] + R[i], Y[i] + R[i]);
layer.lineTo(X[i] - R[i], Y[i] + R[i]);
layer.lineTo(X[i] - R[i], Y[i]);                       
}

на код:
Код:

layer.lineStyle(4, color[1], a[1]);
layer.moveTo(X[1], Y[1]);
layer.lineTo(X[1] + R[1], Y[1] + R[1]);
layer.lineTo(X[1] - R[1], Y[1] + R[1]);
layer.lineTo(X[1] - R[1], Y[1]);

layer.lineStyle(4, color[2], a[2]);
layer.moveTo(X[2], Y[2]);
layer.lineTo(X[2] + R[2], Y[2] + R[2]);
layer.lineTo(X[2] - R[2], Y[2] + R[2]);
layer.lineTo(X[2] - R[2], Y[2]);       

............................................

layer.lineStyle(4, color[30], a[30]);
layer.moveTo(X[30], Y[30]);
layer.lineTo(X[30] + R[30], Y[30] + R[30]);
layer.lineTo(X[30] - R[30], Y[30] + R[30]);
layer.lineTo(X[30] - R[30], Y[30]);

я получу прирост производительности? Сейчас попробую, хотя странно всё это...

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

Ой... Я чего-то этой фразы не понял, можешь поподробнее описать процесс? Спасибо.

1 а почему всё это не нарисовать в ручную?
2 Код для облегчения можеш сделать рекурсией.

Огнеметчик 05.08.2006 23:53

Цитата:

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

szz 06.08.2006 01:07

Нет-нет, ни в коем случае не разварачивай цикл в линию, это глупость, бытрее от этого не станет.
Попробуй оптимизировать, посмотри, может чем рисовать каждый квадратик можно сделать заготовку - квадратик и потом ее продублировать сколько надо раз, поменять им цвета задать положение и тд, и не бездумно каждую итерацию все стирать и заново рисовать, а продумать чтобы добавлять или стирать квадратики по одному/несколько по мере необходимости?

alkonaft 06.08.2006 10:57

Цитата:

Сообщение от szz
Нет-нет, ни в коем случае не разварачивай цикл в линию, это глупость, бытрее от этого не станет.
Попробуй оптимизировать, посмотри, может чем рисовать каждый квадратик можно сделать заготовку - квадратик и потом ее продублировать сколько надо раз, поменять им цвета задать положение и тд, и не бездумно каждую итерацию все стирать и заново рисовать, а продумать чтобы добавлять или стирать квадратики по одному/несколько по мере необходимости?

От обьектов легче не станет.
Машина очень слабая.

7thsky™ 06.08.2006 11:06

А зачем тебе такие быстрые изменения - 50 раз в секунду? потом зачем каждый раз рисовать квадрат? не легче ли менять размеры у отрисованного мува (в котором ты один раз рисуешь квадрат), а цвет через объект Color можно менять.

потом если работаешь под 8 плеер, то можно заменить векторное рисование квадратов на использование класса BitmapData

Огнеметчик 06.08.2006 20:27

Цитата:

Сообщение от 7thsky™
потом если работаешь под 8 плеер, то можно заменить векторное рисование квадратов на использование класса BitmapData

Вот это интересное предложение. Не знал о таком классе, сейчас почитал о нем в хелпе, попытаюсь его использовать в программе, надеюсь это поможет ускорить её работу.

Цитата:

Нет-нет, ни в коем случае не разварачивай цикл в линию, это глупость, бытрее от этого не станет.
Честно говоря тоже так думаю...

Цитата:

От обьектов легче не станет.
Машина очень слабая.
Угу, даже совсем наоборот, у меня изначально и была куча объектов созданных при помощи attachMovie, и работало даже медленнее чем сейчас (хотя оцениваю на глаз, может и не медленнее, но точно не быстрее)...

KUZEN 06.08.2006 23:09

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


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

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