代码之家  ›  专栏  ›  技术社区  ›  BlairHippo

如何使用Flex获得平滑的文本爬网?

  •  7
  • BlairHippo  · 技术社区  · 15 年前

    我试着用数学来解决这个问题,使爬行的移动速度与显示器的刷新速度同步,但结果是失败了。我发现应用程序的帧速率跳得太快了;这种“优化”的爬行方式有两种,一种是看起来像丝般光滑,另一种是看起来像患了癫痫。

    有没有其他人会建议我试着解决这个问题?你有没有别的设计建议我试试?


    编辑: 一些背景:爬行是数字看板应用程序的一部分(从一个独立的闪光投影仪播放——没有网络浏览器),它在屏幕上的其他地方做一些事情,包括视频播放和渲染文本和图像。它肯定会在视频播放过程中变得更加起伏,但它从来没有像我希望的那样平滑。
    5 回复  |  直到 15 年前
        1
  •  6
  •   Aaron    15 年前

    对于这个问题有两种可能的解决方案,但都有警告,第一种是因为您使用Flex和一个独立的投影仪,第二种是因为它是一种缓解方法,而不是一个完整的解决方案。


    在发布文件时,您可以尝试让Flash利用硬件加速来缓解您遇到的导致撕裂的垂直刷新问题。遗憾的是,FlexBuilder3无法在SWF(投影仪)级别启用此设置( Link to bug ). 这个问题还没有解决,已经从4.0升级到4.1,再升级到4.x。。。如果它被解决了,它很可能是flashbuilder4的项目设置中的一个编译器参数。

    您可以通过将投影仪输出为标准SWF并将其嵌入到wmode设置为“direct”或“gpu”的HTML文档中来确定此解决方案是否适合您。可悲的是,如果它是(它应该),你不能使用它现在无论如何。如果你有flashbuilder4,某些项目可以在FB4和flashprofessionalcs5之间往返,尽管我不确定这是什么标准(我当前的AIR项目的所有项目修改菜单选项都是灰色的)。如果您设法将项目放入Flash中,则可以在项目的发布设置中启用硬件加速(文件->发布设置->闪存选项卡->硬件加速选项(CS5)。

    直接的 :此模式尝试使用屏幕的最快路径,或直接路径(如果需要)。在大多数情况下,它会忽略浏览器想要做的任何事情,比如重叠的HTML菜单或类似的工作。这种模式的典型用例是视频播放。在Windows上,此模式在Vista上使用DirectDraw或Direct3D;在OSX和Linux上,我们使用OpenGL。使用此模式时,保真度不应受到影响。

    图形处理器

    ** Source *

    是这种情况下的理想选择,因为您实际上可以使用“gpu”降低性能,以及图形卡与图形卡之间的视觉差异。

    降低你的帧速率

    硬件加速 .


    只要Flash播放器能够水平移动对象,这个问题就一直存在。所发生的是Flash在刷新屏幕的同时更新正在运行的动画的缓冲快照。如果缓存的快照在屏幕刷新过程中发生了部分更改,则会出现撕裂。这就是为什么降低帧速率实际上减少了撕裂量,而刷新缓冲区的频率却降低了。

        2
  •  3
  •   Glorfindel Doug L.    6 年前

    正如@Tegeril提到的,使用Flex是原因之一。Flex是一个相当重的框架,它在幕后做了很多事情。如果您熟悉组件的生命周期(尤其是使属性无效、使显示列表无效等)。

    • 尽量保持一个简单的显示列表。如果您知道应用程序总是以一种大小显示,那么flex就不会浪费时间遍历显示列表/树,从上到下进行测量。另外,尝试使用画布。我知道,它不是很干净,但由于它使用绝对值,并且不太与“父级”检查,因此它应该比其他容器(如HBox、VBox等)更快
    • 尝试以全尺寸显示视频(确保编码的视频尺寸正确,以便调整视频大小时有任何CPU周期)

    好吧,这是弹性材料。

    读起来可能很方便 sencular's article on Asynchronous ActionScript Execution async frames
    (来源: senocular.com )

    框架执行ActionScript并呈现屏幕

    async frames streched
    senocular.com )

    ActionScript需要很长时间才能完成延迟渲染

    获得平稳运动的时刻,然后突然停止,时不时,当 Flash播放器呼吸(垃圾收集器清理)

    Victor Drâmbă article on “Multithreading” in Actionscript 要有用。

    苏,重述一下:

    • 使用Profiler之类的工具,看看Flex框架是否在拖你的后腿,或者瓶颈在哪里
    • 在这方面尽可能地改进,然后检查Flash Player是否处理所有actionscript(“弹性”帧)

    如果瓶颈来自Flex框架,最坏的情况是 在其他事情上使用纯动作脚本(如@PatrickS建议的,使用TweenLite等)

    如果有帮助的话,试着在一开始就预加载数据(获取rss提要等等),当你得到了大多数不需要频繁“刷新”或加载的重要信息时,就显示应用程序。你将使用更多的内存,但会有更多的cpu周期,以备其他任务。 另外,如果显示对象是“瓶颈”并且有很多,请检查是否可以使用对象池重用它们。

    HTH公司

        3
  •  0
  •   PatrickS    15 年前

    TweenMax甚至TweenLite( http://www.greensock.com )这类工作做得很好。当文本滚动时,你的应用程序还在做什么?有没有可能是其他过程在干扰?

        4
  •  0
  •   Russell Leggett    15 年前

    这可能没有什么帮助,但是您是否考虑过将爬网文本放入htmldom并使用CSS转换来爬网文本。显然存在IE问题,但是IE9应该支持它,并且可以使用javascript作为回退。

    这可能看起来很愚蠢,但是CSS转换正在得到硬件加速和插件的独立进程,这意味着在多核机器上可以得到并行线程。

    推荐文章