AS3/ AIR PrevFrame() 的替代方案(如果影片剪辑很大则太慢)
AS3/ AIR Alternative to PrevFrame() (too slow if big movieclip)
我在使用 prevFrame() 时遇到问题。在我以前的项目中,我从来没有遇到过问题(使用非常简单),但是这个……我不明白。一切都在做它需要做的事情,但是当我尝试转到 "main movieclip" 的 prevFrame 时,它需要很长时间。
一些背景:我正在为一种古老的语言(非拉丁字母)制作字典。有 6.000 个字形,所以我必须找到一种方法来制作如此复杂的字形 "keyboard"。
var gArray: Array = [gEmpty, clavierUI.g1, clavierUI.g2, clavierUI.g3, (...)
clavierUI.g50
]; //array contaning the buttons for the keyboard (50 instances of the same
//movieclip. This movieclip is made of 6.000 frames, each containing a
//glyph), the fnClavier function makes each of the fifty instances go to its
//respective frame)
var myXML2: XML = new XML();
var XML_URL2: String = "assets/glyphs.xml";
var myXMLURL2: URLRequest = new URLRequest(XML_URL2);
var myLoader2: URLLoader = new URLLoader(myXMLURL2);
myLoader2.addEventListener("complete", xmlLoaded2);
//import the codename for each glyph
function xmlLoaded2(event: Event): void {
myXML2 = XML(myLoader2.data);
}
var xml2: XMLList = myXML2.glyph.code;
function fnClavier(e: Event): void { //transforms the keyboard
for each(var glyph: MovieClip in gArray) {
glyph.gotoAndStop(gArray.indexOf(glyph) + (50 * (clavierUI.currentFrame - 1)));
//the seconde half (50 * (...) -1))) can be explained like that :
//50 = 50 keys by keyboard "page".
// clavier.currentFrame - 1 = modifier, tells which set of the 6000 glyphs
//needs to appear (and later, correspond with the codename from xml)
}
}
clavierUI.nextPage.addEventListener(MouseEvent.CLICK, fnNextPage);
function fnNextPage(e: Event): void {
clavierUI.nextFrame(); //no problem here, goes fast.
fnClavier(null);
}
clavierUI.prevPage.addEventListener(MouseEvent.CLICK, fnPrevPage);
function fnPrevPage(e: Event): void {
clavierUI.prevFrame(); //takes about 20secondes to go back.
fnClavier(null);
}
我的代码可能远非完美(我还在学习),但我不知道为什么它不起作用。跳转帧并转到下一帧效果很好,所以有人知道为什么返回一帧需要很长时间吗?
谢谢。
你最好使用容器而不是框架。每次在关键帧之间移动时,帧都会被构建和解构,同时构建所有容器一次,然后根据需要显示它们,一次一个容器。我希望 Flash 在某处进行优化,在通过 nextFrame() 显示之前构建下一帧,而突然调用 prevFrame() 会强制 Flash 立即构建它,如果它非常复杂,可能会花费很多时间.
你有 6000 个字形?这是很多,但不是太多。例如,您可以创建一组容器,每个容器包含 120 个字形。为此,您创建了一个 Sprite
数组,每个数组都有一个 12x10 的字形网格,总共有 50 个。然后,当您需要另一个页面时,显示数组中的另一个精灵。此外,如果您的字形是静态矢量对象,您应该将其转换为矢量图形,并添加为库项目(Shape
后代,这些占用更少的内存)。如果是光栅,则使用 Bitmap
和基础 BitmapData
类 来使用它们。
我在使用 prevFrame() 时遇到问题。在我以前的项目中,我从来没有遇到过问题(使用非常简单),但是这个……我不明白。一切都在做它需要做的事情,但是当我尝试转到 "main movieclip" 的 prevFrame 时,它需要很长时间。 一些背景:我正在为一种古老的语言(非拉丁字母)制作字典。有 6.000 个字形,所以我必须找到一种方法来制作如此复杂的字形 "keyboard"。
var gArray: Array = [gEmpty, clavierUI.g1, clavierUI.g2, clavierUI.g3, (...)
clavierUI.g50
]; //array contaning the buttons for the keyboard (50 instances of the same
//movieclip. This movieclip is made of 6.000 frames, each containing a
//glyph), the fnClavier function makes each of the fifty instances go to its
//respective frame)
var myXML2: XML = new XML();
var XML_URL2: String = "assets/glyphs.xml";
var myXMLURL2: URLRequest = new URLRequest(XML_URL2);
var myLoader2: URLLoader = new URLLoader(myXMLURL2);
myLoader2.addEventListener("complete", xmlLoaded2);
//import the codename for each glyph
function xmlLoaded2(event: Event): void {
myXML2 = XML(myLoader2.data);
}
var xml2: XMLList = myXML2.glyph.code;
function fnClavier(e: Event): void { //transforms the keyboard
for each(var glyph: MovieClip in gArray) {
glyph.gotoAndStop(gArray.indexOf(glyph) + (50 * (clavierUI.currentFrame - 1)));
//the seconde half (50 * (...) -1))) can be explained like that :
//50 = 50 keys by keyboard "page".
// clavier.currentFrame - 1 = modifier, tells which set of the 6000 glyphs
//needs to appear (and later, correspond with the codename from xml)
}
}
clavierUI.nextPage.addEventListener(MouseEvent.CLICK, fnNextPage);
function fnNextPage(e: Event): void {
clavierUI.nextFrame(); //no problem here, goes fast.
fnClavier(null);
}
clavierUI.prevPage.addEventListener(MouseEvent.CLICK, fnPrevPage);
function fnPrevPage(e: Event): void {
clavierUI.prevFrame(); //takes about 20secondes to go back.
fnClavier(null);
}
我的代码可能远非完美(我还在学习),但我不知道为什么它不起作用。跳转帧并转到下一帧效果很好,所以有人知道为什么返回一帧需要很长时间吗? 谢谢。
你最好使用容器而不是框架。每次在关键帧之间移动时,帧都会被构建和解构,同时构建所有容器一次,然后根据需要显示它们,一次一个容器。我希望 Flash 在某处进行优化,在通过 nextFrame() 显示之前构建下一帧,而突然调用 prevFrame() 会强制 Flash 立即构建它,如果它非常复杂,可能会花费很多时间.
你有 6000 个字形?这是很多,但不是太多。例如,您可以创建一组容器,每个容器包含 120 个字形。为此,您创建了一个 Sprite
数组,每个数组都有一个 12x10 的字形网格,总共有 50 个。然后,当您需要另一个页面时,显示数组中的另一个精灵。此外,如果您的字形是静态矢量对象,您应该将其转换为矢量图形,并添加为库项目(Shape
后代,这些占用更少的内存)。如果是光栅,则使用 Bitmap
和基础 BitmapData
类 来使用它们。