Skip to content
Kim, Hyoun Woo edited this page Apr 8, 2016 · 3 revisions

original page can be found here

Buffer 활용

Buffer를 사용하면 이전 프레임에서의 플레이어의 좌표와 지금 프레임에서의 플레이어의 좌표의 비교와 같이 스트림을 흐르는 메시지를 비교하는 것과 같은 작업을 손쉽게 처리할 수 있다.

Buffer 연산자 호출시 Skip을 지정하면 Buffer가 이벤트를 방류한 뒤 어느 타이밍에 다시 방류할지를 지정할 수 있다. Skip을 지정하지 않은 경우에는 Buffer가 지정한 Count와 같은 값이 Skip으로 설정된다.

// Skip을 지정하지 않은 경우
Observable.Range ( 1 ,  10 ) 
    .Select ( x => x.ToString ()) 
    .Buffer ( 2 )  // 2 개씩 정리 (방류 한 후에 2 개 날려에서 다음을 방류하는 .Buffer (2, 2)와 동의어) 
    .Subscribe ( x  => 
    { 
        // Buffer의 내용을 표시 
        Debug.Log ( x.Aggregate <string> (( p,  c )  =>  p.ToString ()  +  ","  +  c.ToString ())); 
    });

결과는 다음과 같다.

1,2
3,4
5,6
7,8
9,10
Observable.Range ( 1 ,  10 ) 
    .Select ( x => x . ToString ()) 
    .Buffer ( 2 , 1 )  // 2 개씩 넣어. 방류 후 1 개 날려 방류 
    .Subscribe ( x  => 
    { 
        // Buffer의 내용을 표시 
        Debug.Log (x.Aggregate <string> (( p, c )  =>  p.ToString()  +  ","  +  c . ToString ())); 
    });
1,2
2,3
3,4
4,5
5,6
6,7
7,8
9,10
10
Observable.Range ( 1 ,  10 ) 
    .Select ( x => x . ToString ()) 
    .Buffer ( 3 , 2 )  // 3 개씩 넣어. 방류 후 2 개 날려 방류 
    .Subscribe ( x  => 
    { 
        // Buffer의 내용을 표시 
        Debug.Log ( x.Aggregate < string > (( p ,  c )  =>  p.ToString ()  +  ","  +  c.ToString ())); 
    });
1,2,3
3,4,5
5,6,7
7,8,9
9,10

Buffer의 Skip을 이요앟면 쉽게 스트림 메시지의 비교 및 연산이 가능하다.

Buffer를 이용하여 이전 메시지와 현재 메시지의 차이 비교하기

this . UpdateAsObservable () 
    .Select ( _  =>  this.transform.position ) 
    .Buffer ( 2, 1 ) 
    .Where ( x  =>  x.Count  ==  2 )  // OnCompleted시 1 개만 흘러 나오는 것을 컷 
    .Select ( x  =>  x.Last ()  -  x.First ()) 
    .Subscribe ( x  =>  Debug.Log ( "Delta :"  +  x ));

다음은 Buffer(n, 1)을 이용해서 Update의 10회 호출시 Time.deltatime의 평균을 계산하는 코드이다.

this . UpdateAsObservable () 
    .Select ( _  =>  Time.deltaTime ) 
    .Buffer ( 10,  1 ) 
    .Select ( x  =>  x.Average ()) 
    .Subscribe ( x  =>  Debug . Log ( "Average :"  +  x ));