|
|
|||||
Оптимизация для скорости в общем
Предлагаю обсудить техники оптимизации actionscript кода (меня конкретно интересует Flash 8) для скорости. Постоянно вижу обсуждения оптимизации размера файла, куча информации на эту тему, а про скорость не нашёл ничего. Если плохо искал, сорри.
В любом случае для некоторых целей тема очень актуальна и хотелось бы собрать базу знаний по этому поводу. Неплохо было бы написать в итоге некую документацию, заметки на тему оптимизации. В качестве примера - я сейчас активно занялся написанием 3d движка на 8м флэше. Всяких разных фич в большом кол-ве я не хочу, но, в отличии от других движков с миллионом мулек, что я видел, обязательно нужно текстурирование и освещение (не flat как во всех движках что я видел, а Gouraud). Собственно, технический вопрос этого дела я вчера разрешил, откуда и возникло желание эту тему поднять. Дело в том, что функцию, которая за 5 секунд текстурировала и закрашивала всего 6800 треугольников, удалось оптимизировать (алгоритм остался неизменным) до скорости 80000 треугольников в секунду, в процессе я открыл для себя, что, казалось бы, несложная операций Matrix.createGradientBox - очень тормозная, также очень медленно прочитать property MovieClip.transform, а из него - colorTransform и matrix. Подробности в моём посте на эту тему: http://www.flasher.ru/forum/showthread.php?t=79791 Вот такие вот детали я и предлагаю собрать в список. Какие функции и property тормозные и как это обойти. Ну и конечно просто технологии оптимизации, свойственные именно flash-у. Всякие loop unrolling и другие общие техники тоже интересно, но уже на 2м плане. Последний раз редактировалось heilong; 31.05.2006 в 14:32. |
|
|||||
Регистрация: Apr 2006
Сообщений: 88
|
сам с такой жёсткой оптимизацией по скорости не сталкивался ввиду отсутствия необходимости таковой, но слышал. - генерируемый as байт-код является избыточным и если из него убрать (утилитой flasm) лишнее то + 20-30% скорости
|
|
|||||
думаю не стоит подходить ограниченно для флеша. проанализировать ту или иную функцию, цикл, как он работает(хотя бы навскидку). думаю некоторые выгодные замены будут бросаться в глаза(не будете же вы парсировать строку в архив по запятым регулярными выражениями+)))...
|
|
|||||
просто об оптимизации в общем есть много ресурсов и информации, а конкретно как лучше делать во флэше я нигде не нашёл.
или какие функции и property во флэше медленные и как это обойти. flasm надо бы попробовать |
|
|||||
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
|
первое что в голову пришло
/* * * Пример : используемые внешние переменные внутри функции лучше передевать в качестве аргументов * */ v = 5; //////////////////////////////////// function test1 () { var u = v; } function test2 (v) { var u = v; } //////////////////////////////////// t1 = getTimer (); for (var i = 0; i < 100000; i++) { test1 (); } t2 = getTimer (); trace (t2 - t1); //////////////////////////////////// t1 = getTimer (); for (var i = 0; i < 100000; i++) { test2 (v); } t2 = getTimer (); trace (t2 - t1); |
|
|||||
Регистрация: Nov 2005
Сообщений: 221
|
Также можно пособирать в инете быстрые ф-ции и использовать их вместо дефолтных. Например следующая ф-ция выполняется более чем на 50% быстрее чем встроенная Array.reverse();
function reverse(a:Array){ var l = 0; var r = a.length-1; var t; while(l<r){ t = a[l]; a[l] = a[r]; a[r] = t; ++l; --r; } } На самом деле очень много нюансов, начинаю от стиля написания кода и заканчивая течническими деталями(best practice). Попробуй почитать тут, может чем-то поможет: http://www.adobe.com/devnet/flash/ar...practices.html http://www.adobe.com/devnet/flash/ar...practices.html |
|
|||||
Прошу прощения, что не в тему. Но.
iNils можешь объяснить одну вещь, исходя из примера test1 работает медленнее поскольку начинает искать по цепочке областей видимости значение v (если я правильно понимаю). Так вот после первого TestMovie в OutPut у меня вывалилось 1064 и 868 соответственно (что вполне логично). НО! Второй TestMovie мне выдал примерно одинаковый результат - 856 и 860, а третий - 823 и 852. Собственно вопрос почему? Сразу прошу прощения, если ответ на вопрос очевиден, но все же хотелось бы его увидеть. Последний раз редактировалось vooparker; 01.06.2006 в 12:33. |
|
|||||
iNils, у меня твой тест выдаёт
1553 1534 разница, пожалуй, несущественна KPaul, в этом reverse видимо алгорит лучше, выбор лучшего алгоритма естественно нужно проводить сначала, до всяких оптимизаций, и в данную тему я думаю не входит. А ссылки интересные, читаю... Скрипун, как это вставил флэш в C++? |
|
|||||
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
|
Мой первый пример оказался очень не удачным
Этот лучше /* * * Пример : используемые внешние переменные внутри функции лучше передевать в качестве аргументов * */ v = 5; //////////////////////////////////// test1 = function () { var t1 = getTimer (); for (var i = 0; i < 100000; i++) { var u = v; } var t2 = getTimer (); trace ((t2 - t1) + " " + u); }; test2 = function (v) { var t1 = getTimer (); for (var i = 0; i < 100000; i++) { var u = v; } var t2 = getTimer (); trace ((t2 - t1) + " " + u); }; //////////////////////////////////// test1 (); test2 (v); |
Часовой пояс GMT +4, время: 01:43. |
|
« Предыдущая тема | Следующая тема » |
|
|