Flash: множество идентичных SWF на одной странице - PullRequest
3 голосов
/ 07 июня 2011

Сводка

Я пытаюсь создать веб-страницу с несколькими одинаковыми SWF-файлами.У меня проблема с тупо медленной загрузкой (хотя время загрузки хорошо).У меня есть таблица 4x4 в каждой ячейке, где есть встроенный SWF-файл в iframe. (Примечание: таблица 4 X 4 => 16 SWFS) .

Мой код AS3 очень прост:

package
{
    import flash.display.Sprite;
    import flash.system.System;
    import flash.text.TextField;

    public class ActionscriptProject extends Sprite
    {
        public function ActionscriptProject()
        {
            var txt:TextField = new TextField();
            txt.x=0;
            txt.y=0;
            txt.width=5000;
            txt.height=5000;
            addChild(txt);
            txt.htmlText+="<font size='45'>"+System.totalMemory/1048576 + " MB"+"</font>";
        }
    }
}

Я загружаю его в iframe, используя этоhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Flash Testing</title>
</head>
<body>

<table border="1">
    <tr>
        <td>
            <iframe allowtransparency='true' scrolling='no' src='Flash/ActionscriptProject.html'></iframe>
        </td>
        <td>
            <iframe allowtransparency='true' scrolling='no' src='Flash/ActionscriptProject.html'></iframe>
        </td>
        <td>
            <iframe allowtransparency='true' scrolling='no' src='Flash/ActionscriptProject.html'></iframe>
        </td>
        <td>
            <iframe allowtransparency='true' scrolling='no' src='Flash/ActionscriptProject.html'></iframe>
        </td>
    </tr>
    <tr>
        ...
    </tr>
    <tr>
        ...
    </tr>
    <tr>
        ...
    </tr>
</table>    

</body>
</html>

Примечание. ActionscriptProject.html - это просто стандартный html, который Flash Builder создает с приложением.Но по просьбе The_asMan я включаю его здесь:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0014)about:internet -->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 
    <!-- 
    Smart developers always View Source. 

    This application was built using Adobe Flex, an open source framework
    for building rich Internet applications that get delivered via the
    Flash Player or to desktops via Adobe AIR. 

    Learn more about Flex at http://flex.org 
    // -->
    <head>
        <title></title>         
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <!-- Include CSS to eliminate any default margins/padding and set the height of the html element and 
             the body element to 100%, because Firefox, or any Gecko based browser, interprets percentage as 
             the percentage of the height of its parent container, which has to be set explicitly.  Initially, 
             don't display flashContent div so it won't show if JavaScript disabled.
        -->
        <style type="text/css" media="screen"> 
            html, body  { height:100%; }
            body { margin:0; padding:0; overflow:auto; text-align:center; 
                   background-color: #ffffff; }   
            #flashContent { display:none; }
        </style>

        <!-- Enable Browser History by replacing useBrowserHistory tokens with two hyphens -->
        <!-- BEGIN Browser History required section -->
        <link rel="stylesheet" type="text/css" href="history/history.css" />
        <script type="text/javascript" src="history/history.js"></script>
        <!-- END Browser History required section -->  

        <script type="text/javascript" src="swfobject.js"></script>
        <script type="text/javascript">
            <!-- For version detection, set to min. required Flash Player version, or 0 (or 0.0.0), for no version detection. --> 
            var swfVersionStr = "10.0.0";
            <!-- To use express install, set to playerProductInstall.swf, otherwise the empty string. -->
            var xiSwfUrlStr = "playerProductInstall.swf";
            var flashvars = {};
            var params = {};
            params.quality = "high";
            params.bgcolor = "#ffffff";
            params.allowscriptaccess = "sameDomain";
            params.allowfullscreen = "true";
            var attributes = {};
            attributes.id = "ActionscriptProject";
            attributes.name = "ActionscriptProject";
            attributes.align = "middle";
            swfobject.embedSWF(
                "ActionscriptProject.swf", "flashContent", 
                "100%", "100%", 
                swfVersionStr, xiSwfUrlStr, 
                flashvars, params, attributes);
            <!-- JavaScript enabled so display the flashContent div in case it is not replaced with a swf object. -->
            swfobject.createCSS("#flashContent", "display:block;text-align:left;");
        </script>
    </head>
    <body>
        <!-- SWFObject's dynamic embed method replaces this alternative HTML content with Flash content when enough 
             JavaScript and Flash plug-in support is available. The div is initially hidden so that it doesn't show
             when JavaScript is disabled.
        -->
        <div id="flashContent">
            <p>
                To view this page ensure that Adobe Flash Player version 
                10.0.0 or greater is installed. 
            </p>
            <script type="text/javascript"> 
                var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://"); 
                document.write("<a href='http://www.adobe.com/go/getflashplayer'><img src='" 
                                + pageHost + "www.adobe.com/images/shared/download_buttons/get_flash_player.gif' alt='Get Adobe Flash player' /></a>" ); 
            </script> 
        </div>

        <noscript>
            <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="100%" height="100%" id="ActionscriptProject">
                <param name="movie" value="ActionscriptProject.swf" />
                <param name="quality" value="high" />
                <param name="bgcolor" value="#ffffff" />
                <param name="allowScriptAccess" value="sameDomain" />
                <param name="allowFullScreen" value="true" />
                <!--[if !IE]>-->
                <object type="application/x-shockwave-flash" data="ActionscriptProject.swf" width="100%" height="100%">
                    <param name="quality" value="high" />
                    <param name="bgcolor" value="#ffffff" />
                    <param name="allowScriptAccess" value="sameDomain" />
                    <param name="allowFullScreen" value="true" />
                <!--<![endif]-->
                <!--[if gte IE 6]>-->
                    <p> 
                        Either scripts and active content are not permitted to run or Adobe Flash Player version
                        10.0.0 or greater is not installed.
                    </p>
                <!--<![endif]-->
                    <a href="http://www.adobe.com/go/getflashplayer">
                        <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash Player" />
                    </a>
                <!--[if !IE]>-->
                </object>
                <!--<![endif]-->
            </object>
        </noscript>     
   </body>
</html>

Браузеры

В Chrome проблем нет.Все приложения загружаются очень быстро (я бы оценил в течение 3 секунд).

В IE 8 проблема минимальна.

В IE 7 и Firefox 3.6.17 загрузка страницы занимает очень много времени.Я не тестировал в других браузерах.
В Firefox загрузка страницы занимает около 34 секунд.

Отладочная информация (Firefox)

Всего System.totalMemory сообщает, что swfs использует общую память ~ 42 МБ.

Вот снимок экрана вкладки Net в Firebug:

Изображение в полном размере enter image description here

Вопросы

  1. Есть ли хороший способ встроить несколько идентичных SWF-файлов в веб-страницу?
  2. Почему IE и Firefox так плохо борются?Я подозреваю, что это связано с тем фактом, что как IE, так и Firefox имеют только один поток для запуска плагинов (Flash).
  3. У меня есть похожее приложение, написанное на AS2 (не написано мной, у меня просто естьSWF-файл).Это намного сложнее, но загружается на несколько порядков быстрее в IE и FF.Есть ли причина, по которой AS3 прикрепляет браузер, когда AS2 этого не делает?
  4. Как я могу встроить несколько файлов SW3 AS3 в FF & IE 7 без закрепления браузера?
  5. Есть ли способ сделать приложение более легким?

Ответы [ 5 ]

1 голос
/ 10 июня 2011

Вы пробовали создать SWF-контейнер, который сам загружает другие SWF-файлы?Это может быть быстрее, потому что тогда Firefox не должен иметь дело с накладными расходами инициализации SWF снова и снова.Довольно просто создать пустой фильм, который загружает кучу других фильмов и размещает их в сетке.

0 голосов
/ 16 июня 2011

Вы пытались поместить Flash / ActionscriptProject.html в поддомен?(Чтобы это работало, вам нужно изменить файл hosts).Это часто помогает с асинхронными операциями загрузки.

Что если вы поместите этот тег сценария из загруженного html внизу тела или вызовете его после очень короткой задержки?Таким образом, HTML будет загружен и будет считаться «загруженным» FF и IE7.

0 голосов
/ 16 июня 2011

Не могли бы вы изменить CSS вашего фреймворка? Таким образом, для 15 контейнеров установлено «display: none», а для другого вручную заданы высота и ширина, чтобы заполнить их пространство? У вас есть хакерский вызов * .hide () для ненужных частей.

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

0 голосов
/ 14 июня 2011

Возможно, вы могли бы пошатнуть загрузку SWF-файлов с помощью JavaScript. Сделайте так, чтобы JavaScript создавал ваш HTML, один или два SWF / TD за раз с небольшим промежутком времени между ними. Это может дать браузеру возможность подумать.

0 голосов
/ 11 июня 2011

Изучите время загрузки бланка SWF x 16. Как это сравнивается? если он значительно отличается от 16 вашего SWF, то ваш SWF должен выполнить некоторую тяжелую инициализацию, если так, попробуйте и избегайте этого.

Флэш-плееры загружаются не сразу, а 16 из них - намного дольше, чем один; если вам нужно несколько игроков, вы можете улучшить пользовательский опыт, загрузив их в DOM после загрузки страницы.

Как уже говорили другие, Flash-плеер не был специально разработан для такого использования, и лучше избегать такого рода вещей.

...