Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Flex > Страшная прожорливость Flex 4


Автор: ANTON_AL 1.11.2009, 13:17
Есть очень серьёзная проблема с Adobe AIR приложением.

В списке отображается ~1000 иконок, размером 32x32.
До загрузки иконок, приложение потребляет 31 Мб оперативной памяти.
После загрузки и отображения, потребляется уже 241 Мб памяти.

Код программы
Код

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                       xmlns:s="library://ns.adobe.com/flex/spark" 
                       xmlns:mx="library://ns.adobe.com/flex/halo">
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.events.FlexEvent;
            import flash.filesystem.File;
            
            
            //
            // 
            //
            var imagesFolder = "data";
            [Bindable] var images: ArrayCollection = new ArrayCollection;
            
            
            //
            // 
            //
            function LoadImages( )
            {
                /*
                    В этом случае, потребляется 70 Мб.
                */
                var folder: File = File.applicationDirectory.resolvePath( this.imagesFolder );
                                
                /*
                    Если папка с иконками находится в другом месте, то кушается уже 250 Мб !!!
                */
                //var folder: File = File.applicationDirectory.resolvePath( "C:/temp" );
                
                if ( folder.isDirectory )
                {
                    var files: Array = folder.getDirectoryListing( );
                    for each( var file: File in files )
                        if ( ! file.isDirectory && file.extension == "jpeg" || file.extension == "jpg" || file.extension == "png" )
                                this.images.addItem( file.url );
                }
            }
        ]]>
    </fx:Script>
    
    
    <s:VGroup width="100%" height="100%">
        
        <s:Button label="load images" click="{LoadImages()}" />
        <s:List dataProvider="{images}" width="100%" height="100%" useVirtualLayout="false">
            <s:layout>
                <s:TileLayout columnWidth="72" rowHeight="72" />
            </s:layout>
            <s:itemRenderer>
                <fx:Component>
                    <s:ItemRenderer>
                        <!--States must be included obligatory, because they are inside of List control, that needs this states-->
                        <s:states>
                            <s:State name="normal" />
                            <s:State name="hovered" />
                            <s:State name="selected" />
                        </s:states>
                        
                        <mx:Image source="{data}" width="100%" height="100%" />
                    </s:ItemRenderer>
                </fx:Component>
            </s:itemRenderer>
        </s:List>
        
    </s:VGroup>
</s:WindowedApplication>


Проект с тестовыми иконками выложил на http://ifolder.ru/14782482  (Project -> Clean, затем - Run)


Причём, заметил такой парадокс:
   Если папка с иконками находится в bin-debug, т.е. в той же папке, что и приложение, то потребляется 70 Мб.
   Если папка с иконками находится в другом месте, скажем - C:/temp, то потребляется 250 Мб.
Если посчитать, сколько будут занимать данные пикселей RGBA для 1000 иконок, размером 32x32, то получим
   32x32x4x1000 = 4 Мб

useVirtualLayout мне необходимо отключить, чтобы при прокрутке, пользователь не видел, как подгружаются иконка

Честно говоря, такому поведению у меня объяснения пока нет...

Есть идеи, как с этим бороться ?

Автор: SoWa 1.11.2009, 14:50
Объяснение может быть в файловой системе... Я так думаю, что создание ссылок на далеко лежащие файлы итп...

Автор: ANTON_AL 1.11.2009, 15:05
Интересно, какие же ссылки должны быть ?

Даже если все иконки продублировать 2 раза, то будет 16 Мб для того, чтобы держать всё в оперативной памяти. Но 250 - это что-то невообразимое...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)