由于大量的图书馆对象,我的.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内存的警告对话框。
所有建议都非常受欢迎。
答案 0 :(得分:0)
我终于得到了它,感谢Vesper! 这里是关于Flash Professional CC的详细说明(如此详细,因为这对我来说是全新的,而且我多次花了两天时间这次失败):
备注:强>
创建空的.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,再次感谢! :)