2017년 5월 14일 일요일

Cocos2d-x version difference between 2.x vs 3.x

http://cocos2d-x.org/

Cocos2d-x는 현재 두개의 버전을 지원하고있는데요.
2.2.6 버전과 3.15 버전을 지원하고 있습니다.

최근에 이 두개의 버전은 어떤 차이가 있고, 성능차이가 있는가에 대해 궁금해져서
이렇게 포스팅을 하게 되었습니다.

우선 크게 바뀐 것 부터 정리해보자면,
Release Note on GitHub: Cocos2d-x-v3.0-ReleaseNote.md
참고: VallistA님의 블로그

1. Python을 사용한 크로스 플랫폼 개발 지원(Cocos console)
Cocos2d-x 2.x 버전에서는 Cygwin을 이용한 리눅스 환경에서 작업을 했다면,
3.x 버전에서는 파이썬을 이용한 cocos console을 이용해서 작업할 수 있게 되었습니다.
이를 통해 쉽게 크로스 플랫폼 환경에서 편하게 프로젝트를 만들고 컴파일할 수 있게 되었습니다.

2. Objective-C 패턴 제거(Objective-C pattern removed)

  1. cocos2d라는 namespace를 사용하게 되면서, 더이상 CC라는 prefix를 사용할 필요가 없게되었습니다.
    • CCSprite -> Sprite, CCFrame -> Frame, CCScene -> Scene, CCDirector -> Director 등으로 변경되었습니다.
  2. copy() 함수 대신에 clone() 함수를 사용합니다.
  3. Singleton은 getInstance(), destoryInstance() 함수명을 사용하여 인스턴스를 관리합니다.
    • 그전에는 sharedDirector()와 같은 함수를 사용했었습니다.
  4. Object 클래스 -> Ref로 변경
    • Object라는 이름이 모호한 점이 있어 Ref로 변경되었습니다.
  5. Getter 함수들이 get prefix를 가집니다.
  6. POD type의 변수를 const로 전달합니다.


3. C++11 features를 따름
C++ 11 버전을 지원하게 되어서 여러가지 기능을 사용 가능하고, 따르게 되었습니다.
- auto 키워드를 사용가능 (보다 적극적으로 사용하게 되었습니다.)
- lambda식을 사용가능.
- enum(strongly typed enum)을 사용.
        (CCPointZero -> Point::ZERO 로 변경)
- override, final 키워드를 사용.

4. 새로운 Renderer
Cocos2d-x 2.2버전은 현재 문제는 없지만 최적화를 하거나 새로운 함수 추가,
새로운 플랫폼 추가하기가 힘듭니다. 이런 문제를 해결하기 위해 새로운 렌더러를 만들었습니다.
새로운 렌더러는 다음과 같은 기능을 가집니다.
  • It has been decoupled from the Scene Graph. The draw() method, instead of "drawing" it sends a RenderCommand to the Renderer, and Renderer is responsible for drawing the queued RenderCommand commands.
  • QuadCommands (used by Sprite and ParticleSystem objects) will be automatically batched.
  • CustomCommand objects allow the user to use custom OpenGL code, using a API similar to v2.2
  • GroupCommand objects allow to have "stacks" in the Renderer with different OpenGL values.
  • Auto-culling for Sprite objects (although, technically, Auto-culling is not performed in Renderer code, but in the Sprite code)
  • Global Z ordering (local Z ordering is still supported)
좀 더 살펴보면,

- Auto-batching
batch 작업을 많이하면 할 수록 성능이 안좋아지는데 이를 최적화합니다.
- Auto-culling(view frustum culling)
Sprite에 대해 처리를 하는 작업입니다. Sprite가 화면에서 나갈경우 draw가 실행되지 않도록합니다.
- Global Z order
setZOrder(), getZOrder()을 deprecate하고
setGlobalZOrder(), getGlobalZOrder(), setLocalZOrder(), getLocalZOrder()을 만들었습니다.
화면 전체에 대해 Zorder를 정할 것인지, 그 노드에서 Zorder를 정할 것인지를 세팅할 수 있습니다.

* Sprite vs SpriteBatchNode
2.2 버전에서는 Sprite를 효율적으로 처리하기 위해서, SpriteBatchNode를 사용하라고 권장 했었습니다.
3.0 버전에 올라와서는 SpriteBatchNode를 사용하지 않더라도 Sprite를 만들때 TextureID를 같게 만든다면 큰 성능 이슈는 없습니다.
만약 성능을 올리고 싶다면 SpriteBatchNode를 사용하는게 여전히 좋습니다.

5. LabelTTF / LabelBMFont / LabelAtlas 개선
Label에 대한 구현이 Label 클래스로 통합되었습니다.

6. 새로운 EventDispatcher
touch event, keyboard event, acceleration event, custom event에 대한 디스패쳐가 삭제되었습니다.
EventDispatcher로 통합되었는데, 모든 이벤트는 EventDispatcher로 처리합니다.

7. 물리엔진 개선(Physics Integration)
Box2D로 구현했던 물리엔진 기능이 Chipmunk2D로 통합, 바뀌었습니다.

정리해놓고 보니까 꽤 많은 변화가 있었지만, 2.2.6 버전도 지금까지 어떤 변화가 있었는지
그에 대한 정리가 필요해보입니다.

그 외에  OpenGL 버전 업은 어떻게 되었는지도 궁금하지만 릴리즈 노트에는 없으니
따로 찾아봐야겠습니다.

ARM에서 Ricardo Quesada 님이 발표한 내용이 있어서 공유합니다.


다음엔 OpenGL 버전과 Cocos2d-x 버전과의 상관관계를 알아봐야겠습니다.


댓글 없음:

댓글 쓰기

JIRA Plugin - ScriptRunner 소개 #2

관련 글 소개 #1:  https://pineoc.blogspot.com/2019/03/scriptrunner-1.html ScriptRunner 소개 #2 지난 글에서는 Behaviours를 보았고 다음 내용인 콘솔, 리스너 등을 ...