我正在开发一个独立的Flash应用程序(使用Flex3/ActionScript3编写),它具有文本爬行功能,就像你在观看有线新闻频道时可能在电视底部看到的那样;它是一个从右向左移动的狭长方框。
我实现它的方法是创建一个Label元素,用文本填充它,然后使用带有Linear.easeNone缓动函数的mx:Move对象移动它。这是可行的,但它还有很大的改进空间。它看起来有点抖动,而且往往有相当多的“撕裂”(文本的上半部分和下半部分有时会不同步)。
我试着用数学方法解决这个问题,让爬行的移动速度与显示器的刷新率同步,但那是失败的。我费了好大劲才发现,这款应用的帧速率跳跃得太厉害了;它的爬行速度“优化”了,有的看起来很光滑,有的看起来像是得了癫痫。
人们还会建议我试着把这件事解决掉吗?你有什么可以推荐我试试的替代设计吗?
**编辑:**一些背景:爬行是数字标牌应用程序(从独立的Flash投影仪播放--没有网络浏览器)的一部分,该应用程序在屏幕上的其他地方执行操作,包括视频回放和渲染文本和图像。在视频播放过程中,它肯定会变得更加断断续续,但它永远不会像我希望的那样顺畅。
5条答案
按热度按时间ca1c2owp1#
这个问题有两个可能的解决方案,但都有警告,第一个是因为您使用了Flex和独立的投影仪,第二个是因为它是一个缓解因素,而不是一个完整的解决方案。
硬件加速
在发布文件时,您可以尝试让Flash利用硬件加速来缓解您遇到的导致撕裂的垂直刷新问题。遗憾的是,Flex Builder 3无法在SWF(投影仪)级别(Link to bug)启用此设置。这一问题尚未解决,已从4.0版本推到4.1版本,再到4.x版本。如果它被解决了,它很可能会成为Flash Builder 4的项目设置中的编译器参数。
您可以通过将投影仪作为标准SWF输出,并将其嵌入到设置为“DIRECT”或“GPU”的HTML文档中,来确定此解决方案是否适用于您。遗憾的是,如果它确实存在(应该如此),你现在无论如何都不能使用它。如果你有Flash Builder 4,某些项目能够在FB4和Flash Professional CS5之间往返,尽管我不确定标准是什么(我目前的AIR项目所有项目修改菜单选项都是灰色的)。如果您确实设法将您的项目放入Flash,您可以在项目的发布设置(文件->发布设置->Flash选项卡->CS5中的硬件加速选项)中启用硬件加速。
这种方法几乎可以解决你的问题,尽管它有两个问题,其中一个已经在上面强调了,以及(对于在Web上发布的人来说)通过在网页上使用直接或GPU渲染,你无法在Flash上分层任何DOM元素。
直接*:此模式尝试使用最快的路径进入屏幕,如果您愿意,也可以使用直接路径。在大多数情况下,它会忽略浏览器想要做的任何事情,比如重叠的HTML菜单或类似的工作。此模式的典型用例是视频回放。在Windows上使用DirectDraw或在Vista上使用Direct3D,在OSX和Linux上使用OpenGL。当您使用此模式时,保真度不应受到影响。
GPU*:这是完全成熟的合成(+一些额外的)使用图形卡的一些功能。想想看,就像OSX和Vista为他们的桌面管理器所做的那样,Windows(以Flash语言表示电影剪辑)的内容仍然是使用软件呈现的,但结果是使用硬件合成的。如果可能,我们还会在卡中以本机方式扩展视频。在接下来的几个Flash播放器版本中,我们的软件光栅化器可能会有越来越多的部分转移到GPU上,这只是一个开始。在Windows上,此模式使用Direct3D,在OSX和Linux上,我们使用OpenGL。
*Source
降低帧速率
Flash播放器将继续以其固有的刷新率播放视频,独立于您项目的其余部分,只要您将帧速率保持在大约2FPS或更高(尽管我建议最低为5FPS)。在本例中,您不会想要运行那么低的帧速率,但您可以降低整个场景的帧速率,而不会影响视频性能。你的帧速率越接近屏幕刷新率,你就越容易产生撕裂效果,除非你能够与显示器的刷新率绝对同步,否则你可能无法做到这一点。硬件加速。
只要Flash Player能够水平移动对象,这个问题就一直存在。发生的情况是,Flash在屏幕刷新的同时更新正在运行的动画的缓冲快照。如果缓冲的快照在屏幕刷新过程中发生更改,则会出现撕裂。这就是为什么降低帧速率实际上减少了撕裂量,您刷新缓冲区的频率更低。
rekjcdws2#
正如@Tegeril提到的,使用Flex是原因之一。Flex是一个相当笨重的框架,它在幕后做了很多事情。如果您熟悉组件的生命周期(特别是使属性无效、使显示列表无效等)。
以下是一些可能会提高性能的小事情:
好的,这是Flex的东西。
阅读sencular's article on Asynchronous ActionScript Execution可能会非常方便,它解释了Flash Player如何处理更新和渲染。
(来源:senocular.com)
帧既执行ActionScrip又渲染屏幕
(来源:senocular.com)
ActionScript需要很长时间才能完成延迟渲染
我想这种混蛋和这件事有关。此外,我猜你可能会有一些平稳的移动,然后突然停止,每隔一段时间,当Flash播放器喘口气(垃圾收集器清理)
Victor Drâmbă article on “Multithreading” in Actionscript也可能有用。
Soo,简单地说:
如果瓶颈来自Flex框架,最坏的情况是,您可以尝试最小化遍历显示列表的组件的数量,并使用纯ActionScript来做其他事情(正如@Patricks建议的那样,使用TweenLite等)。
如果有帮助,试着在开始时预加载数据(获取RSS提要之类的内容),当你获得了大多数不需要频繁刷新/加载的重要数据时,显示该应用程序。您将使用更多的内存,但将有更多的CPU周期用于其他任务。此外,如果显示对象是“瓶颈”,并且数量很多,请检查是否可以使用对象池重用它们。
HTH
nkcskrwz3#
TweenMax甚至TweenLite(http://www.greensock.com)很好地处理了这类工作。当文本滚动时,你的应用程序还在做什么?有没有可能是其他进程在干扰?
wsewodh24#
这可能没有帮助,但您是否考虑过将爬行文本放入html DOM中,并使用CSS转换来爬行文本。显然有IE的问题,但IE9应该支持它,你可以使用Java脚本作为后备。
这看起来可能有点傻,但css过渡正在获得硬件加速和插件的独立进程,这意味着在多核机器上,你可以获得并行线程。
nhaq1z215#
你可以考虑的一件事是使用计时器而不是缓动功能来增量地移动标签。这样,您就可以利用updateAfterEvent方法来获得更流畅的呈现。以下是来自Chet Haase(Adobe的Flex图形Maven)的一篇文章/视频的链接,它解释了用法,并提供了一个带有代码的示例应用程序:
http://graphics-geek.blogspot.com/2010/04/video-event-performance-in-flex.html
希望这能帮上忙。