본문 바로가기

Silverlight

[Sample] CompositionTarget.Rendering 이벤트


  쇼티예요.

  팁이 오늘은 많네요. 이번 이벤트는 원제는 'Main Game Loop Revisited ('게임루프'의 재림) 입니다.

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

  (이게 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();
        }
    }

  감사합니다.

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

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

[출처] 실버라이트 네이버 카페