scaleform.minarto.com

라이브러리를 통한 런타임 공유시 ApplicationDomain 내의 클래스 충돌 2 본문

Core

라이브러리를 통한 런타임 공유시 ApplicationDomain 내의 클래스 충돌 2

미나토 2012. 5. 13. 11:32



http://scaleform.minarto.com/351 에서 이어집니다


네, 속도 또한 빨라집니다.


new Sprite 라고 Sprite 객체를 생성하면 vm 내부적으로 어떤 일이 일어나는지 볼까요?



이렇게 내부적으로 6개의 객체가 생깁니다.


객체의 생성비용은??? 그 객체가 차지하는 메모리의 비용은???

뭔가 끔찍하지 않습니까?


여러분이 레퍼런스에서 보는 상속관계도는 단지 그림만이 아닌겁니다. 바로 내부적인 객체의 생성과정 또한 나타내는 것이죠.


형변환이란게 말이죠... 별개 아닙니다. 내부적으로 변수가 가르키는 해당 포인터를 위에서 보는 다른 객체로 바꾸는 거죠... 그렇게 형변환이 일어나는 거거든요...

이게 OOP 언어가 돌아가는 원리거든요...


이제 기초 이론을 보셨으니, 


d:DisplayObject = new Sprite

d.x = 100;

이 빠른 이유를 설명해야겠습니다


사실 Sprite 에는 x라는 속성이 존재하질 않습니다. DisplayObject 의 것이죠...


그런데 x는 그럼 어떻게 쓸 수 있느냐면...


Sprite 객체를 하나의 Sprite 의 속성 및 메소드가 담긴 컨텍스트라고 보고요... 그럼 안에 있는 x라는 키값을 찾습니다. 그 키값은 

public function set x($v:Number):void

라는 값이 들어있어야 하겠지만, 사실 Sprite 에는 x 라는 키값은 존재하지 않습니다.


그러면 그모든 키값을 검색한 후에 __parent 를 찾아갑니다. Sprite 의 __parent 는 바로 DisplayObjectContainer 객체의 컨텍스트를 가르키는 포인터입니다.

그러면 그다음에는 그 컨텍스트를 찾아해메죠... 그런데 역시 없습니다. 그럼 또 InteractiveObject > DisplayObject 순으로 찾아가서 결국에는 DisplayObject 에서 찾아내는 겁니다. x 는 DisplayObject 의 속성이거든요.

이것이 바로 컨텍스트 체인입니다. (스코프 체인과는 좀 다릅니다)


이건 사실 원리를 설명하고자 합입니다. 이 설명은 actionscript2 에는 맞으나 actionscript3에서는 설명이 맞지 않습니다.

as3 는 각 객체마다 traits 라는 객체를 생성해서 부모의 키값을 모두 복사해버립니다.

그래서 부모 컨텍스트로 포인터를 변경해서 키검색을 하지 않아도 바로 검색해서 해당 속성이나 메소드를 실행할 수 있게됩니다. 이 원리로 as2보다 as3 가 메모리는 많이 사용해도 속도가 빨라지게 되는겁니다.

구글의 크롬또한 이 방법으로 js vm 을 최적화하여 다른 브라우저보다 빠른 속도를 가능케 합니다. (대신 메모리 x망)


좀 더 깊이 알고 싶다면 이 카페를 이용하세요...


어쨌든 저런 과정을 거치게 됩니다. 저런 생노가다를 vm에서 처리하고 있으니 속도가 빠를 일이 없죠...


하지만

d:DisplayObject  = new Sprite 


코드를 이렇게 짜서 형변환을 미리 해버린다면... 바로 DisplayObject 객체의 컨텍스트에서 x 라는 키값을 찾아서 사용하게 됩니다. 엄청난 차이죠...


앞서서 as3 에는 설명이 맞지 않다고 했으나, 그렇다고 성능향상이 없는 것은 아닙니다.

언급했듯이 모든 부모클래스의 키값을 복사해서 traits 객체를 생성하다보니 그 객체 안에는 무수히 많은 키값이 존재합니다.

그렇게 되면 그 키를 검색해야할 속도 또한 늘게되는 겁니다.

물론 컨텍스트를 이동해가며 찾는 속도보다는 빠르지만 말입니다.



물론 이것이 갑자기 게임의 fps를 20-30 씩 올려주는 정도의 최적화 기법은 아닙니다. (뭐, 그러면 얼마나 좋겠습니까만은...)




주제가 좀 어려웠을 수도 있겠습니다. 욕심을 부리다보니 내용이 oop 내부적인 곳까지 흘러들어가게 되어서 말이죠...



정리를 하겠습니다.


1. 임포트는 상위 형변환을 해서 사용하시기 바랍니다.

2. 그러면 아예 해당클래스를 컴파일 할 일이 없으니 충돌 날 일이 존재하지 않습니다. 다른 곳에서 그 클래스가 컴파일된 적이 없으니까요...

3. 속도도 빨라집니다. 그래도 안쓰시겠습니까???

4. 특정 속성을 사용해야 한다면 인스펙터블 리스트로 빼서 ide에서 쓰면 됩니다.

5. 특정 메소드 사용을 런타임시 해야한다면 이벤트 기반으로 처리해도 됩니다. (물론 이벤트 기반 프로그래밍은 성능을 악화시킵니다)



내용이 길어져서 4,5 번에 대한 내용은 좀 생략을 했네요...


하지만 원리로서는 다 설명을 한 것 같으니 포스팅은 이만 마치겠습니다.



참고한 글


as3 레퍼런스 : http://help.adobe.com/ko_KR/as3/learn/WSf00ab63af761f170-4ed0731912937da73f7-7fe5.html#WSf00ab63af761f170-4ed0731912937da73f7-7fe3

다이버스터 : http://www.diebuster.com/flash/1