2011-04-06 2 views
1

레오파드 10.5.8, X 코드 3.1.1; runModalForWindow를 사용하여 실시간 복잡한 비트 맵 수정을 수행해야하는 고성능 마우스 추적 메커니즘을 구현합니다.mach_msg_trap, - (void) mouseDragged 및 타이머 성능

모달 루프가 실행되고 타이머가 작동하고 마우스 트랙이 발생하지만 성능은 최악이며 runloop이 길어질수록 악화되고 악화됩니다. 매 픽셀마다 마우스 메시지를 포착하는 대신 매 5 초마다 10 ... 20 초가 소요됩니다.

인스트루먼츠는 이처럼 커지는 응답 병목 현상이 진행되는 동안 대부분의 시간이 mach_msg_trap에서 소비되고 있음을 보여줍니다. (예, 실행중인 앱으로 설정 한 관점을 가지고 있습니다.) 그래서 내가 생각하는 인상은 "생각"입니다 버튼을 미친 사람처럼 쥐고 마우스를 드래그하고 있음에도 불구하고 할 일이 없습니다. 메모리 누수가 나타나지 않습니다. 8 기가비트 2.8GHz GHZ 머신에서는 CPU 활동이 거의 없습니다.

다시 말해서 앱이 내 코드에서 많은 시간을 소비하지 않으므로 내 성능 문제가 아닙니다. 아마 뭔가 잘못 구성했거나 전혀 구성하지 못했거나 단순히 전체적인 생각에 잘못 접근하고 있습니다. 그러나 여기에 대한 통찰력은 분명 감사 할 것입니다. 이제는 마우스 메시지와 타이머 메시지를 발송하는 것이 절대적으로 용납되지 않습니다. 당신은 내가 얻는 반응 시간으로 차가운 당밀에 잠긴 사람을 위해 크레용 드로잉 프로그램을 구현할 수 없었습니다.

편집 : 몇 가지 추가 정보 : 내 10.5.8 맥북 프로에서 발생하지 않습니다. 8 코어, 6 디스플레이 Mac Pro입니다. drawrect에서 croprect에 대한 표시 코드를 가져 오려고했는데, NSLog()로 대체했습니다 ... 여전히 마우스 업데이트를 내 보냅니다. 또한 실행중인 앱을 보완하지 않고 재부팅하고 실행 해 보았습니다. 그리고 미러 된 디스플레이. 차이 없음.

화면에서 브러시를 드래그하는 것을 상상해보십시오. 처음에는 페인트가 부드럽게 처리 된 후 브러시 배치 사이에 틈이 나타나면 커지며 10 초마다 한 번만 브러시를 배치 할 때까지 계속됩니다. 그게 어떻게 작동하는지. NSlog() 및 다양한 다른 추적 메서드를 사용하여 mouseDragged 이벤트가 세류로 느려지므로 발생하는 최고 수준 이상이라고 판단했습니다. 간단히 말해서 왜 그럴까요?

누구나?

답변

0

정상적으로 격리되었습니다. 문제는 저의 와콤 타블렛 마우스 때문입니다. 일반 광학 마우스를 연결하면 모든 것이 잘 돌아갑니다. 내 맥북 프로와 트랙 패드를 사용하는 것과 동일합니다. 잘 작동합니다.

태블릿은 2011 년 1 월 현재 재고 드라이버가있는 와콤 인튜어스 4입니다. 나는 와콤 사이트로 가서 다음을보고합니다.

얼마나 악몽이었습니다. 나는 이것에 대해 100 시간 이상을 보냈는데, 애플 핸들링, 드로잉 등에서 약간의 미묘함을 가미시켰다. Sheesh.