【问题标题】:Javafx 2d text rendering speed upJavafx 2d 文本渲染加速
【发布时间】:2009-08-02 20:23:15
【问题描述】:

JavaFX 通过在屏幕上显示简单的浮动文本确实消耗了我的 CPU,这让我有点惊讶。

我的问题是否有任何选项调整来为文本等节点打开硬件加速?在渲染 2D 图元时使用 GPU 而不是 CPU?

这是一个简单的例子,它在我的 2.53Mhz core 2 duo + Nvidia 9600M GT 上消耗高达 40% 的 cpu。操作系统:Mac OS X。JavaFX 1.2; JRE 1.5

编辑:我在示例中放置动画只是为了模拟文本滚动。您可以尝试通过不停地滚动 ListBox 或某些图片来达到相同的 CPU 消耗。

package text2dacceleration;

import javafx.stage.Stage;

import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.transform.Transform;
import javafx.scene.text.Text;
import javafx.animation.*;

def longLine = for (i in [1..45]) "{i}";
def textNodes = for (i in [1..64]) Text{content: "{longLine} line number {i}"};
var yoffset = 0.0;

Timeline {
   repeatCount: Timeline.INDEFINITE
   autoReverse: true
   keyFrames: [
      KeyFrame { time: 0s values: [yoffset => 0.0]}
      KeyFrame { time: 1s values: [yoffset => 10.0]}]
}.play();

Stage {
    title: "Text nodes"
    width: 800
    height: 600
    resizable: false
    scene: Scene {
       content: [
         VBox {
            content: textNodes
            transforms: bind Transform.translate(0, yoffset);
         }]}}

【问题讨论】:

    标签: 2d javafx acceleration


    【解决方案1】:

    你玩过 Timeline 的帧率变量吗?降低这可能会有所帮助。

    (帧率描述:此动画将运行的最大帧率,以每秒帧数为单位。)

    可能不会有影响,但 KeyFrame 有一个“canSkip”选项。

    【讨论】:

    • 帧率不错。一切都像它应该的那样顺利。但为什么要消耗 CPU 而不是 GPU?
    • (WinXP 运行,Java FX 1.2,Java 1.6)如果鼠标在窗口上移动,帧率,即使是 10,似乎也没什么区别。高cpu。如果鼠标不在窗口中,cpu 会运行得更少,并且随着帧速率的降低而降低。这向我表明,问题实际上不在于帧的渲染。
    • 将所有文本放入单个文本节点并显示当鼠标移到窗口上时仍然存在相同的 CPU 问题(尽管图像,在我的系统上肯定更流畅,即使在帧速率为 10 .)。 blocksmouse: true 没有区别。
    • 用标签替换文本会稍微减少 CPU。可能是因为标签使用的默认字体或字体设置。在 Windows XP 上,在文本节点上快速移动鼠标会消耗高达 100% 的 CPU(一个内核)。
    【解决方案2】:

    从 1.5 到 6,Sun 在这方面做了很多工作,但我不知道其中有多少过滤到 Apple 的 JRE 实现中。为了比较,您是否可以更新到较新的 JRE,例如 1.6?如果您无法运行最新版本的 OSX,因此无法在新兵训练营中使用 Windows 机器,或者任何可能值得尝试使用后来的 Sun 参考机器以了解您的情况。

    在 JavaFX 论坛上发帖可能也值得 - http://forums.sun.com/forum.jspa?forumID=932

    Sun 通常很擅长回应这些问题。

    【讨论】:

    • 我在具有相似硬件特性的 WinXp 上运行了这个示例,将鼠标放在文本上时得到了几乎相同的结果。
    【解决方案3】:

    VBox { 缓存:真 内容:文本节点 变换:绑定 Transform.translate(0, yoffset); ...

    --

    cache:系统的性能提示,表明该节点应该被缓存为位图。

    【讨论】:

    • 好一个!但是正如我提到的示例只是为了模拟文本滚动,因此文本元素将在文本滚动时一直更改。
    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2012-01-21
    • 2014-01-17
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    相关资源
    最近更新 更多