在滚动时以及需要重新渲染场景时,我的JavaFX应用程序都出现了一些延迟。在JavaFX中启用脉冲记录器,我可以看到每个脉冲都重新渲染了许多节点(如下例所示)。
PULSE: 3310 [16ms:26ms]
T1 (0 +0ms): CSS Pass
T1 (0 +0ms): Layout Pass
T1 (0 +0ms): Update bounds
T1 (0 +13ms): Waiting for previous rendering
T1 (13 +0ms): Copy state to render graph
T7 (14 +0ms): Dirty Opts Computed
T7 : 1 different dirty regions to render
T7 : Dirty Region 0: RectBounds { minX:366.0, minY:143.0, maxX:374.0, maxY:539.0} (w:8.0, h:396.0)
T7 : Render Root Path 0: [com.sun.javafx.sg.prism.NGRegion@bd6cd80, com.sun.javafx.sg.prism.NGRegion@b6f5240, com.sun.javafx.sg.prism.NGRegion@1347d5a0, com.sun.javafx.sg.prism.NGRegion@b982360, com.sun.javafx.sg.prism.NGRegion@b9826c0]
T7 (14 +0ms): Render Roots Discovered
T7 (14 +1ms): Painting
T7 (16 +10ms): Presenting
Counters:
CacheFilter rebuilding: 1
Nodes cached: 8
Nodes rendered: 19
Nodes visited during render: 25
是否有一种简单的方法来找到重新渲染的那19个节点,以便我可以对其进行缓存以提高性能?
答案 0 :(得分:0)
不,没有简单的方法。整个脉冲信息消息是内部API。如果需要渲染节点,则从NGNode
(公众Node
的对等方)以其doRender
方法对“已渲染的节点”计数器进行递增。 PulseLogger
和PrintLogger
类处理信息的记录和打印。
您将不得不修改这些类,以使NGNode
不仅增加计数器,还发送其自己的信息(例如id或name);或以某种方式拦截方法调用。
submit a request的替代方法是,它可能会在将来的版本中提供。