【问题标题】:Stop rendering in Flash w/ ActionScript 3使用 ActionScript 3 停止在 Flash 中渲染
【发布时间】:2011-04-15 16:57:21
【问题描述】:

这是我的问题:我有几个显示对象被循环修改,我希望 Flash 在每个循环结束时准确呈现一帧。循环的持续时间可能会发生不可预测的变化,因此恒定的帧速率不会做到这一点。

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

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

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

糟糕,我忘记了礼貌。早上好/下午好,请提前谢谢。

【问题讨论】:

  • 您能否提供一些代码来详细了解您的问题。我认为您的问题是关于 Flex 验证生命周期(我的意思是 invalidateDisplayList() 等),但不确定。

标签: flash actionscript-3 flex4


【解决方案1】:

使用 updateAfterEvent 在下一次计划的渲染更新之前强制渲染并没有错,但是您不希望浪费计时器(函数调用过多)。相反,在循环结束时调度你自己的渲染事件,监听它,然后 updateAfterEvent()。

也就是说,如果我们谈论的是 for、while 等循环,您不应该在循环中间看到渲染内容。 Flash 在同步代码执行期间不呈现。那部分让我想知道您的代码中到底发生了什么。

【讨论】:

  • "Flash 不会在同步代码执行期间呈现" 好吧,我可以向您保证,即使不使用 updateAfterEvents,Flash 也会呈现我的显示对象。它必须在代码执行期间执行,因为它是一个持续执行很长时间的循环(是的,一个while循环)。我想 Flash 会暂停代码执行以进行渲染,但它会在循环的任何点(我称之为“循环中间”)这样做。感谢关于调度我自己的事件的建议,现在看起来更干净了。
【解决方案2】:

有不同的方法来解决这个问题,尽管这似乎是您的整体设计问题,而不是 Flash 中的限制。我认为长时间循环往往不是一个好主意....如果您需要完全控制,我会在屏幕外渲染所有内容,而不是将当前对象附加到 DisplayList。这需要将所有内容添加到未附加的精灵中,然后在需要时绘制它。这里的缺点是你不会得到任何鼠标事件/键盘事件。

看起来像:

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);

【讨论】:

    猜你喜欢
    • 2011-01-02
    • 2012-01-13
    • 2013-08-24
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多