- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用内置的 NMEPReloader 作为我在 openfl 中预加载器的基类。
我正在做的是逐帧播放动画
class AttractAnimation extends Sprite
{
var currentFrame:Int;
var previousFrame:Int;
var bitmapFrames:Array<Bitmap>;
var loadScreenTimer:Timer;
public function new()
{
super();
currentFrame = 0;
previousFrame = -1;
bitmapFrames = new Array<Bitmap>();
}
public function assignBitmapData(bitmapData : Array<BitmapData>){
for(bmap in bitmapData){
var frame = new Bitmap( null, flash.display.PixelSnapping.AUTO, true );
frame.bitmapData = bmap;
pushFramesAsBitmap(frame);
}
}
public function pushFramesAsBitmap(frameAsBitmap:Bitmap) {
bitmapFrames.push(frameAsBitmap);
frameAsBitmap.visible = false;
addChild(frameAsBitmap);
}
public function startAnimation(fps:Int) {
var milliseconds:Float = 1000 / fps;
loadScreenTimer = new Timer(milliseconds, 10);
loadScreenTimer.addEventListener(TimerEvent.TIMER, updateAnimation);
loadScreenTimer.start();
}
private function updateAnimation(e : TimerEvent):Void {
if (currentFrame > bitmapFrames.length -1) { currentFrame = 0; }
if (previousFrame != -1) {
bitmapFrames[previousFrame].visible = bitmapFrames[previousFrame].__combinedVisible = false;
}
bitmapFrames[currentFrame].visible = bitmapFrames[currentFrame].__combinedVisible = true;
previousFrame = currentFrame;
currentFrame++;
}
}
当我调用 playAnimation 时,我看到它卡顿得很厉害,下次我播放动画时它播放得很流畅。
我曾尝试将 alpha 设置为 0 来播放动画,然后将其设置回 1 并播放,但在这种情况下它第二次会卡顿。
同样,如果我将它移到另一个显示对象后面播放动画,然后将它移到绘制顺序的前面,它会第二次卡顿。
有没有办法让我播放这个动画时不卡顿?
最佳答案
由于您的实现非常简单并且不依赖于太多外部 API,因此计时器可能是一个原因。请记住,预加载器实际上会优先加载所有内容,因此延迟是可以预料的,除非您采取措施隐藏或阻止它。由于滞后,定时器事件很可能会连续多次触发。这会导致视觉错误和卡顿。
首先,首先尝试使用 enterFrame 事件监听器而不是计时器,这在大多数情况下(如果不是所有的话)都是一个糟糕的设计选择。
//Using this event listener
addEventListener(Event.ENTER_FRAME, OnUpdateAnimation);
//which would call this function every frame
function OnUpdateAnimation(e:Event):Void
{
//calculate delay since last frame
//play next frame
}
其次,不使用位图数组,而是使用单个位图和位图数据数组。虽然对于不应有太大变化的小动画来说,这是一种更好的做法并且可以帮助提高性能(例如,在预加载器中)。
这是一个扩展 Sprite 的动画类的新实现。它尚未经过测试,但应该像宣传的那样工作。请注意,通常,为每个对象使用一个 EnterFrame 监听器并不是一个好的做法;你通常会有一个主更新函数,它会遍历所有可更新的对象。但如果是这种情况,它就足够了。
class Animation extends Sprite
{
private var mBitmapDataList:Array<BitmapData>; //a list of bitmapdata
private var mBitmap:Bitmap; //the bitmap that will contain all bitmapdata
private var mCurrentIndex:Int; //the currently displayed bitmapdata
private var mFrameLength:Float; //the duration of a frame in miliseconds
private var mDeltaTime:Float = 0; //the current delta time for time-based updates
private var mTime:Float; //a variable containing the current time since the last frame change
public function new(aFrameLength:Float)
{
super();
mFrameLength = aFrameLength;
mBitmapDataList = new Array<BitmapData>();
mBitmap = new Bitmap();
addChild(mBitmap); //add the bitmap to the scene
//(it will display nothing as no bitmapdata is set)
mCurrentIndex = 0;
}
//add a bitmapdata instead of a complete bitmap object
public function addBitmapData(aBD:BitmapData):Void
{
mBitmapDataList.push(aBD);
}
public function play():Void
{
addEventListener(Event.ENTER_FRAME, onEnterFrame, false, 0, true);
}
private function onEnterFrame(e:Event):Void
{
var currentTime = Lib.getTimer(); //get the current time
var elapsed:Float = (currentTime - mDeltaTime); //calculate the time since the last update
mDeltaTime = currentTime;
mTime += elapsed; //add the elapeed time to mTime
if (mTime >= mFrameLength) //if it is time to change frame...
{
mTime = 0;
mCurrentIndex++;
if (mCurrentIndex == mBitmapDataList.length) mCurrentIndex = 0;
mBitmap.bitmapData = mBitmapDataList[mCurrentIndex]; //change it
}
}
}
这样,即使在卡顿的极端情况下,也只会跳过第一帧。另请注意,在某些目标上,您将无法显示图像,因为它们尚未加载。另一种解决方案是不嵌入 Assets <assets path="assets" embed="false"/>
并使用 OpenFL 的 Assets 类加载它们(因此完全放弃预加载器,在我看来这是一个花哨的东西)
PS:请原谅我在变量上加了 m 和 a 前缀。 m 用于成员变量,a 用于参数。
关于javascript - 预加载器中的 OpenFL 动画总是第一次卡顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46101134/
我在 Java Swing 中移动 block 时遇到卡顿问题。 下面的代码将显示该问题。运行时,我希望盒子移动平稳,没有任何卡顿。 Swing中有没有办法实现这一点?或者我应该继续使用 JavaFX
在我的应用程序中,我在主要 Activity 中实现了滑动菜单抽屉。菜单的设计是自定义的,单击菜单中的列表项会打开一个 fragment 。 private class SlideMenuClickL
我尝试制作ImageView 的扩展布局动画和平移 动画,但我同时启动它们时它们看起来有点滞后。我在真实设备 Moto X(2013) 上对其进行了测试。不确定更强大的设备,因为默认情况下我所有的模拟
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或include a min
首先,让我澄清一些事情: 我的显示器频率为 60 赫兹 我将我的 FPS 限制在 60,它似乎工作正常 我激活了双缓冲标志 我自己制作了一个后台缓冲区,并确保绘制到它,然后再绘制到屏幕 这个问题在全屏
我在以下测试页面上使用 Flexslider(旧版本 1.0,支持 jquery 1.4.8):http://www.showstyle.lu/service/startv2/ 如您所见, slide
我有一项服务可以在 AysncTask 的 doInBackground() 方法中下载一个大文件: data = new byte[8192]; output = new FileOutputStr
我有一个动画师,infinite_rotation,定义为: 当我不再需要它的时间(时间不确定)到来时,我调用 infinite_animator.cancel()。然后在其布局容器上播
向元素添加过渡并更改宽度和/或高度以及 -webkit-transform:translate3d 时,过渡动画会断断续续。它似乎首先为宽度/高度变化设置动画,并对其进行部分平移,然后捕捉到最终平移位
当 AVSpeechSynthesizer 正在说一个句子时,UI 发生变化(例如 ViewController 被推送,UIButton的标题已更改,...),AVSpeechSynthesizer
在 Firefox 11 中,我在使用 HTML5 的 Canvas 和翻译的一些基本动画中遇到偶尔的抖动/犹豫/卡顿。 请看下面的例子... http://jsfiddle.net/ACRdx/ 上
问题 我正在尝试让 Canvas 上的图像从左向右平滑移动。它在 Chrome/Safari 上还不错(仍然有点卡顿),但在多台机器上的 Firefox 中有明显的卡顿(在 Windows 和 Mac
我正在使用 Ariel Flesler's ScrollTo script在 this page .我在页面底部有两个链接,可以滚动到页面顶部(其中一个还可以打开联系表格)。我注意到在滚动开始时页面顶
我一直在尝试创建一个充满卡片 View 的回收站 View 。目前,我正在使用来自 this tutorial 的 Recycler View并加载 14 张不同的图像。专业品质的图像大小范围从 13
我创建了一个带有自定义单元格的 UItableview。这些单元格有两个 UILabel 和一个在后台线程上调用图像的 ImageView 。这些单元首先加载一些占位符数据,以防 API 调用时间较长
用例 我有 68 个钢琴样本,每个样本大约。 174 kB,Ogg 数据,Vorbis 音频,立体声,s16,44100 Hz,352 kb/s,4 秒。 我需要同时演奏它们的不同组合(音乐术语:和弦
喂, https://jsfiddle.net/jbwq6y87/7/ #box { width: 500px; height: 500px; transition: 0.5s; ov
这是一个演示: http://nushuttles.com/chords/player.html 顶部的方 block 是用 Flash 渲染的,下面的方 block 是用 Javascript 制作
我有一个 RecyclerView 这是一个垂直滚动的项目列表。每个列表项在 Lite Mode 中包含一个 Google Maps V2 MapView .我正在利用这个返回位图而不是完整 map
在我的应用程序中,一旦用户进入它,我在仪表板上有太多动画只发生一次 - 即当用户第一次进入应用程序时 - 我在 viewDidAppear 中以这种方式执行动画,调用 upperViewAnimati
我是一名优秀的程序员,十分优秀!