【发布时间】:2011-06-07 19:58:37
【问题描述】:
总结
我正在尝试制作一个包含多个相同 SWF 的网页。我遇到了加载缓慢的问题(尽管下载时间很好)。我在每个单元格中有一个 4x4 表格,并且 iframe 中嵌入了一个 swf 文件。 (注: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>";
}
}
}
我正在使用这个 html 将它加载到 iframe 中:
<!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 只是 Flash Builder 使用应用程序创建的标准 html。但应 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 总共报告说 swf 为我们提供了约 42 MB 的组合内存。
这是 Firebug 中“网络”选项卡的屏幕截图:
问题
- 有没有一种将多个相同的 swf 嵌入网页的好方法?
- 为什么 IE 和 Firefox 如此糟糕?我怀疑这与 IE 和 Firefox 都只有一个线程来运行插件(Flash)这一事实有关。
- 我有一个用 AS2 编写的类似应用程序(不是我写的,我只有 swf 文件)。它要复杂得多,但在 IE 和 FF 中加载速度要快几个数量级。 AS3 固定浏览器而 AS2 没有固定浏览器是否有原因?
- 如何在不固定浏览器的情况下将多个 AS3 swf 嵌入 FF 和 IE 7?
- 有没有办法让应用程序更轻量级?
【问题讨论】:
-
您是否有理由将 swfs iframe'ing 到您的页面中?我不确定它的性能行为,但我知道对象和嵌入标签利用浏览器缓存
-
@Ben,没有 iframe 的行为是相似的。我把它放在 iframe 中是因为 a) 我们的最终产品使用的是 iframe。 b) 更容易理解,因为 html 更简单 c) 性能差异很小或没有。
-
发布您的嵌入代码。你在使用反缓存技巧吗?
-
你为什么要设置
txt.width=5000和txt.height=5000?这可能会导致巨大的性能问题。 -
可能是 System.totalMemory 调用。我认为这报告了所有正在运行的闪存播放器/空中实例的内存使用情况。有 16 个单独的实例可能会发生一些奇怪的事情。
标签: flash actionscript-3 internet-explorer firefox