怎样编写一个帧速率检测器。

      多媒体世界 2006-5-25 15:1
怎样编写一个帧速率检测器。
作者:改将

很多的时候。比如说游戏当中,我们都需要知道我们的电影实际播放的速率是多少。通过puppettempo()或者在score栏虽然可以设置电影的播放速率。但是如果舞台的演员很多。或者运行了较多的程序。实际播放的速度都达不到设置的速度。那么我们怎样得到真正的帧速率呢?我们来说一个简单的思路。

在director中。每次进入到一帧的时候都会激发exitframe事件。这样我们就可以通过这个事件来获取到具体的帧速率了。计算原理很简单。就是看一秒钟exitframe运行了多少次。用exitframe运行的次数除以时间,就是帧速率了(FPS即帧每秒)。

在director里面建一个文本演员。然后将下面的行为赋给他,就行了。
property curtime,pcount,pfrate,ptime
on beginsprite me
curtime=_system.milliseconds
pcount=0
end
on exitframe me
ptime=(_system.milliseconds-curtime)/1000+1
pfrate=integer(pcount)/ptime
pcount=pcount+1
sprite(me.spritenum).member.text=string(pfrate)
end

这样。我们就简单的做好了一个帧速率监测器。

但是如果电影运行的很长。我们这个帧检测器得到的只是一个平均的帧播放速率。我们有时间需要一个更加准确的速率,这样我们需要将起始的时间重新设置,这样我们又需要一个重新设置的按钮。然后再写一个行为用来将pcount设置为0,以及将curtime设置为当前时间。当然你也可以干脆这样。在上面的行为里加这么一段:
on mouseup me
beginsprite()
end
这样。你就可以通过点击帧速率监测器来重新计算帧速率了。
这样好象已经很不错了。不过这样播放器实在是太简陋了。可不可以做的更好一些呢?

答案当然是可以的。但是如果在director里面做的话。精美是精美很多了。可是或许需要五六个member才能完成这件事情,这样就使用起来就很不方便了。可以不可以一个member来搞定一个精美的监测器呢?这样就可以封装所有内容,从而可以更加方便的使用.

答案依然是:Yes,这个时间我们就需要使用到另外一个工具:flash,他一个很大的优点就是时间轴是可以自包含的。即同一个时间可以有很多个时间轴(director在某种情况下也可以有一些简单的,如filmloop),如果我们在flash里面写一个监测器,然后放到director来检测,是不是也可以呢?于是我便开始做了。用flash写一个(因为这里主要讲director的,所以具体程序不再描叙,思路和前面的一样。换flash语法而已。)。导入到director里面,运行。失败了。因为是在flash里面写的。监测的当然是flash的播放速率。实际上,在flash帧速率设置为12,在director就显示12,设置30,他就显示30.

怎么办?难道没有办法呢吗?突然想起在director的flash设置中有rate的选项,里面有一个叫lock-step的项。选中他,再运行,行了。在这里,我们的director命令flash要你自己设置的帧速度运行。老大开口。小弟当然要照着做。

哈哈。搞定了。终于搞定了。我仰天长啸。慢着,好像还有不妥。有什么不妥?

因为director一向以速度见长。我设置director跑到999,flash还能够lock-step director的脚步吗?说试就试.于是乎我将帧速率设置到999,Run,果然,小弟flash跟不上老大director的脚步了.拼了老命也就700多帧(我机器P4 3.0G.512M内存,64显存,唉,看来没有办法了.可是对于我这样追求完美的人来说,这个是不能接受的.

于是乎我就想,那我可以不可以通过diretor来向flash发消息的方式来做呢?这样就是真正的监测到director的帧速率了.
可是这样的话.就需要在director里面写程序这样,又不能够以一个member来搞定一切了.真的是烦啊.

不过引用一个伟人的话:只要是人.就一定会有办法.在我正郁闷的时候,Idea就来了.director里面不是还有一个老掉牙的member script吗?这个是可以附在member上面的.这样.director里面的程序就可以和flash两位一体了.看来老人家还是有老人家的用途的.
(在这里我就不放原程序了,思路基本上和上面的一样,就是在
on exitframe me
sprite(i).pcount=sprite(i).pcount+1 --以前是在flash里面的帧时间里面pcount++,现在是把这个工作放到director里面来做.
end
有兴趣的可以下载附件.里面有所有的源程序)

这样,一个比较完美的director帧速率检测器就做好了.


备注1:将附件的frateshow2导入到director里面,就可以当作一个帧监测器使用了.
备注2:实际测试中发现我用director本身写的文本检测器效率低下.:)
标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commenttime}{commentauthor}

{CommentUrl}
{commentcontent}