【发布时间】:2014-11-30 06:51:18
【问题描述】:
我有一个包含很多可拖动节点的应用程序,这可能会有点慢。特别是在:
- 拖动包含其他节点的节点或
- 在另一个 IF 中拖动节点会导致父级边界扩大 [几乎就像它正在缓存一些与范围相关的数据,对于内部的双精度值很常见,并且如果范围发生变化则需要进行额外处理](编辑:这有现在被解释为父级的布局通道)
问:对整数执行一些操作(我可以控制的少数类型)(首先转换为整数)然后重新分配给双精度数有什么好处吗? (编辑:现在已经回答了)
Q1:我还能如何加快速度?
==========更新: 感谢到目前为止的建议,我确定我的主要问题是在区域根内平移区域容器,因为它触发容器区域中的布局传递,这反过来(我认为)乒乓球在所有(大约 40) 个子节点(它们本身就很复杂 - 它们包含文本字段、按钮等)。
到目前为止,我发现最快的解决方案是在一个组中平移一个组(已经快了很多),其中组被额外修改(子类,覆盖计算...方法)以确保父/根不需要在拖动过程中调整大小(遗憾的是,不那么明显)。
class FastGroup extends Group {
//'stop asking about size' functionality
double widthCache;
double heightCache;
protected double computePrefWidth(double height) {
return widthCache != 0 ? widthCache : super.computePrefWidth(height);
}
protected double computePrefHeight(double width) {
return heightCache != 0 ? heightCache : super.computePrefHeight(width);
}
public void initDragging(){
//if a child of this Group goes into drag
//add max margins to Group's size
double newW = getBoundsInLocal().getWidth() + TestFXApp03.scene.getWidth()*2;
double newH = getBoundsInLocal().getHeight() + TestFXApp03.scene.getHeight()*2;
//cache size
widthCache = newW;
heightCache = newH;
}
public void endDragging(){
widthCache = 0;
heightCache = 0;
}
}
然而,集团会制造自己的问题。
Q3:为什么我不能使用 Pane 实现相同的效果(尝试将其作为第三个选项)?根据文档,窗格:
'除了将可调整大小的子项调整为其大小之外,不执行布局 首选尺寸'
...当一个组:
'将“自动调整”其托管的可调整大小的子项到他们的首选 布局过程中的尺寸'
'不能直接调整大小'
...这对我来说听起来完全一样,但是用作根的窗格导致包含的组的平移非常缓慢。
【问题讨论】:
-
首先,如果可能,我会尽量避免父容器的布局重新计算,这在拖动过程中代价高昂...如果拖动节点的数量太多而无法流畅和高效,您可能会转换将所有节点拖到 snapshop 图像中,拖动该图像,然后将真实节点移动到最后...
-
整数算术或浮点数在现代处理器中并不明显快于双倍... CPU 用于其他地方...
-
@Jens-PeterHaack 有没有一种简单的方法可以将节点布局为图像时进行转换?
-
SnapshotParameters params = new SnapshotParameters(); WritableImage image = node.snapshot(params, null);