2016년 5월 12일 목요일

CompositionTarget.Rendering 프레임이 바뀔떄마다 발생하는 이벤트

브라우저의 각각 프레임이 끝날 때마다 떨어지는 이벤트를 구현할 수 있는 방법이 소개되어서 올려봅니다.

(이게 WPF에는 있는 내용이라고 하더군요. Storyboard가 TimeLine 방식이었다면, 이건 Rendering 방식인가보네요..)

이 렌더링 이벤트 함수는 애니메이션이라던지, 레이아웃이 구성 트리(visual Tree)에 적용된 후에 호출이 되게 됩니다.

그리고 구성트리(visual Tree)가 강제로 업데이트될 때도 이 이벤트함수는 호출이 됩니다.

그래서, 임의로 렌더링 likely하게 구성하던 Dispatch Timer라던지, Storyboard Timer 대신에, 이 것을 사용하면. 모듈 메인루프

함수처럼 구현이 가능하다는 이야기입니다. (끝나지 않고 계속 실행되는..)

이 문법은 간단합니다.

CompositionTarget.Rendering += new EventHandler(MainGameLoop);

(주 : CompositionTarget 그대로 써주시면 됩니다.)

앞에서 작성해보았던 SnowFlake demo를 예로 들어보면, 메인루프를 Storyboard Timer를 사용했었습니다.


public partial class Page : UserControl
{
Storyboard _snowflakeTimer = new Storyboard();

public Page()
{
InitializeComponent();

_snowflakeTimer.Duration = TimeSpan.FromMilliseconds(0);
_snowflakeTimer.Completed += new EventHandler(SnowFlakeTimer);
_snowflakeTimer.Begin();
}

private void SnowFlakeTimer(object sender, EventArgs e)
{
MoveSnowFlakes();
CreateSnowFlakes();
}
}

이것을 그냥 이렇게 쓸 수 있다는 것이죠..

public partial class Page : UserControl
{
Storyboard _snowflakeTimer = new Storyboard();

public Page()
{
InitializeComponent();

CompositionTarget.Rendering += new EventHandler(SnowFlakeTimer);
}

private void SnowFlakeTimer(object sender, EventArgs e)
{
MoveSnowFlakes();
CreateSnowFlakes();
}
}

감사합니다.

-----------------------------------------------------------------------------------------------

코딩이 간편해지는 효과가 있군요.. 퍼포 상으로는 변화가 있는지는 잘 모르겠습니다.

댓글 없음:

댓글 쓰기