scaleform.minarto.com

CLIK 인터랙션 최적화 0 본문

Scaleform

CLIK 인터랙션 최적화 0

미나토 2012. 5. 18. 12:07


CLIK 은 생산성 위주의 프레임웍이고 그에 따른 컴포넌트 들을 가지고 있습니다.


UIComponent 가 MovieClip 을 상속받아서, Flash IDE 상에서 바로바로 디자인을 바꾸고 일반화된 기능들을 적용할 수 있게 합니다.


이렇게 생산성에 최적화 된 것은 CLIK 의 커다란 장점입니다만... 생산성에만 최적화 되어 있는 것은 아닙니다.

성능도 나름 최적화를 시키려 하고 있습니다.



UIComponent 를 까보면 다음과 같이 동작합니다.



변경사항 발생

V

변경 값 저장

V

invalidate 실행

V

as2 : 1ms 뒤에 렌더링 / 그 후 타이머 해제

as3 : 다음번 렌더이벤트 시나 다음번 엔터프레임 이벤트에 렌더링 / 그 후 이벤트 해제


여기서 중요한 포인트는 


invalidate 실행

V

as2 : 1ms 뒤에 렌더링 / 그 후 타이머 해제

as3 : 다음번 렌더이벤트 시나 다음번 엔터프레임 이벤트에 렌더링 / 그 후 이벤트 해제


이 부분입니다.


바로 렌더링으로 들어가지 않고, 한단계를 더 거치죠... 예를 들어,


var d:DisplayObject;

d.x = 400;

d.x = 300;


이러면 렌더링이 두번이 일어나게 됩니다.


플래시는 update 나, render 같은 명령 없이 바로 바로 디스플레이 객체의 속성 값이 변경되면 렌더링이 일어나기 때문입니다.

d.x = 400;

한번 일어났고

d.x = 300;

두번 일어난거죠...


결과적으로는 d.x = 300 밖에 사람들은 못보지만, 내부적으로는 렌더링이 두번 된 셈입니다.

이것만이 아니라 싱글 스레드이다 보니 저 동작들이 완료되기 전에 다음번 이벤트가 발생하지 못합니다. 전체적인 성능 또한 떨어지겠죠...


하지만 위와 같이 처리하면, 한번의 렌더링으로 모든걸 갱신하게 되죠... 게다가 스케일폼은 렌더링을 멀티스레드로 돌립니다.

(뭐, 이게 엄청난 아이디어는 아닙니다. 이미 플렉스 등에서 하고 있는 방법입니다.)


뭐, 이런 원리로 잘 돌아가니 잘 쓰면 됩니다... 라고 말하고 싶지만... 이것이 문제가 됩니다.


스케일폼의 렌더링을 제외한 어드밴스 부분... 즉 연산 쪽은 기본적으로 싱글 스레드로 동작합니다.

그리고 그 성능 또한 높지 않습니다...


그런데 저런 동작을 시키면 일단 앞의 연산 부분에서 시간을 뺏기고, 렌더링이 비동기 방식으로 돌아가다보니

실제적으로는 as2에서 코딩해놓은 것처럼 1ms 가 아니고 수 ms 뒤에나 동작을 하게 되는 셈이죠...


게다가 여기서 끝나는게 아닙니다.


게임인 이상 마우스/키보드 또는 게임컨트롤러의 입력을 받아서 처리해야합니다.

이 입력이라는 것은 또 스케일폼의 내장되어 있는 것이 아니다 보니 os랑 통신도 해야 합니다. 그걸 또 처리해야 하고요...


마우스 키보드 입력은 또 InteractiveObject 등을 돌면서 캡처링을 하고 버블링을 하게 됩니다.

이 때마다 이벤트를 복제하게 되고요...이 복제 때 사용하게 되는 함수가 Event.clone() 함수죠...



정말 우리는 마우스 입력에 따른 디스플레이 갱신을 1ms 만에 받아볼 수 있을까요???



다음 포스팅으로 이어집니다.



참고하면 좋은 글 :

http://www.diebuster.com/flash/79

http://blog.jidolstar.com/528