Форум 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=80543)

heilong 31.05.2006 14:29

Оптимизация для скорости в общем
 
Предлагаю обсудить техники оптимизации 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м плане.

orangeline 31.05.2006 21:31

сам с такой жёсткой оптимизацией по скорости не сталкивался ввиду отсутствия необходимости таковой, но слышал. - генерируемый as байт-код является избыточным и если из него убрать (утилитой flasm) лишнее то + 20-30% скорости

Bkmz 31.05.2006 22:14

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

heilong 01.06.2006 11:39

просто об оптимизации в общем есть много ресурсов и информации, а конкретно как лучше делать во флэше я нигде не нашёл.
или какие функции и property во флэше медленные и как это обойти.
flasm надо бы попробовать

iNils 01.06.2006 12:01

первое что в голову пришло
Код:

/*
 *
 *        Пример : используемые внешние переменные внутри функции лучше передевать в качестве аргументов
 *
 */
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);


KPaul 01.06.2006 12:25

Также можно пособирать в инете быстрые ф-ции и использовать их вместо дефолтных. Например следующая ф-ция выполняется более чем на 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;
        }
}

Естественно длинна цепочки разрешения переменных(областей видимости), как сказал iNils может сильно влиять на производительность.
На самом деле очень много нюансов, начинаю от стиля написания кода и заканчивая течническими деталями(best practice).
Попробуй почитать тут, может чем-то поможет:
http://www.adobe.com/devnet/flash/ar...practices.html
http://www.adobe.com/devnet/flash/ar...practices.html

vooparker 01.06.2006 12:28

Прошу прощения, что не в тему. Но.

iNils можешь объяснить одну вещь, исходя из примера test1 работает медленнее поскольку начинает искать по цепочке областей видимости значение v (если я правильно понимаю). Так вот после первого TestMovie в OutPut у меня вывалилось 1064 и 868 соответственно (что вполне логично). НО! Второй TestMovie мне выдал примерно одинаковый результат - 856 и 860, а третий - 823 и 852.

Собственно вопрос почему?
Сразу прошу прощения, если ответ на вопрос очевиден, но все же хотелось бы его увидеть.

Скрипун 01.06.2006 12:28

Мы тут как-то обсуждалди что С++ в десятки (сам посчитал) считает sin в цикле... вот... Я сделал так:
Вставил флэш во С++ и там считал это синус, а результат только передавал флэшу... и все довольные... (флэш, С, я ....)

heilong 01.06.2006 12:49

iNils, у меня твой тест выдаёт
1553
1534
разница, пожалуй, несущественна

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

Скрипун, как это вставил флэш в C++?

iNils 01.06.2006 12:50

Мой первый пример оказался очень не удачным :)
Этот лучше
Код:

/*
 *
 *        Пример : используемые внешние переменные внутри функции лучше передевать в качестве аргументов
 *
 */
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, время: 08:00.

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