FrameBox 像素圖持久性我建議 JMP 以與其他 GUI 框架相同的方式處理顯示元素 - 不要重繪任何元素,除非內容已更改或呼叫特定的重繪(或無效)方法。
具體來說,是否有一種方法可以在視窗滾動時阻止框架框重新繪製內容(這包括重新繪製所有資料點並重新運行任何附加腳本)?認真地說,繪製一次並保持位圖(或像素圖)持久,除非框已更改(大小更改/ 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 來加快繪製速度。