Конференция "Основная" » Delphi, Flash, Адресное пространство, производительность, размер [D7]
 
  • Joker © (09.07.09 00:55) [0]
    Имеется некий swf(600-700кб) со своим набором библиотек, графики, звуков и конфигураций в формате XML(все вместе порядка 80мб).

    Имеет работоспособное приложение, написанное на  Delphi. Задача приложения - запустить flash и выделить под него достаточно памяти и сисетмных ресурсов для сведения тормозов обработки флеш к минимуму.

    Для написания и компиляции использовалась компонент Delphi - надстройка над FlashControl f-in-box.

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

    вот код:


    unit MainUnit;

    interface

    uses
     Windows, SysUtils, Classes, Graphics, Controls, Forms, Messages, Dialogs,
     FlashPlayerControl, StdCtrls, ShellApi, ComCtrls;

    type
     TMainForm = class(TForm)
       CheckBoxSounds: TCheckBox;
       FlashFrame: TTransparentFlashPlayerControl;
       PlayNetwork: TButton;
       procedure FormCreate(Sender: TObject);
       procedure CheckBoxSoundsClick(Sender: TObject);
       procedure PlayNetworkClick(Sender: TObject);

    private
       FlashPath: String;
       FPlaySWF: Boolean;

    procedure OnGlobalLoadExternalResource(const URL: WideString; Stream: TStream);
     public
     { Public declarations }
     end;

    var
     MainForm: TMainForm;

    implementation

    {$R *.DFM}

    procedure TMainForm.FormCreate(Sender: TObject);
    begin
     SetGlobalOnLoadExternalResourceHandler(OnGlobalLoadExternalResource);
     CheckBoxSounds.Checked := FlashPlayerControl.GetAudioEnabled;
     FlashFrame.Movie := ExtractFileDir(Application.ExeName) + '\FLASHbyteCODE.swf';
     FlashFrame.Play;
     FPlaySWF := True;
    end;

    procedure TMainForm.OnGlobalLoadExternalResource(const URL: WideString; Stream: TStream);
    var
     FileStream: TFileStream;
     MemoryStream: TMemoryStream;
    begin
     if URL = 'anything' then
     begin
       if Length(FlashPath) > 0 then
       begin
         FileStream := TFileStream.Create(FlashPath, fmOpenRead);
         MemoryStream := TMemoryStream.Create;
         MemoryStream.LoadFromStream(FileStream);
         MemoryStream.SaveToStream(Stream);
         FileStream.Free;
         MemoryStream.Free;
       end;
     end;
    end;

    procedure TMainForm.CheckBoxSoundsClick(Sender: TObject);
    begin
    FlashPlayerControl.SetAudioEnabled(CheckBoxSounds.Checked);
    end;

    procedure TMainForm.PlayNetworkClick(Sender: TObject);
    begin
    FPlaySWF := True;
    FlashFrame.Movie := 'http://WEB PATH/FLASHbyteCODE.swf';
    FlashFrame.Play;
    end;

    end.



    Проблема следующего характера: конечный exe весит 600+ кб, если компилировать в Delphi 2009, в Delphi 7 получается 400+.

    Приложение отлично работает, но производительность оставляет желать лучшего. Тестировалось на разрешении экрана 1280х800.

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

    Я совсем недавно начал писать на delphi  и все мои поиски по данному вопросу ни к чему не привели. Прошу совета, куда копать(желательно с примером или со ссылкой).

    С уважением, Дмитрий
  • Rouse_ © (09.07.09 10:28) [1]
    Выкинь FlashPlayerControl вмето него размести WebBrowser в который и подгружай свой флэш
  • Joker © (09.07.09 15:45) [2]
    Фишка в том, что часть web browser'ов использует flash.ocx, который является activeX плагином. Так вот, критично delphi, который юзает надстройку над InternetExplorer, который в свою очередь беспощадно режет FPS, что в сою очередь приводит "покадровке" при отрисовке flash'ового swf .... и т.д.  Вобщем выглядит это, как говно дергающееся....

    FF и Chrome используют плагины, но где же взять код. Именно тот код, который будет делать то, что нужно и так быстро, как только возможно. Плюсом cashe надо предусмотреть т.к. 70мб(80+ на вырост) должны быть "под рукой".

    В общем с производительность разобрался сам. С размером файла не вышло к сожалению :(

    Почему именно FlashPlayerControl? Это все, что я смог найти для решения задачи... Он является компонентом к Delphi имеет неплохую функциональну обертку для flash. А так как в прикладном программировании я полный, не побоюсь этого слова, лох, то связка "Delphi 2009 + SampleCode + WorkableComponent" наиболее удачной и единственной возможной.

    Теперь о насущном:

    * Flash не имеет программной и аппаратной поддержки видеокарты. Сильно грузит CPU и ОЗУ
    * Есть вариант приложения написанный на С, который использует flash.ocx напрямую из своего каталога. Упаковано   неизвестно чем и непонятно как.
    Минусы приложения: размер 1.5мб, лишние прибамбасы(запись видео с настройкой кодека и качества, скриншоты, настройка прокси и т.д.) exe, утечки памяти. Жутко тормозит, съедает рабочий стол и оооочень долго кубаторит, но работает.

    Достаточный набор сюрпризов, чтоб отказаться от него.

    Какие способы и меры можно предпринять, чтобы ускорить обработку изменений изображения во внутреннем FlashFrame? Решение проблемы кроется где-то неглубоко. Резон полагать, что оно есть: Это искусственное занижение браузером на activeX числа кадров(FPS).

    Есть ли в делфи какие либо способы контролировать подобные вещи? Что такое AlphaBlending?

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

    Буду очень благодраен за любые наводки
  • KilkennyCat © (09.07.09 15:47) [3]

    > Flash не имеет программной и аппаратной поддержки видеокарты

    ага. поэтому отрисовывает телепатически.
  • Joker © (09.07.09 15:47) [4]
    p.s.: Получившееся приложение хоть и неприятно дергает графику при изменении, но жрет меньше памяти, работает быстрее и отклик действий пользователя(клавиатура и мышь) куда четче ... Наполовину эффект достигнут
  • KilkennyCat © (09.07.09 16:04) [5]
    я когда-то давно в 7-ке делал презентацию картинок, ну и флэшек... для художника... ща глянул, нифига уже не понял, че-там наворотил :)
    использовано: ShockwaveFlashObjects_TLB, ShockwaveEx, ShockwaveList
    ничего не тормозило
  • KilkennyCat © (09.07.09 16:05) [6]
    и кстати, если на флэшке вызвать контекстное меню, то там есть пунктик использовать граф. ускорение....
  • Joker © (09.07.09 16:09) [7]

    > KilkennyCat ©   (09.07.09 15:47) [3]
    >
    > > Flash не имеет программной и аппаратной поддержки видеокарты
    >
    > ага. поэтому отрисовывает телепатически.


    А без сарказма нельзя?

    В чем-то вы правы. Если намек был на Flash 10 с заявленной поддержкой аппаратного ускорения визуализации, то потребуется видеокарта с полной поддержкой DX10. Windows XP отпадает, вместе с ним огромное количество видеокарт. У меня для примера стоит windows 7, видео с поддержкой DX10, сама полноценная DX10, но рельно ощутить это производительность, увы не приходится
  • Joker © (09.07.09 16:14) [8]

    > KilkennyCat ©   (09.07.09 16:04) [5]
    > я когда-то давно в 7-ке делал презентацию картинок, ну и
    > флэшек... для художника... ща глянул, нифига уже не понял,
    >  че-там наворотил :)
    > использовано: ShockwaveFlashObjects_TLB, ShockwaveEx, ShockwaveList
    > ничего не тормозило
    >
    >


    Хмм... Можете себе представить флэшку размером в пол мегабайта, которая использует конфиги на XML и динамически подгружает в себя другие флэш и бинарники из библиотеки, время от времени общаясь с сервером?

    Мелкие flash летают, но тут все сложнее...
  • KilkennyCat © (09.07.09 17:29) [9]

    > Можете себе представить флэшку размером в пол мегабайта,
    >  которая использует конфиги на XML и динамически подгружает
    > в себя другие флэш и бинарники из библиотеки, время от времени
    > общаясь с сервером?


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

    Пример конфига на ХМЛ. Не тормозит :)
  • KilkennyCat © (09.07.09 17:32) [10]
    не влазеит, блин. :)
  • KilkennyCat © (09.07.09 17:35) [11]
    86 килобайт ХМЛ. это он еще не совсем полный :)
  • Joker © (09.07.09 17:51) [12]
    Flex SDK в основном
  • Joker © (25.07.09 17:58) [13]
    Все ясно ... "Никто ничего не знает". Буду обсуждлать в других местах ... Всем успехов (:
 
Конференция "Основная" » Delphi, Flash, Адресное пространство, производительность, размер [D7]
Есть новые Нет новых   [133926   +466][b:0][p:0.001]