브라우저의 각각 프레임이 끝날 때마다 떨어지는 이벤트를 구현할 수 있는 방법이 소개되어서 올려봅니다.
(이게 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();
}
}
감사합니다.
-----------------------------------------------------------------------------------------------
코딩이 간편해지는 효과가 있군요.. 퍼포 상으로는 변화가 있는지는 잘 모르겠습니다.
댓글 없음:
댓글 쓰기