Cocos2d-x 메모리관리

Objective-C 기반의 메모리모델인 Reference Counting


https://www.programering.com/a/MTN3cjMwATg.html

cocos2d-x의 메모리 관리 기법에 대해 잘 정리된 기사를 발견.
참고용으로 번역(의역)해서 정리한다.


  • Object-C 로부터 이식 된 cocos2d-x의 메모리 관리는,
    그 동안, Object-C에 대해 접점이 없었던 C++ 개발자들에게 큰 혼란을 안겨줍니다.
    메모리 관리에 대한 이해 없이 좋은 C++ 프로시져를 작성할 수는 없기에,
     저는 OC와 cocos2d-x 양쪽 모두에 경험을 가지고 있어, cocos2d-x게임을 개발하는 분들에게 도움을 줄 수 있을까 하는 마음으로 이 포스트를 작성합니다.

  • C++의 동적 메모리 관리는, '누가 누구에게 Release 원칙을 적용하는가'
    즉, 'Object를 생성하는 new 연산자부터, 삭제하는 delete 연산까지, 누가 책임을 가지고 있는가 ' 에 주요 논점이 있습니다.
     만약 function 안에서 object의 life-cycle이 모두 이루어진다면, 그저 function의 return문 직전에 삭제하는 것 만으로 충분합니다.
     하지만 일반적으로, 우리는 new로부터 function body 밖까지의 life-cycle을 가지는 function을 만드는데
    그렇지 않는다면, 우리는 Object들을 Stack에 직접 생성함으로써,
    Dynamic Memory(Heap)을 사용하지 않고, 발생하는 메모리 문제를 막을 수 있을 것입니다.
    (물론, 스택에 큰 Object를 할당하는 것은 옳지 않습니다.)

  • 만약, function 밖에서 life-cycle을 가지는 Object를 다룬다면,
    우리는 누구에게 Release 원칙을 적용시켜야 할지 애매해 질 것이고, Object를 Release 시킬 적절한 (다른) 장소를 가져야만 할 것이며, 만약 그 Object가 다양한 Object들과 참조관계를 가지고 있으면 문제는 더더욱 복잡해질 것입니다.
     Object가 삭제되기 위해서는, 더이상 모든 다른 Object가 그것을 필요로 하지 않아야(참조하지 않아야 ) 하는데, 현실적으로 이것을 보장하기는 너무 어렵습니다.

  • 그리하여, 많은 메모리 관리기법들이 필요에 따라 나타나게 되었습니다.
    Garbage Collector, Smart Pointer, Reference Counting...
    Object-C를 이식한 cocos2d-x는, 그렇기때문에 Referece Counting 방법을 사용하고, 이는 원래의 메모리 관리 기법과 대비됩니다.

  •  cocos2d-x는 CCObject와 CCPoolManger를 이용해 메모리관리를 수행합니다.
    모든 cocos2d-x의 Referece Counting 메커니즘은 CCObject 클래스로부터 나옵니다.
    CCObject는 멤버변수로 m_uReference를 가지고 있고,
    m_uReference = 1 은 해당 Object가 1번 인용(참조) 되었음을 가리킵니다.
    CCObject의 retain 메서드는 카운터를 1 증가시키고, Release 메서드는 카운터를 1로 만들 수 있습니다.
     카운터가 0까지 줄어들게 되면, 해당 객체의 소멸이 수행됩니다.






Manual memory management
  • 우리는 retain과 release를 사용함으로써,  new에 의해 만들어진 Object의 메모리 관리를 다룰 수 있습니다.
      1. CCObject *obj=new CCObject();
      2. ...
      3. obj->release();

new/delete 가 한 쌍으로 작용하는 것 처럼, new/release 또한 메모리가 release 됨을 보장합니다.
몇몇 사람들은, delete를 release로 교체하는 것 만으로 의미가 있는가 하는 의문을 제기 할 수 있지요.
 
 이 release가 결코 delete와 같지 않으며,
 release는 그저 reference count를 1로 만들지, obj 메모리의 소멸을 의미하지 않는다는 것을 기억할 필요가 있습니다.

오직 referece count가 0이 되었을 때, 메모리는 파괴될 것입니다. 아래의 코드가 release와 delete를 보여줍니다.

  1. CCArray *array = CCArray::array();
  2. CCObject *obj = new CCObject();    // m_uReference=1
  3. array->addObject(obj);   //Retain addObject CCArray automatically calls obj,  //the reference plus 1 count, said obj, at m_uReference=2
  4. obj->release();  // Here release and new pairing, obj reference count minus 1,  // but not released at this time obj, m_uReference=1;
  5. obj->doSomething();  // At release we can still use normal obj, it has not been released
  6. array->removeObject(obj);  //When we remove obj from CCArray, CCArray will automatically call obj release, // now m_uReference=0, obj is destroyed
  7. obj->doSomething();  // Error, obj has been destroyed


메모리 관리를 위해, 우리는 new/release, retain/release 쌍을 맞춰야 합니다.
생성된 후, cocos2d-x Collection에 추가된 Object는 








댓글

이 블로그의 인기 게시물

(의역) Separating Axis Theorem(SAT) 설명

Simple Intersection Tests For Games (의역)