我正在开发一个独立的Flash应用程序(使用Flex 3/ActionScript 3编写),它具有文本爬行功能,就像您在观看有线新闻频道时可能在电视底部看到的那样; 它是一个长而窄的盒子,文本从右到左移动.
我已经通过创建Label元素,用文本填充它,然后使用带有Linear.easeNone缓动函数的mx:Move对象移动它来实现它.它有效,但它有很大的改进空间.它看起来有点生涩,往往会有相当多的"撕裂"(文本的上半部分和下半部分有时会失去同步).
我尝试在问题上投掷数学,以使爬行的移动速率与显示器的刷新率同步,但这是一个半身像.我发现应用程序的帧速率跳得太厉害了."优化"爬行在看起来如丝般光滑和癫痫之间变化.
还有什么人会推荐我试着让这个东西顺利出来吗?你尝试过一些替代设计吗?
这个问题有两个可能的解决方案,但两者都有警告,第一个是因为你使用Flex和独立投影仪,第二个是因为它是一个缓解器,而不是一个完整的解决方案.
硬件加速
发布文件时,您可以尝试让Flash利用硬件加速来缓解您遇到的导致撕裂的垂直刷新问题.遗憾的是,Flex Builder 3无法在SWF(投影仪)级别启用此设置(链接到错误).这还有待解决,并已从4.0推送到4.1到4.x ......如果解析它,它可能是Flash Builder 4项目设置中的编译器参数.
您可以通过将投影仪作为标准SWF输出并将其嵌入到HTML文档中并将wmode设置为"direct"或"gpu"来确定此解决方案是否适合您.可悲的是,如果它(它应该),你现在无论如何都不能使用它.如果你有Flash Builder 4,某些项目能够在FB4和Flash Professional CS5之间进行往返,虽然我不确定它的标准是什么(我当前的AIR项目所有项目修改菜单选项都显示为灰色).如果您确实设法将项目放入Flash,则可以在项目的"发布设置"中启用硬件加速(文件 - >发布设置 - > Flash选项卡 - > CS5中的硬件加速选项).
这个方法几乎是你问题的一个解决方案,虽然它有两个问题,一个已在上面突出显示,和(对于发布到网络的人),通过在网页上使用直接或GPU渲染,你无法分层任何DOM元素在闪光灯之上.
direct:此模式尝试使用最快的路径来屏幕,或者直接路径.在大多数情况下,它会忽略浏览器想要做的事情,例如重叠HTML菜单或此类工作.此模式的典型用例是视频播放.在Windows上,此模式在Vista上使用DirectDraw或Direct3D,在OSX和Linux上使用OpenGL.使用此模式时,保真度不应受到影响.
gpu:这是使用显卡的某些功能完全成熟的合成(+一些附加功能).可以想象它与OSX和Vista为其桌面管理器所做的类似,Windows的内容(用flash语言表示影片剪辑)仍然使用软件进行渲染,但结果是使用硬件进行合成.如果可能,我们还会在卡片中本地缩放视频.我们的软件光栅化器的越来越多的部分可能会在接下来的几个Flash Player版本中转移到GPU,这只是一个开始.在Windows上,此模式使用Direct3D,在OSX和Linux上我们使用OpenGL.
**来源*
Direct是这种情况的理想选择,因为你实际上可以通过"gpu"降低性能,以及从显卡到显卡的视觉差异.
降低帧速率
只要您将帧速率保持在大约2FPS或以上(尽管我建议最低5FPS),Flash播放器将继续以原始刷新率播放视频,而与项目的其余部分无关.您不希望在此示例中运行该低电平,但您可以降低整个场景的帧速率而不会影响视频性能.您的帧速率越接近屏幕刷新率,您实际创建撕裂效果就越容易,除非您能够完全同步显示器的刷新率,如果没有上述内容,您可能无法做到这一点...... 硬件加速.
只要能够水平移动对象,Flash Player中就存在此问题.会发生什么是Flash在屏幕刷新的同时更新正在运行的动画的缓冲快照.如果缓存的快照在屏幕刷新过程中发生变化,那么您将获得一次破解.这就是降低帧率实际上减少了撕裂量的原因,你不经常刷新缓冲区.