-
Notifications
You must be signed in to change notification settings - Fork 9
Buffer
Kim, Hyoun Woo edited this page Apr 8, 2016
·
3 revisions
original page can be found here
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을 이요앟면 쉽게 스트림 메시지의 비교 및 연산이 가능하다.
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 ));