flash - Flash 上的跳帧

标签 flash actionscript-3

有没有办法在 Flash 上本地启用跳帧?

当您开发游戏时,您会开发动画以匹配游戏玩法的节奏,并以目标帧速率(Flash 通常为 24-40fps)进行制作。但是如果用户的电脑速度太慢,无法保持目标帧率,Flash会自动降低fps,导致应用程序播放缓慢。

如果您使用基于时间的逻辑,基于帧的渲染将与基于时间的逻辑不匹配,并且事情会很奇怪,并且会有很多极端情况需要解决。

事实上,我知道有些游戏使用这种跳帧逻辑,例如 Popcap 的 Zuma Blitz。他们是否自己实现了跳帧?

除非我能以某种方式重新实现 MovieClip 类并使其轻松地跳过帧,否则我无法在项目中这么晚才实现这一点。另外,自己控制动画(覆盖 Flash 原生 MovieClip 控件)的开销不会太大吗?

最佳答案

好的,我意识到您不是在寻找以下“解决方案”,这将不起作用,因为仍将播放所有帧:

stage.frameRate = new_frame_rate;

唯一的解决方案是在 enterFrame 回调中跳过帧:
// Defined elsewhere.
var current_frame:Number = 0;
var frame_skip_factor:uint; // Skip one frame every 'x' frames.
var is_frame_skip_active:Boolean;

function on_enter_frame(event:Event):void
{
   if ( is_frame_skip_active && current_frame++ % frame_skip_factor == 0) { return; }

   // Game logic/rendering code...
}

(假设,根据最佳实践,您在单个回调中集中了游戏逻辑/动画),但是在运行任何异步回调时可能会出现竞争条件/复杂性。

没有办法在运行时实际跳过帧;这是 AVM 契约(Contract)的一部分 - 无论如何都不会跳过任何帧,运行所有代码。如果性能是一个问题,您可以尝试异步代码执行。有几种方法可以做到:

1) 将一些计算卸载到 Pixel Bender,以便它可以异步和/或并行处理 (http://www.adobe.com/devnet/flex/articles/flashbuilder4_pixelbender.html)

2) 在多个帧上分散执行冗长的操作(需要状态保存和状态恢复,一种纪念品模式)。此处的详细信息(和精彩阅读):http://www.senocular.com/flash/tutorials/asyncoperations/

在任何情况下,我都(首先)建议使用 Flash Builder Profiler 或 Stats 类(Doob 先生)等工具明确确定性能瓶颈。

Blitting 也可能是解决方案(为动画的每一帧创建一个带有图块的 spritesheet)。但无论如何,我认为您需要做的是子类化 MovieClip 并覆盖 play()、stop() 和 gotoAndPlay() 方法。你的类应该是这样的:
public class MyMovieClip extends MovieClip
{
   override public function play():void
   {
      addFrameSkipListener();

      super.play();
   }

   override public function gotoAndPlay(frame:Object, scene:String = null):void
   {
      addFrameSkipListener();

      super.gotoAndPlay(frame, scene);
   }

   // ....
}

如有必要,跳帧监听器将根据当前帧速率或帧时间跳过帧。当然,您还需要在动画结束时删除 frameSkipListener。

虽然 MovieClip 覆盖解决方案可能会在纸上完成您想要的操作,但如果您有很多对象,这实际上可能会降低性能,因为额外的 ENTER_FRAME 监听器会增加一些开销。

关于flash - Flash 上的跳帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7935114/

相关文章:

xml - 我是否发现了 AS3 的 XML 类中的错误?

apache-flex - 有没有办法计算一个函数需要多长时间?

javascript - SIFR 3 : Background Transparent?

actionscript-3 - 在本地 Adob​​e Media Server 上播放视频

flash - AS3 中的 TextFieldAutoSize 和 textWidth

actionscript-3 - AS3 : ByteArray and BitmapData

flash - 解析 X-amf mime 类型数据

javascript - 用于网络摄像头视频捕获的 Red5 录像机和服务器的简单替代品?

apache-flex - 在 Adob​​e Flex 中获取用户的语言环境

actionscript-3 - 如何在 Windows 10 中安装 Flash 调试版本