Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Оптимайзинг (http://www.flasher.ru/forum/showthread.php?t=136623)

Crenth 21.02.2010 16:15

Оптимайзинг
 
Вот взялся оптимайзить написанное.
Цель - добиться уменьшения размеров swf без ущерба функциональности.

Обратил внимание на такую вещь:
В языках программирования, разработанных не индусами, часто повторяющийся код собирают в кучу и выносят в отдельные блоки, называемые подпрограммами (во времена Брежнева) или функциями (процедурами).

А поскольку АС3 не относится к таковым, вынося повторяющие наборы строк в отдельную функцию, получаем увеличение размера swf-файла.

Или, вот такой пример: по тексту я использую присваивание myUrl="http://myUrl" в нескольких местах. Чтобы не менять везде по тексту содержимое myURL в случае необходимости, вынес значение myURL в отдельную переменную mainURI:String="http://myUrl" и теперь в тексте использую присваивание myURL=mainURI. И получаю увеличение размера swf против того, как если бы не использовал mainURI.

Может я не ту религию исповедую ?
Кто какие методы использует ?

P.S. нашел полезный материал по теме http://lurkmore.ru/%D0%98%D0%BD%D0%B...BA%D0%BE%D0%B4 :)

wvxvw 21.02.2010 16:57

В HaXe есть inline, но это скорее на производительность влияет, на объем кода - не особенно, даже, скорее, в худшую сторону. А вообще зависит от многих факторов, отдельная функция добавит байткода на ее описание, например, но если размер функции много больше ее описания, а используете вы ее неоднократно, то, конечно, стоит ее делать отдельной функцией.

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

ps_spectre 21.02.2010 17:15

Ради спортивного интереса маленький эксперимент провел:
есть класс
Код AS3:

package 
{
        import flash.display.Sprite;
        public class TestConst extends Sprite
        {
                //private static const str:String = "world";
                public function TestConst():void
                {
                }               
                public function method1():void
                {
                        var s:String = "hello" + "world";
                }
....повторить еще 5 раз...
                public function method7():void
                {
                        var s7:String = "hello" + "world";
                }

компилим mxmlc TestConst.as получаем - 733 байта, а если везде заменить слово "world" на константу - private static const str:String = "world" => str - то получаем 730 байт (от 730 до 734, по-разному)

Но это все конечно ерунда, ради хорошего дизайна всегда лучше использовать константы, дабы избежать "Magic Strings" ,)

Тоже самое по второму пункту, сделал отдельный класс, вынес туда функционал, скомпилил compc -source-path . -include-classes MyClass -output test.swc, присоединил к основной программе, результат тот же по размеру, что и напрямую иметь этот класс.

VVall 21.02.2010 17:59

Надо учитывать, что весь swf после компиляции пакуется. Поэтому одинаковые функции займут примерно как одна. И три байта - не показатель, эта разница может быть чисто за счёт разной даты компиляции (при каждой компиляции одинакового кода всегда есть разброс в несколько байт).

Crenth 21.02.2010 18:05

ps_spectre, интересно.

Я делаю проекты в CS4.

Тут, кстати, еще нашел такую весчь: если скопипастить весь текст из файла main.as, затем создать новый Flash File AS3 и вставить текст в него, затем скомпилить, то размер получается байт на 100 меньше, чем в прежнем файле, где я делал многочисленные отладки, дописки/переписки...

Значит, какие-то фантомы остаются по ходу пьесы. Наверное, это один из факторов, который при счастливом стечении обстоятельств проявляется как "необъяснимый глюк" программы

P.S. История для поднятия настроения
Когда-то давно я отлаживал в институте преподу программу его диссертации. Дело было на Фортране. Чуть более 100 тысяч строк. Оно нифига не хотело работать. И вот однажды, когда я искал причину "неработы" софтины, вставляя промежуточные print для проверки, случайно обнаружил, что если вставить в определенном месте программы пустой print, то все начинало работать прекрасно....

С тех пор не перестаю удивляться тому, как на двух разных компах в одинаковом софте получаются разные результаты :)

ps_spectre 21.02.2010 18:13

VVall, бесспорно ,)
На мое мнение, парится на счет пары десятков килобайт (в лучшем случае на проект, и то, не факт что вообще размер увеличится), пытаясь "оптимизировать" за счет многократного ухудшения читабельности кода (не использовать констант для "магический чисел,строк", писанина в одном файле, не разбивать систему на классы, не выносить одинаковый функционал в библиотеку и т.д.) бессмысленно. ))

вообщем, wvxvw первым постом в теме все в принципе сказал :)

Добавлено через 5 минут
Crenth, посмотрите в сторону Flex SDK - это бесплатная весчь, в нем есть компилятор mxmlc (as -> swf) и compc (as -> swc)
статейка для разгона

з.ы. Сам КС4 не использую, пробовал скачать 30-дневную триал версию, посмотрел, не понравилось абсолютно, какое-то психологическое отвращение к этому инструменту, мне, как программисту, нафиг не надо кс4, тем более, за него надо не мало денег платить. ) Как тут было на форуме кем-то сказано, flex sdk + flash develop = нормальный такой "бомж" пакет, ) а для графики связка GIMP + Inkscape + blender))) Ну это не по теме, да )

Crenth 21.02.2010 18:23

ps_spectre,
оно конечно вы правы все.

Однако, проблема современного программерства в том, что никто не парится над оптимайзингом. Гигагерцы процессоров и гигабайты мозгов пережевывают даже индусский код.
В лихие перестроечные времена приходилось выгонять каждый лишний килобайт памяти в HighMem, чтобы написанная софтина могла больше.
Счаз конечно пипл себя чувствует вольготно. Поставил Suite, которая в архиве инсталлятора занимает Гиг !!!, установил. Работаешь. Скомпилил проект. Какая разница, будет его юзер качать 2 секунды через DSL или 32. Его проблемы...
Дальше будет хуже, поверьте :)

Я себя отношу к индейцам, а не к индусам. Поэтому и парюсь над темой...

Psycho Tiger 21.02.2010 18:55

Круто. А ещё скажите художнику, чтобы следил за цветами - они должны быть именно такими, какими должны быть, без +- 1 к номеру цвета.

FlexSDK наилучшее решение, только вот недавно был случай - компилю проект, на локале всё зашибись - но как уходит флешка в нетворк - так крашится, эксепшны, все дела. В браузере на локале тоже работает. Оказалось дело в embed шрифте - убрал его и он заработал. До сих пор сам не верю.

По теме - ну выжмите вы даже 5% сокращения кода в проекте - это не то. Ужимать надо видео/звук/графику, если вам нужен размер, но никак не код.

wvxvw 21.02.2010 19:03

Оптимизацией должен заниматься препроцессор и компилятор (ну, если не считать клинических случаев). AS3 компилятор тут, правда, особо не блещит, но, если вы прям уж так задались целью оптимизировать - оптимизируйте байткод / пишите постпроцессор. На том этапе, на котором вы это пытаетесь сделать - это искать черную кошку ночью в темной комнате :)

TERRORist 21.02.2010 19:04

флешка сжимается zip или чем то подобным, так что сжимайте графику и не страдайте ерундой))


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

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