gpt4 book ai didi

flash - Flash 上的跳帧

转载 作者:行者123 更新时间:2023-12-04 05:25:54 28 4
gpt4 key购买 nike

有没有办法在 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com