나는 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
)
)
)응답해 주셔서 감사합니다!(여기서 긴 답변에 대해 죄송합니다)
우리 그룹에서 우리는 웨이퍼의 결함을 살펴보고 있습니다. 우리는 종종 25개의 웨이퍼로 구성된 편위 중에 전체 FOUP를 스캔합니다.이는 일탈이기 때문에 종종 웨이퍼당 수만 또는 수십만 개의 결함이 있습니다.워크플로의 일부는 이러한 웨이퍼를 확인하는 것입니다.
플롯에 약간의 사용자 지정만 수행하는 스크립트를 만들었습니다. 즉, Path() 명령(SVG 문자열 사용)을 사용하여 결함 지점 아래에 다이를 그린 다음 분류되지 않은 결함을 그린 다음 추가합니다. 마지막으로 분류된 결함이 있는 마커 세그먼트(분류되지 않은 결함이 분류된 결함을 가리지 않도록 하기 위해).
25개 웨이퍼의 초기 렌더링에는 몇 초가 걸릴 수 있으며 한 번에 모두 볼 수 있는 경우가 많습니다(웨이퍼맵당 상대적으로 작은 화면 크기). 그러나 사용자가 더 큰 웨이퍼맵을 원하는 경우 목록을 스크롤해야 합니다.웨이퍼 맵을 스크롤하는 것은 아무 것도 변경되지 않기 때문에 버터처럼 부드러워야 하지만 물론 각 프레임 업데이트에는 몇 초가 걸립니다.
내 솔루션은 웨이퍼 맵을 그린 후 그림을 만들고 그림만 표시하는 것이었지만 테이블 상태가 변경되거나 다른 경우 그림을 다시 그리는 데 많은 오버헤드가 발생합니다.또한 이 방법은 사용하지 않는 것보다 처음 렌더링하는 데 약 3배 더 오래 걸립니다.
이전 작업에서 GUI API를 만들었고 기본값은 항상 게으른 평가였습니다. 표준 JPEG(측면당 2^16픽셀)보다 큰 이미지 형식을 사용할 필요가 없었지만 일상적으로 이러한 최대 크기를 처리합니다. JPEG는 문제가 없으며 몇 MB의 램만 사용합니다.
내가 생각하기에 이상적이라고 생각하는 것은 디스플레이 엔진에 대한 비트맵의 게으른 평가를 보장하기 위해 일종의 메시지를 FrameBox에 제공할 수 있고 거대한 비트맵(또는 픽스맵)으로 인해 잠재적으로 존재할 수 있는 RAM 문제가 남을 수 있다는 것입니다. 사용자의 재량에.
다음은 내가 다루고 있는 문제의 좋은 예입니다. 없는 구조).이것은 단지 150,000개의 포인트가 있는 간단한 플롯이지만 스크롤링은 고통스럽게 느리게 , 단 하나의 GraphBox입니다.10 - 20개가 표시된 상태에서 이 작업을 수행한다고 상상해 보십시오!
저는 64G 램과 멋진 4코어 CPU를 갖춘 꽤 괜찮은 데스크탑을 사용하고 있습니다.이것은 하드웨어 렌더링이 있는 JMP16이고(JMP14에도 동일한 문제가 있음) 4k 모니터를 사용하고 있지만 표준 HD 모니터를 사용하는 사용자도 동일한 문제가 있습니다.
Names Default to Here( 1 );
table = New Table( "test table",
Add Rows( 150000 ),
<<NEW column=""></NEW>
요약:
- Display Manager 비트맵의 지연 평가 방법을 제공할 수 있습니까?RowState가 변경되는 시기를 이미 알고 있으며 원하는 경우 수동으로 다시 그릴 수 있는 <
- 호버 텍스트 시도를 비활성화하는 방법을 제공할 수 있습니까?이것은 많은 주기를 잡아먹고 이 상황에서도 전혀 도움이 되지 않습니다(또는 포인트 위에 상자를 그리므로 약간 해롭습니다).
그리고 저는 이 다른 사소한 문제로 오랫동안 좌절해 왔기 때문에 몇 가지 다른 요청을 하겠습니다. 당신은 
- JMP12에서 개체의 순서는 FrameBox -> 사용자 지정...에서 따랐습니다. (오른쪽 클릭 메뉴).특히, 행이 선택되어 있을 때 목록에서 그 뒤에 나열된 추가 그래픽 스크립트에 의해 선택된 지점이 그려질 수 있습니다.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 CopyPicture:

JMP12 프린트스크린:

JMP12 카피그림:

감사해요!!
안녕 @ErraticAttack -
제안해 주셔서 감사합니다. 성능은 JMP에서 확실히 중요합니다.일부 보고서는 높이가 100,000픽셀 이상일 수 있으므로 JMP는 현재 스크롤 영역에 표시되는 콘텐츠만 그립니다.Windows에서 스크롤은 작은 스크롤 값에 최적화되어 가능한 경우 픽셀을 복사하고 "새" 콘텐츠만 다시 그립니다.
사용 사례에 대해 조금 더 말씀해 주시겠습니까?특히:
- 맥 또는 윈도우
- 창은 대부분 플랫폼 또는 사용자 정의 그래프로 구성되어 있습니까?
- 그래픽 스크립트가 그림을 많이 그리나요, 아니면 다른 작업에 사용하나요?
JSL을 사용하여 많은 양의 지오메트리를 그리는 경우 JSL이 아닌 Display Segs(Marker Seg, Line Seg)를 사용하여 작업 속도를 높일 수 있습니다.