2014-10-17 47 views
0

有什么解决方法,如何绘制到JavaFX中的图像类似于Canvas?不像像素,但像GraphicsContext2D提供的高级绘图功能。我正在尝试创建多层次的Canvas,并且为每个新层使用另一个Canvas组件看起来似乎是一种矫枉过正。或者这是正确且唯一的优先方法?JavaFX绘制到图像

回答

0

使用多个canvas实例(每个图层一个),是推荐的创建多层画布的方法(使用immediate draw API)。这种生成分层帆布系统的方法已在Oracle JavaFX tutorials: Working with Canvas: Creating a Simple Layer System中进行了记录和演示。

您的其他选项,可能是没有用的帆布可言,而是使用JavaFX scene graphretained draw API),将场景图节点Panes(每层一个窗格)的内部分层,并把所有的层在StackPane里面的窗格。您可以随时通过调用StackPane上的节点snapshot API将生成的StackPane转换为图像。

Isn't Canvas是否还保留了API?由于所有的操作都只是放在GrowableDataBuffer上并在事件上呈现?

是的,调用画布API立即绘制是一个误称。它的确如你所说的那样工作。尽管如此,我认为从概念上将API视为即时绘图是非常有用的,因为这对于使用API​​的开发人员来说显得很相似,它更多地是使用保留的数据结构来协助初始渲染的实现细节。

就我所了解的实现设计而言,当您将绘图命令发布到画布时,通常会将这些命令放置在缓冲区中,并在画布的第一个渲染pulse发生时将缓冲区刷新为图像纹理。所以这些命令只会保留在内部实现中,直到第一次呈现事件。如果您在后续脉冲上进一步发出画布绘制命令,那么这些附加命令将被缓冲,然后在下一个脉冲的渲染阶段刷新。

例如,如果您在单个脉冲中为画布发出1百万个绘图命令,则会看到暂停,因为这些命令会被缓冲并呈现,但您不会看到屏幕逐渐更新一百万次,只是一个更新。如果您以10个100万条命令的脉冲发出1000万个绘图命令,则会看到屏幕更新10次。您必须向画布发出大量绘图命令才能看到此类行为。

如果您在做detailed performance analysis of a JavaFX application,理解实现以正确理解性能结果非常重要,否则它不是您需要担心的事情。我认为这个实现细节不太可能对你的项目有严重的性能影响。

+0

Isn't Canvas是否还保留了API?由于所有的操作都只是放在GrowableDataBuffer上并在事件上呈现? – 2014-10-18 23:43:21