Flash Professional CC 无法从巨大的 .fla 发布 swf

Flash Professional CC stuck on publishing swf from huge .fla

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

我已经尽可能地缩小了图像的尺寸,同时仍然保持良好的质量。

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

我听说像实例等所有东西都有 16.000 的神奇限制,所以它应该保持在它下面,因为代码本身非常简单并且这些图像之后没有很多其他实例。

除了丑陋的文件大小之外,我还在循环中将所有这些图像从库中推送到数组中: (链接名称例如是“Paper1_Chem_Q1_C.jpg”,而“_X”标记了正确答案——这就是我取消移动的原因)

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 内存太小的警告对话框。

非常欢迎所有建议。

我终于让它工作了,感谢 Vesper! 这是 Flash Professional CC 的详细说明(如此详细是因为这对我来说是全新的,我花了将近 2 天的时间多次失败):

第 1 步 - 发布 SWC:

  1. 创建空的 .fla 并将图像导入库。 Select全部 图像并使用 mouse2 按钮打开属性。在 ActionScript 选项卡 select ActionScript 导出。确保 第 1 帧中的导出 也已激活。
  2. 属性面板为您的项目定义一个类名,例如:images_swc.
  3. 转到“发布设置”并仅发布 SWC。

备注:

  • 在我的例子中,由于图像数量 (15000+),我不得不创建 3 个 SWC 文件。
  • 虽然adding/removing大量图片to/from库,发布SWC时,Flash Professional停止响应,看起来像崩溃,但在30-60分钟内成功完成!
  • 当处于 "not responding" 状态一个多小时后,我终止了 Flash 进程并尝试使用较小数量的图像。
  • 首先我创建了 "empty" .fla,方法是从我的主项目中删除图像以外的所有内容,但不知何故它在 SWC 发布期间没有导出正确的图像。但是在我另存为..我的图像项目之后,它就像一个魅力。
  • 总是在 Flash 通知 JVM 内存不足时,我将 jvm.ini 中的内存值加倍并重新开始。 (最终达到 4096m。)

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

  • 文件 -> 发布设置 -> 高级 ActionScript 3.0 设置(扳手图标在右上角)-> 库路径 选项卡 -> 单击浏览到 SWC 文件,找到您的 SWC 并单击 好的.
  • 创建空的 .as 文件并在其中键入每个图像类名。这里的想法是提及来自 SWC 的所有图像,以便编译器了解您希望将它们包含在您的主项目中。例如:

    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 > filename.txt" -命令将文件名收集到 txt 文件中。我自己使用了 Directory List & Print 的免费版本,它也可以从子文件夹中查找文件,将文件列表粘贴到 Assets.as 中,并使用 Flash 中的查找和替换功能替换“.jpg”和“”。

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

@Vesper,再次感谢! :)