Flash Professional CC坚持从巨大的.fla发布swf

时间:2015-04-07 03:49:09

标签: actionscript-3 flash-cc

由于大量的图书馆对象,我的.fla大约600mb。 我在库中有15.500个对象,其中大多数是图像。这可能是不好的做法,但我的客户需要在其中包含这些图像,而不是从某些外部源动态加载它们。

我已经尽可能地减小了图像的大小,同时保持了良好的质量。

我正在为Flash Player发布,并且已经尝试过不同的版本。 基本上我的应用程序是相当简单的试卷应用程序,用简单的多重选择问题填充20个试卷。每个试卷有150个问题,分为4个部分,每个问题包含1个问号图像和4个答案图像可供选择。用户选择他/她的答案后,这些图像实例将被删除,并且正在创建新的图像实例。

我已经听说像实例这样的所有内容都有16.000的神奇限制,所以它应该保持正确,因为代码本身非常简单且并不多这些图像之后的其他实例。

除了我丑陋的文件大小外,我还将所有这些图像从库中推送到数组中: (链接名称例如" Paper1_Chem_Q1_C.jpg "和" _X "标记正确答案 - &#39 ;为什么我解除了那个原因?

var sectionLengths:Array = [40,40,45,25];
var prefixes:Array = ["Phys","Chem","Maths","Eng_Reas"];
var prefixes2:Array = ["A","B","C","D"];
for(var p:int = 0; p<20; p++){ //test papers loop
    for(var s:int = 0; s<4; s++){ //sections loop
        var fillQArray:Array = this["tp"+(p+1)+"section"+(s+1)+"questions"];
        var fillAArray:Array = this["tp"+(p+1)+"section"+(s+1)+"answers"];

        for(var q:int = 0; q<sectionLengths[s]; q++){ //question loop
            if(ApplicationDomain.currentDomain.hasDefinition(String("Paper"+(p+1)+"_"+prefixes[s]+"_Q"+(q+1)))){
                fillQArray.push(getDefinitionByName("Paper"+(p+1)+"_"+prefixes[s]+"_Q"+(q+1)) as Class);
                var qa:Array = new Array();
                for(var a:int = 0; a<4; a++){ //answers loop
                    if(ApplicationDomain.currentDomain.hasDefinition(String("Paper"+(p+1)+"_"+prefixes[s]+"_Q"+(q+1)+"_"+prefixes2[a]))){
                        qa.push(getDefinitionByName("Paper"+(p+1)+"_"+prefixes[s]+"_Q"+(q+1)+"_"+prefixes2[a]));
                    }else if(ApplicationDomain.currentDomain.hasDefinition(String("Paper"+(p+1)+"_"+prefixes[s]+"_Q"+(q+1)+"_"+prefixes2[a]+"_X"))){
                        qa.unshift(getDefinitionByName("Paper"+(p+1)+"_"+prefixes[s]+"_Q"+(q+1)+"_"+prefixes2[a]+"_X"));
                    }
                }
                fillAArray.push(qa);
            }
        }
    }
}

这个循环肯定能完成这项任务,但需要一些时间才能运行。另外,我预先定义了很多阵列,这可能是另一个潜在的问题吗?

在开发过程中,我用很少的试卷测试了所有内容,这一切都像魅力一样,但现在当我导入所有剩下的图像时,它就会停留在发布上。我把它留给了整个晚上发布,但现在早上它又一次被卡住了,我必须杀掉Flash进程才能退出。

我还将内存量从jvm.ini增加到2048m,所以它不再提供有关太小JVM内存的警告对话框。

所有建议都非常受欢迎。

1 个答案:

答案 0 :(得分:0)

我终于得到了它,感谢Vesper! 这里是关于Flash Professional CC的详细说明(如此详细,因为这对我来说是全新的,而且我多次花了两天时间这次失败):

第1步 - 发布SWC:

  1. 创建空的.fla并将图像导入库。选择所有 使用鼠标2按钮的图像和打开属性。在 ActionScript 标签中 选择导出for ActionScript 。确保同时第1帧中的导出已激活。
  2. 属性面板中为项目定义类名,例如: images_swc
  3. 转到发布设置并仅发布SWC。
  4. 备注:

    • 在我的情况下,由于图像数量(15000 +),我不得不创建3个SWC文件。
    • 在向库中添加/删除大量图像时,在发布SWC时,Flash Professional停止响应并且看起来像是崩溃,但在30-60分钟内它成功完成!
    • 当“无响应”状态超过一小时时,我杀了Flash进程并尝试使用少量图像。
    • 首先,我通过删除主项目中的所有内容创建了我的“空”.fla,但不知何故,它在SWC发布期间没有导出正确的图像。但是在我保存为...我的图像项目之后,它就像一个魅力。
    • 当Flash通知低JVM内存时,我总是将jvm.ini中的内存值加倍并重新开始。 (最终有4096米。)

    第2步 - 在主项目中使用SWC:

    • 档案 - &gt; 发布设置 - &gt; 高级ActionScript 3.0设置(扳手 - 右上角的图标) - &gt; 图书馆路径标签 - &gt;点击浏览到SWC文件,找到您的SWC并点击确定
    • 创建空的.as文件并在其中键入每个图像类名。这里的想法是提到SWC中的所有图像,以便编译器能够理解您希望将它们包含在主项目中。 e.g:

      package {   
        public class Assets {       
          image_1;
          image_2;
          image_3;
        }
      }
      
    • 在您的主项目中,包括Assets.as和您的SWC文件:

      import Assets;
      import images_swc;
      
    • 请参阅您的图片:

      getDefinitionByName("image_1")
      

    最终说明:

    • 如果您忘记了“SWC classname”,请将SWC文件的扩展名更改为.zip,打开它,然后您将从其中的xml文件中找到您的类名和其他详细信息。

    • 要获取.as文件的大量图像的文件名(假设您的图像具有相同的类名和文件名),可以使用Windows命令提示符和“ dir / s&gt; filename。 txt “ - 命令将文件名转换为txt文件。我自己使用Directory List & Print的免费版本,它也可以从子文件夹中找到文件,将文件列表粘贴到Assets.as中并使用Find&amp;替换Flash中的功能,将“ .jpg ”替换为“; ”。

    所以,我有超过15000张图像,将它们变成3个SWC文件=每个SWC 15-20兆,而我的最终.swf大约是55兆 - 而且它是在几分钟内编译的,这使得这个非常完美的解决方案我的项目。

    @Vesper,再次感谢! :)