2011-04-15 70 views
1

以下是我的问题:我有一些由循环修改的显示对象,并且我希望Flash在每个循环结束时只显示一帧。循环的持续时间可能不可预测地变化,因此恒定的帧速率不会这样做。在Flash中停止呈现w/ActionScript 3

我发现了一种hack-ish方式,在每个循环结束时使用带有0ms定时器的updateAfterEvent渲染一帧。现在我想阻止Flash在循环中渲染帧:这是浪费时间和资源,并产生奇怪的闪烁效果。将帧速率设置为0将是一个简单的解决方案,但stage.frameRate的最小值为0.01。

问题1:有没有办法正确停止标准渲染循环? 解决方法不会被视为有效的答案,因为我目前正在做的是一个非常好的解决方法(每100秒1帧可以忍受)。

问题2:有没有比updateAfterEvent更好的方法来强制渲染?

哎呀,我忘记了文明。早上好/下午好,请提前致谢。

+0

能否请您提供一些代码,了解详细信息您的问题。我认为你的问题是关于Flex验证生命周期(我的意思是`invalidateDisplayList()`等),但不知道。 – Constantiner 2011-04-15 17:03:09

回答

1

使用updateAfterEvent在下一次计划的渲染更新之前强制渲染没有任何问题,但是您的浪费计时器是不可取的(太多的函数调用)。相反,在循环结束时分派你自己的渲染事件,监听它,然后updateAfterEvent()。这就是说,如果我们正在谈论的是for,while等..循环,你不应该在循环中看到渲染的东西。 Flash在同步代码执行期间不会呈现。那部分让我想知道你的代码中究竟发生了什么。

+0

“在同步代码执行期间不会呈现Flash” 嗯,我可以向你保证,即使不使用updateAfterEvents,Flash也会呈现我的显示对象。它必须在代码执行期间执行,因为它是一个长时间连续执行的循环(是的,一个while循环)。我想Flash会暂停代码执行来渲染,但它在循环的任何一点都会这样做(我称之为“在循环中间”)。 感谢关于派遣我自己的活动的建议,现在看起来很干净。 – Grimy 2011-04-15 17:45:33

1

有很多不同的方法可以解决这个问题,虽然这在整体设计上似乎是一个问题,而不是Flash中的限制。我认为很长一段时间的循环往往是一个坏主意....如果你需要完全控制,我会脱离屏幕渲染一切,而不是将当前对象附加到DisplayList。这需要将所有内容添加到未连接的精灵,然后在需要时进行绘制。这里的缺点是你不会得到任何mouseevent/keyboardevent。

的样子:

var bmp:BitmapData = new BitmapData(800,600,true); 
var container:Sprite = new Sprite(); 

// add all your display objects to the container 

stage.addChild(new Bitmap(bmp)) 

// render loop 
for each (var dsp:DisplayObject in objects) { 
    // stuff 
} 

// clear our bitmap 
bmp.fillRect(bmp.rect, 0); 
bmp.draw(someContainer);