2012-06-01 4 views
8

on_motionEVT_MOTION으로 처리하도록 설정했습니다. 마우스 위치를 대화 형으로 지정하려면 좌표 지정 이미지를 생성하지만 WxPython은 연속 동작 이벤트를 등록 할 때 ~ 400ms 지연이 있습니다. 인터페이스가 느려집니다.왜 WxPythons 모션 감지가 느린가?

EVT_MOTION이 느리며 어떻게 수정합니까? 나는 우분투 11.10과 WinXP에서 그것을 시도했는데 지연은 비슷합니까?

그림과 같은 이미지에서 부분을 선택하려면 빠른 응답 시간이 필요합니다. 그것이 그대로, "십자형"은 마우스를 너무 천천히 따라갑니다.

다음 enter image description here

내가 EVT_MOTION을 시도하는 코드입니다 :

def on_motion(self, event): 
    """mouse in motion""" 
    #pt = event.GetPosition() 
    self.mouseover_location = event.GetPosition() 
    self.t2 = time.time() 
    print "delay",self.t2 - self.t1 
    self.t1 = self.t2 

delay 0.379776954651 
delay 0.00115919113159 
delay 0.421130895615 
delay 0.416938066483 
delay 0.376848936081 
delay 0.387464046478 
delay 0.40311384201 
delay 0.392899036407 
delay 0.385301113129 
delay 0.422554969788 
delay 0.355197906494 
+1

중간에 처리되는 다른 이벤트 일 수 있습니까? 어쩌면 비싼 드로잉이 아마도 – GP89

+1

일 것입니다. 나는 wxPython Google 그룹에 크로스 게시 할 것입니다. 그리고 작은 실행 가능한 예제도 게시하십시오. –

+2

마우스 추적에만 사용되는 스레드를 만드는 것이 고려 되었습니까?"마우스가 어디 있습니까? trigger update. repeat"의 cosntant 루프입니다. 문제가 EVT_MOTION 인 경우 문제가 해결됩니다. 문제가 속도를 끌어 내리는 경우에는 그 속도를 볼 수 있어야합니다. – acattle

답변

3

문제를 설명하는 샘플 앱이 없으므로 그 질문은 불완전합니다. 그러나, 나는 모션 핸들러가 당신의 문제와 아무 관련이 없다고 말할 것이다. 왜냐하면 후속 모션 핸들러들 사이에서 비싼 작업을하고 있기 때문이다 (전체 드로잉 캔버스를 새로 고침하는 것과 같다). 이 경우는 (당신의 페인트 루틴이 마우스 모션 이벤트 사이에 호출되는 경우와 쉽게 확인할 수), 내가 제안하는 경우

다음

  1. 자신을 물건 도면, 당신이 있는지 확인하는 경우 이중 버퍼링 사용 (wx.BufferedPaintDC 경유);
  2. 페인트 루틴이 실제로 마우스 동작 사이에서 호출되는 경우, (RefreshRect를 통해) 플롯의 손상된 부분 만 새로 고침 해보십시오.
  3. wx.Overlay를 사용하여 직사각형 선택 물을 그립니다 (방법에 대한 데모가 몇 가지 있습니다).
  4. 문제를 설명하는 작고 실행 가능한 샘플 앱을 게시하십시오.
+0

예, 값 비싼 드로잉 작업으로 0.35 초가 필요했습니다. 나는 그것을 0.1과 그것의 매끄러운 것으로 내려 놓았다. 필자는 이벤트 감지가 그림과 관련하여 비동기 적으로 작동한다고 생각했습니다 (진정한 멀티 스레딩과 같이 작동합니다). 새로운 이미지를 얻을 때마다'새로 고침 '을 호출합니다. – aitchnyu

2

EVT_MOTION 마우스가 이동 될 때마다 해고! 모든 동작에서 event.GetPosition()으로 전화를 걸어 데이터를 처리하면 성능이 저하됩니다. EVT_LEFT_DOWN 또는 이와 유사한 것을 어떻게 사용하고 위치를 얻고 해당 데이터를 처리해야합니다. 이미지의 특정 영역 만 찾고 있기 때문에 훨씬 더 효율적입니다.

+0

_ "모든 동작에 대해 event.GetPosition()을 호출하고 데이터를 처리하면"_ 이것에 대해 자세히 설명하십시오. 나는 십자선을 정확히 찾아내는 가이드가 필요하다. 사용자가 원하는 포인트 근처에 포인터를 올리면된다. – aitchnyu

+1

그런 경우 "드로잉 코드"를 더 빨리 만들어야합니다. 주석을 달고 속도가 향상되는지보십시오. 단일 스레드에서 더 빨리 수행 할 수 없으면 다른 스레드를 추가하십시오. –

2

많은 사람들이 문제를 보여주는 작은 샘플을 만드는 과정에서 문제를 스스로 해결할 수 있지만 실제로 응용 프로그램에서 어떤 의미있는 응답을 얻을 수 있는지 알아야합니다. 다른 사람들과 공유 할 수 있습니다. 당신이 십자선을 그리는 및/또는 방법은 윈도우의 주요 내용을 상쾌하게하는 방법을 최적화

http://wiki.wxpython.org/MakingSampleApps

는 아마 당신의 최선의 방법이다, 그러나 당신이 더 많은 정보를 공유 할 때까지 우리가 할 수있는 모든 추측이다.

관련 문제