2010-02-22 5 views
3

내 응용 프로그램에는 메인 UI 스레드와 wm_WiiMoteChanged 이벤트 처리기 (백그라운드 스레드)가 시작한 다른 스레드가 있습니다. 메인 스레드에서 나는 비디오 처리를한다. 아래에 표시된 processFrame이라는 기능이 있습니다. 이 코드를 사용하여 각 프레임을 처리 할 시간을 측정하고 초당 프레임 수를 측정합니다.Timing a method and threads in .NET

wm.WiiMoteChanged ... 라인을 주석 처리하면 (아래 참조) 프레임 속도는 약 15-20fps이며 동영상을 보면 이것이 올바르게 보입니다 (작은 지연이 있음).

그러나 줄의 주석을 제거 할 때 (즉, 스레드 자체를 생성하는 이벤트 처리기를 추가하는 경우) fps는 40-50까지 올라갑니다. 그러나 이것은 틀린 것입니다. 사실 비디오는 실제로 더 지체가 있습니다.

누군가 이런 일이 발생하는 이유를 설명해 줄 수 있습니까? 감사.

private void Main_Load(object sender, EventArgs e) 
{ 
    try 
    { 
     wm.Connect(); 
     //wm.WiimoteChanged += wm_WiimoteChanged; 

     wm.SetReportType(InputReport.IRAccel, true); 
     wm.SetLEDs(false, false, false, true); 
    } 
    catch (Exception x) 
    { 
     MessageBox.Show("Exception: " + x.Message); 
     this.Close(); 
    } 
} 

더 코드 :

private void processFrame(object sender, EventArgs e) 
{ 
    DateTime curr = DateTime.Now; 
    performOperation(); 
    TimeSpan currTime = DateTime.Now - curr; 
    lblFPS.Text = (1000/currTime.Milliseconds).ToString() + " fps"; 
} 

편집

흥미로운 발견,이 라인은 wm_WiimoteChanged에 존재하는 경우에만, 이런 일이 아닙니다.

ibxOutput.Image = new Image<Bgr, Byte>(_irViewAreaBitmap);

(!) 참고 :이 라인이 너무 높은 지연의 원인 -이 빠른 실제로 설정하기 전에 완료 처리!

+0

* 'wm.WiiMoteChanged' ... *를 주석 처리하면됩니다.* * 주석을 달지 않고 주석 처리를하지 않기 때문에 * 같은 소리가나요? ??? – IAbstract

+0

'wm_WiimoteChanged' 메소드의 코드를 붙여 넣을 수 있습니까? – IAbstract

+0

@ dboarman : 하하, "댓글을 달아주세요"를 고쳤습니다. 감사합니다 – Aishwar

답변

2

이벤트 처리기를 추가하면 해당 이벤트에 응답하고 추가 코드를 실행하고 있기 때문입니다.

핸들러에 잠금이 포함되어 있습니까? 당신이 wm_WiimoteChanged()

UPDATE에 대한 코드를 게시 제안 : 당신이 System.Diagnostics.Stopwatch보다는 DateTime.Now DateTime.Now 충분히 정확하지 않은 것 같다 사용하는 것이 좋습니다.

+2

그는 프레임 당 더 오래 걸리더라도 그의보고 된 FPS가 올라가고있는 이유를 묻고 있습니다 ... –

+0

@Reed : Good Point! –

+0

팁 주셔서 감사. StopWatch를 사용하여 비슷한 결과를 얻습니다. FPS는 이벤트 처리기를 추가하면 더 높습니다 (특히 이미지 처리기의 이미지 속성을 이벤트 처리기 내에 설정). – Aishwar

0

좋아, 여기 두꺼운 데요.하지만 초당 프레임 수를 이해하지 못합니까?

FPS는 실제로 ProcessFrame이 초에 호출되는 횟수가 아니어야합니까? 측정하면 더 정확한 결과를 얻을 수 있습니다.

또한 시간을 측정하려면 StopWatch을 사용하는 것이 좋습니다. 이 목적으로 만들어졌습니다.

+0

@Neil : 내가 할 수있을 것 같아. 방금 1000ms를 1 초 단위로 처리하기 위해 밀리 초로 나눈 값을 1 초당 처리 할 수있는 프레임 수보다 훨씬 더 쉽게 찾을 수있었습니다. 그리고 StopWatch에 관해서는, 나는 그것을 시도, 나는 비슷한 결과를 얻을 :( – Aishwar

0

processFrame 메서드를 호출 할 때마다 정확히 하나의 프레임이 화면에 렌더링됩니까? 렌더링이 다른 곳에서 일어나고있는 것으로 의심되어 WiimoteChanged 처리기의 코드에 의해 차단되어 processFrame 메서드에서 처리 시간이 길어집니다.

정확한 FPS 측정을 위해서는 프레임 당 정확히 한 번 processFrame을 호출해야합니다. processFrame이 반환 될 때 다시 호출되지 않는 한 performOperation의 지속 시간을 측정하는 것보다 후속 호출 사이의 시간을 측정해야합니다.