我正在编写一个带有as3的flash应用程序,如果你想查看这个应用程序:http://www.kongregate.com/games/yossefki/nqueensolver
这个应用程序做了一些需要时间的极端计算。我想在屏幕上显示“加载”,直到我写完主要计算之前完成计算。
loadingText.visible = true
在我写完
之后loadingText.visible = false
但没有显示任何内容。如果我理解正确,只有在计算完成后才会进行更改,因此它会变得可见并再次返回到不可见状态 然后才应用更改。 有办法解决它吗?
这是功能:
public function solve():void{
//sizeOfBoard:int , solutionNumber:int):Array
trace("start solving at queens");
loadingText.visible = true;
trace("loading set to visible");
solutionNumDes++;
solutionNumCounter = solutionNumDes;
for(var i:int=0;i<_size;i++)
solution[i] = 0;
resetBoard();
if(solveRec(0))
display();
trace("loading set to unvisible");
loadingText.visible = false;
trace("finised solving at queens");
}//solve
其中solveRec
是繁重的计算
答案 0 :(得分:1)
问题可能在于您在同一帧中进行计算和可见性切换。
所以基本上你可能正在做的是:
loadingText.visible = true;
loadingText.visible = false;
这里的问题是,与异步操作(如加载内容)不同,您必须“等待”计算结束。您可以通过等待一帧直到开始计算来避免这种情况。为了简单起见,loadingText.visible
可以是一个标志,表示需要计算,每帧都会检查。
loadingText.visible = true;
if(loadingText.visible)
loadingText.visible = false;
在计算结果时,您仍然无法执行任何操作。这意味着显示加载文本有效,但您不能拥有花哨的加载条或旋转圆。为此,您需要使用更高级的技术,通过每帧只计算部分计算,将整个计算分割为多个帧。
您可以拆分这样的功能:
private function solveButtonClicked():void {
loadingText.visible = true;
}
private function enterFrame(e:Event):void {
if(loadingText.visible) solve();
}
private function solve():void {
solutionNumDes++;
solutionNumCounter = solutionNumDes;
for(var i:int=0;i<_size;i++)
solution[i] = 0;
resetBoard();
if(solveRec(0))
display();
trace("loading set to unvisible");
loadingText.visible = false;
trace("finised solving at queens");
}//solve
答案 1 :(得分:1)
如果计算时间超过帧刷新间隔,屏幕将冻结,直到操作完成。您必须将计算分散到帧以上,然后将剪辑设置为可见和不可见将真正显示一些结果。
结帐Pseudothreads。它是一种简洁实用的方法,可将长计算分成相当大的部分,并为Flash Player留下足够的处理能力,以便及时重绘屏幕。