Показать сообщение отдельно
Старый 31.05.2006, 14:18
heilong вне форума Посмотреть профиль Отправить личное сообщение для heilong Посетить домашнюю страницу heilong Найти все сообщения от heilong
  № 8  
Ответить с цитированием
heilong
 
Аватар для heilong

Регистрация: Dec 2005
Адрес: Moscow
Сообщений: 84
Отправить сообщение для heilong с помощью ICQ
Вчера получилось добиться хороших успехов в закрашивании треугольника с помощью градиентов. Изначально мой первый (кривоватый) алгоритм рисовал ~31000 треугольников за 5 секунд. Когда у меня таки получилось (с помощью форума по flash-у на adobe.com) сделать это с градиентом (идеальное качество), скорость была 6800 треугольников за 5 секунд. мдаа, негусто. Долго оптимизировал, в итоге кривоватый алгоритм тоже немного ускорил - до 36000, а с градиентами - до 80000! Т.е. оптимизацией добился более чем 10-кратного прироста скорости.
Что в процессе выяснилось:
если есть
Код:
var m = new Matrix();
то
Код:
m.createGradientBox(...)
- на удивление очень тормозная операция!
я делал 3 таких операции на треугольник, при этом всегда одинаковые.
вынес эти вызовы вовне и сохранил 3 матрицы в переменных, итог:
скорость выросла с 7000 до 24000 за 5с.

теперь colorTransform. я делал как написано в help-e:
Код:
// tri1.l.l1 is a MovieClip
var ct = tri1.l.l1.transform.colorTransform;
ct.redMultiplier = r1;
ct.greenMultiplier = g1;
ct.blueMultiplier = b1;
tri1.l.l1.transform.colorTransform = ct;
первая строчка этого кода реально тормозит! оптимальный вариант:
Код:
// outside the triangle loop
tri1.ct1 = new ColorTransform();
...
// inside the triangle loop
var ct = tri1.ct1;
ct.redMultiplier = r1;
..
tri1.l.l1.transform.colorTransform = ct;
замена трёх комплектов colorTransform-ов прибавила скорости с 25000 до 33000.

или например вот это:
Код:
var matrix = tri1.transform.matrix;
matrix.a = ....
tri1.transform.matrix = matrix;
заменяю на
Код:
// outside the loop
tri1.matrix = new Matrix();
...
// inside the loop
var matrix = tri1.matrix;
matrix.a = ...
tri1.transform.matrix = matrix;
скорость выросла с 33000 до 37000

ещё кое-какие алгоритмические улучшения увеличили скорость до 48000. потом я вообще офигел... сделал так:
Код:
// outside the loop
var ttfm = tri1.transform;
var l1tfm = tri1.l.l1.transform;
var l2tfm = tri1.l.l2.transform;
var l3tfm = tri1.l.l3.transform;
...
// inside the loop
...
// everywhere, use ttfm and l?tfm instead of tri1.transform etc.
l1tfm.colorTransform = ct;
...
ttfm.matrix = matrix;
скороть выросла с 48000 до 76000! а вот например такое известное для интерпретируемых языков ухищрение как максимальное укорачивание имён переменных не даёт вообще никакого результата. я на 95% уверен, что flash-евский компилятор автоматически переименовывает переменные.

p.s. всё вышесказанное относится к flash 8 only.