预加载器悬挂/冷冻与“打嗝”

时间:2011-05-24 14:55:29

标签: flash freeze preloader

我为拥有GoDaddy帐户并已成功将所有文件上传到托管服务器的客户开发了基于Flash的网站。该站点由一个名为“preloader.swf”的初始预加载器组成,该预加载器加载名为“main.swf”的外部SWF文件,该文件包含不同的部分,包括图像库部分。

然而,我注意到有时(并非总是会发生这种情况)主闪存网站的初始闪存预加载器比“打嗝”更快地加载。这导致当必须在站点的库部分中查看图像时(其中每个图像从具有其自己的预加载器的服务器外部加载),所选图像以锯齿状方式加载“打嗝”(例如从22%它暂停然后立即跳到31%,然后再次暂停并立即跳到47%,依此类推。)

然后,在某个时间点,预加载器突然冻结/挂起整个站点,除了刷新站点之外别无选择。

只有这样,一旦图像的预加载器冻结并刷新网站,或清除缓存,整个网站将完美地工作 - 即初始预加载器加载更慢,更平滑,以及预加载器当图像加载时也更加平滑(没有像以前那样突然跳跃百分比;预加载器以正常增量加载)。

任何人都可以告诉我可能的解决方案是什么问题可能解决方案我如何能够平稳地加载网站,而不必遇到任何打嗝,冻结和挂起,因为我一直在检查我的代码但我发现它没有任何问题?

我正在做一些研究,并且读到原因可能是因为以下行“ProgressEvent.PROGRESS”,因为它有时可能不会在IE或Firefox中触发。是这样吗?如果是这样,我必须采取什么选择?

希望尽快听到回复。

谢谢&问候。

P.S。下面我已经包含了我的初始预加载器的AS编码来加载主站点(而不是用于加载图像的预加载器):

import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;

//no scale;
stage.scaleMode = StageScaleMode.NO_SCALE;

//align to top left
stage.align = StageAlign.TOP_LEFT;

stage.addEventListener(Event.RESIZE, onPreloaderResize);
addEventListener(Event.ENTER_FRAME, onPreloaderEnter);

angel_pic.alpha = 0;

top_left_line.visible = false;
top_right_line.visible = false;
side_left_line.visible = false;
side_right_line.visible = false;
bottom_left_line.visible = false;
bottom_right_line.visible = false;

var req:URLRequest = new URLRequest("main.swf");
var loader:Loader = new Loader();
loader.load(req);

loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, showProgress);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);

function showProgress(event:ProgressEvent):void
{
    var percent:Number = Math.round((event.bytesLoaded / event.bytesTotal) * 100);

    if ((percent > 0) && (percent <= 34))
    {
        top_left_line.visible = true;
        top_right_line.visible = true;

        top_left_line.width = percent * ((angel_pic.width / 2) / 34);
        top_right_line.width = percent * ((angel_pic.width / 2) / 34);
    }
    else
    {
        if ((percent > 34) && (percent <= 66))
        {
            side_left_line.visible = true;
            side_right_line.visible = true;

            side_left_line.height = (percent - 34) * (angel_pic.height / 32);
            side_right_line.height = (percent - 34) * (angel_pic.height / 32);
        }
        else
        {
            if (percent > 66)
            {
                bottom_left_line.visible = true;
                bottom_right_line.visible = true;

                bottom_left_line.width = (percent - 66) * ((angel_pic.width / 2) / 34);
                bottom_right_line.width = (percent - 66) * ((angel_pic.width / 2) / 34);
            }
        }
    }
}

function loadComplete(event:Event):void
{
    var num:int = numChildren;

    while (num--)
    {
        removeChildAt(num);
    }   

    addChild(loader);
}

function onPreloaderResize(event:Event):void
{
    var preloaderPadding:Number = (stage.stageWidth / 1000) * 35;

    angel_pic.x = (stage.stageWidth / 2) - (angel_pic.width / 2);
    angel_pic.y = (stage.stageHeight / 2) - (angel_pic.height / 2);

    angel_pic.width = stage.stageWidth - (preloaderPadding * 2);
    angel_pic.height = angel_pic.width / 4.9;

    top_left_line.x = stage.stageWidth / 2;
    top_left_line.y = angel_pic.y;

    top_right_line.x = stage.stageWidth / 2;
    top_right_line.y = angel_pic.y;

    side_left_line.x = preloaderPadding + side_left_line.width;
    side_left_line.y = angel_pic.y;

    side_right_line.x = preloaderPadding + angel_pic.width;
    side_right_line.y = angel_pic.y;

    bottom_left_line.x = preloaderPadding + bottom_left_line.height;
    bottom_left_line.y = angel_pic.y + angel_pic.height;

    bottom_right_line.x = preloaderPadding + angel_pic.width;
    bottom_right_line.y = angel_pic.y + angel_pic.height;
}

function onPreloaderEnter(event:Event):void
{
    var preloaderPadding:Number = (stage.stageWidth / 1000) * 35;

    angel_pic.x = (stage.stageWidth / 2) - (angel_pic.width / 2);
    angel_pic.y = (stage.stageHeight / 2) - (angel_pic.height / 2);

    angel_pic.width = stage.stageWidth - (preloaderPadding * 2);
    angel_pic.height = angel_pic.width / 4.9;

    top_left_line.x = stage.stageWidth / 2;
    top_left_line.y = angel_pic.y;

    top_right_line.x = stage.stageWidth / 2;
    top_right_line.y = angel_pic.y;

    side_left_line.x = preloaderPadding + side_left_line.width;
    side_left_line.y = angel_pic.y;

    side_right_line.x = preloaderPadding + angel_pic.width;
    side_right_line.y = angel_pic.y;

    bottom_left_line.x = preloaderPadding + bottom_left_line.height;
    bottom_left_line.y = angel_pic.y + angel_pic.height;

    bottom_right_line.x = preloaderPadding + angel_pic.width;
    bottom_right_line.y = angel_pic.y + angel_pic.height;
}

2 个答案:

答案 0 :(得分:0)

我之前遇到过预加载器问题。

虽然代码中可能还有问题,但可能还有其他已知问题可能会排除在您的问题中。

如果您只在生产服务器上遇到问题,而不是在PC上本地遇到问题,那么很可能您的服务器设置可能是罪魁祸首。

检查my blogpost有关压缩二进制文件的服务器gzip压缩的信息。 虽然它是关于flex的帖子,但原理是相同的,也应该适用于flash。

干杯

答案 1 :(得分:0)

在将网站上传到GoDaddy服务器之前,我曾经使用Flash自己的“模拟下载”选项进行测试,从来没有遇到任何问题。

只有在我上传网站后,我才开始遇到这个问题。

我无法理解和解决的奇怪的事情是,只有当预加载器冻结/挂起并且网站刷新或缓存被清除时,整个网站才能完美地工作,没有任何故障或锁定!

我甚至上传了一个简单版本的预加载器(如下面的代码所示),它加载了包含单张图片的3Mb SWF文件,但仍然存在同样的问题。但我不认为代码中存在问题,对不对?

var req:URLRequest = new URLRequest("main-mini.swf");
var loader:Loader = new Loader();
loader.load(req);

loader.contentLoaderInfo.addEventListener(Event.OPEN, showPreloader);
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, showProgress);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, showContent);

var preloader:Preloader = new Preloader();

function showPreloader(event:Event):void {
    addChild(preloader);
    preloader.x = (stage.stageWidth / 2) - (preloader.width / 2);
    preloader.y = (stage.stageHeight / 2) - (preloader.height / 2);
}

function showProgress(event:ProgressEvent):void {
    var percent:Number = event.bytesLoaded / event.bytesTotal;
    preloader.percentage.text = Math.round(percent * 100) + "%";
    preloader.bar.width = 300 * percent;
}

function showContent(event:Event):void {
    removeChild(preloader);
    addChild(loader);
}

我还尝试在HTML和Flash中使用缓存清除技术,并将帧速率从31fps降低到21fps,但一切都是无用的。

我可能会问一些愚蠢的东西,但它可能是来自GoDaddy服务器的东西吗?可能有一些设置我应该调整它才能正常工作,或者我可能会“严重”上传它?我使用FTP方法通过Dreamweaver上传了该站点。我不知道在这一点上想到什么...

如果有人能够告诉我如何解决我的这个问题,我会非常感激,因为一切都在当地工作 - 一旦上传,问题就出现了。

感谢。