Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
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 ));

Clone this wiki locally

AltStyle によって変換されたページ (->オリジナル) /