FrameBox 像素图持久性我建议 JMP 以与其他 GUI 框架相同的方式处理显示元素——除非内容发生变化或调用了特定的重绘(或 inval)方法,否则不要重绘任何元素。
具体来说,有没有办法防止框架框在窗口滚动时重新绘制内容(这包括重新绘制所有数据点并重新运行任何附加的脚本)?认真地说,绘制一次并保持位图(或像素图)持久,除非框已更改(大小更改/ dt RowState 更改/ inval 方法)
当滚动浏览包含数千个点或复杂附加脚本的图表时,这会极大地降低工作效率。当前的“不顾一切地抓住一切可能的机会重新绘制”方法非常令人困惑。
这是一个例子——附加的脚本只是打印到日志中,但滚动图表显示它每次滚动框更新时都在不断运行(不要传播<
New Window( "Test",
vlb = V List Box()
);
::global function = Function( {},
Print( 1 );
);
For( i = 1, i <= 20, i++,
vlb << Append(
Graph Box(
Frame Size( 200, 200 ),
X Scale( -100, 100 ),
Y Scale( -100, 100 ),
::global function
)
)
)自动化和脚本内容组织数据混合和清理回复:FrameBox 像素图持久性感谢您的回复!(抱歉在这里冗长的回应)
在我的小组中,我们正在研究晶圆上的缺陷——我们通常会在包含 25 个晶圆的短途旅行中扫描整个 FOUP。因为这些是偏移,所以每个晶圆通常有数万或数十万个缺陷。我们工作流程的一部分是检查这些晶圆。
我创建了一个脚本,它只对绘图进行了一些自定义——即,我使用 Path() 命令(使用 SVG 字符串)在缺陷点下方绘制骰子,然后绘制未分类的缺陷,然后添加最后一个带有分类缺陷的标记段(以确保分类缺陷不会被未分类缺陷遮盖)。
25 个晶圆的初始渲染可能需要几秒钟,而且我们通常可以一次看到它们(每个晶圆图的屏幕尺寸相对较小),但如果用户想要更大的晶圆图,他们将不得不滚动列表。滚动晶圆图应该非常流畅,因为没有任何变化,但当然每个帧更新需要几秒钟。
我的解决方案是在绘制晶圆图后创建一张图片并只显示图片,但这会导致大量开销以确保在表格状态发生变化或其他任何情况时重新绘制图片。此外,与不使用此方法相比,此方法的初始渲染时间大约长 3 倍。
我在以前的工作中创建了 GUI api,默认情况下始终是惰性评估——诚然,我从来没有使用过任何大于标准 JPEG(每边 2^16 像素)的图像格式,但它通常会处理这些最大尺寸JPEG 没有问题,只使用几 MB 的内存。
我认为理想的是能够为 FrameBox 提供某种消息以确保对显示引擎的位图进行惰性评估,然后将留下由于巨大的位图(或像素图)而可能存在的任何 RAM 问题由用户自行决定。
这是我正在处理的问题的一个很好的例子:(请注意,由于我们的点数很高,我在我的晶圆图代码中使用了这个 <痛苦地缓慢,而且只有一个 GraphBox。想象一下,其中有 10 到 20 个正在展示!
我正在使用一个相当不错的台式机,它有 64G 内存和一个不错的 4 核 CPU。这是带有硬件渲染的 JMP16(JMP14 也有同样的问题),我使用的是 4k 显示器,但是使用标准高清显示器的用户也有同样的问题。
Names Default to Here( 1 );
table = New Table( "test table",
Add Rows( 150000 ),
<<NEW column=""></NEW>
总结一下:
- 你能提供一种延迟评估显示管理器位图的方法吗?您已经知道 RowState 何时更改并且您已经提供了一个 <
- 你能提供一种方法来禁用任何对悬停文本的尝试吗?这会占用很多周期,并且在这种情况下也完全没有帮助(甚至有点有害,因为它会在点上方绘制一个框)
而且,因为很长一段时间以来,我一直对这些其他小问题感到沮丧,所以让我提出一些其他要求(当然,我绝不希望你们解决这些问题,如果你做到了 
- 在 JMP12 中,对象的顺序在 FrameBox -> Customize... (右键单击菜单)。具体来说,当选择行时,那些选择的点可以被列表中列在它们之后的任何添加的图形脚本覆盖。从 JMP14 开始(我从未使用过 JMP13,所以我不能代表它),选定的点绘制在其他所有东西之上。这在处理数千个点并且无法显示趋势线或点上方的任何其他对象(如果它们被选中)时会出现问题。
- 当用户在图例中选择一个类别并且点被选中时,这真的开始发挥作用——突然间用户看不到线条!!
- 请参阅下面的一些代码来显示这一点
- 此外,当在 GraphBox 上绘制网格时(我这样做是为了在晶圆图中显示芯片),网格不会消除锯齿。将图像复制到剪贴板时,图像同样没有消除锯齿。JMP12 会做抗锯齿和图像看起来很多更好的!
- 见下文 JMP12 和 JMP14/16 抗锯齿的比较
选定点高于所有其他可能元素的示例问题:
Names Default to Here( 1 );
table = New Table( "test table",
Add Rows( 150000 ),
<<NEW column=""></NEW>
问题图片:

线应该画在数据点的顶部。

JMP12 将以正确的顺序绘制:

抗锯齿示例:(请注意,这些是证明我的观点的假晶圆图)
JMP14/16:打印屏幕:

JMP14/16 复制图片:

JMP12 打印屏幕:

JMP12 复制图片:

谢谢!!
回复:FrameBox 像素图持久性你好@ErraticAttack -
感谢您的建议 - 性能对 JMP 来说绝对重要。有些报表的高度可能超过 10 万像素,因此 JMP 仅绘制滚动区域中当前可见的内容。在 Windows 上,滚动针对小滚动值进行了优化,以便在可能的情况下复制像素并仅重绘“新”的内容。
你能告诉我们更多关于你的用例的信息吗?尤其:
- Mac 或 Windows
- 您的窗口主要由平台或自定义图形组成吗?
- 您的图形脚本是在进行大量绘图,还是用于其他任务?
如果您使用 JSL 绘制大量几何图形,则可以使用显示段(标记段、线段)而不是 JSL 来加快绘制速度。