Cocos2d-x学习笔记(4)
Cocos2d-x中的内存管理 现有的智能内存管理技术:(1)引用计数,存在堆碎片化和管理繁琐的问题;(2)垃圾回收。 Cocos2d-x巧妙运用了前面的引用计数机制,在CCObject.h头文件中,看到CCObject的定义 class CC_DLL CCObject : public CCCopying{public: //
Cocos2d-x中的内存管理
现有的智能内存管理技术:(1)引用计数,存在堆碎片化和管理繁琐的问题;(2)垃圾回收。
Cocos2d-x巧妙运用了前面的引用计数机制,在CCObject.h头文件中,看到CCObject的定义
class CC_DLL CCObject : public CCCopying { public: // object id, CCScriptSupport need public m_uID 对象id,在脚本引擎中使用 unsigned int m_uID; Lua中的引用id,被脚本使用 // Lua reference id int m_nLuaID; protected: // count of references unsigned int m_uReference; //引用数量 // count of autorelease unsigned int m_uAutoReleaseCount; //是否设置为autorelease,自动回收池 public: CCObject(void); virtual ~CCObject(void);//虚析构函数 void release(void); //在其他地方引用,m_uReference自动加1 void retain(void); //引用结束,m_uReference自动减1<pre name="code" class="cpp"> CCObject* autorelease(void);//将对象自动放入回收池,当回收池自身被释放时,对池中的所有对象执行release()方法
但是考虑到效率问题,如果在一帧过程中生成了大量autorelease对象,导致回收池性能下降,因此在使用autorelease()密集的地方,可以手动设置一个回收池。如下:
CCPoolManger::sharedPoolManager()->push(); for(int i = 0;i addObject(dataItem); } CCPoolManager::sharedPoolManager()->pop();
工厂方法:
工厂方法是程序设计中一个经典的设计模式,指的是类中定义创建对象的接口,将实际实现推迟到子类中。分析如下代码:
<pre name="code" class="cpp">CCObject* factoryMethod() { CCObject* ret = new CCobject(); return ret; }
CCObject* factoryMethod() { CCObject* ret = new CCobject(); ret->autorelease(); return ret; }
关于传值:
将一个对象赋值给某一指针作为引用的时候,为了遵循内存管理的原则,我们需要获取新对象的引用权,释放就对象的引用权。release()和retain()的顺序尤为重要。
如下代码:
//错误代码 void SomeClass::setObject(CCObject* other) { this->object->release(); other->retain(); this->object = other; } //完善后代码 void SomeClass::setObject(CCObject* other) { other->retain(); this->object->release(); this->object = other; }
autorelease()只有在自动释放时才会进行一次释放操作,如果对象释放次数超过了应有次数,这个错误并不会被发现,只有当自动释放池被释放时才会崩溃。定位错误就很困难了。因此在开发中尽量避免滥用autorelease(),只在工厂方法等不得不用的情况下使用,尽量以release()来释放对象引用。
容器:CCArray、CCdictionary,如果直接使用STL容器,开发者需进行繁琐的内存管理操作,Cocos2d-x对这一过程进行了封装。
相关辅助宏:包含在头文件CCPlatformMacro.h里
宏 | 描述 |
CC_SAFE_DELETE(p) | 使用delete操作符删除一个C++对象p,如果p为NULL,则不进行操作 |
CC_SAFE_DELETE_ARRAY(p) | 使用delete[]操作符删除一个C++数组p,如果p为NULL,则不进行操作 |
CC_SAFE_FREE(p) | 使用free()函数删除p,如果p为NULL,则不进行操作 |
CC_SAFE_RELEASE(p) | 使用release()方法释放p的一次引用,如果p为NULL,则不进行操作 |
CC_SAFE_RELEASE_NULL(p) | 使用release()方法释放p的一次引用,再把p赋值为NULL,如果p已经为NULL,则不进行操作 |
CC_SAFE_RETAIN(p) | 使用retain()方法增加p的一次引用,如果p为NULL,则不进行操作 |
Cocos2d-x内存管理原则:
(1)程序段必须成对执行retain()和release()或者执行autorelease()来开始和结束对象的引用。
(2)工厂方法返回前,应通过autorelease()结束对该对象的引用。
(3)对象传值时,应考虑到新旧对象相同的特殊情况
(4)尽量使用release()而不是autorelease()释放对象引用,以确保性能最优。
(5)保存CCObject的子类对象时,应严格使用Cocos2d-x提供的容器,避免使用STL容器,对象必须以指针形式存入。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Xiaohongshu 메모를 삭제하는 방법 Xiaohongshu 앱에서 메모를 편집할 수 있습니다. 다음으로 편집기는 Xiaohongshu 메모 삭제 방법에 대한 사용자 사진과 텍스트를 가져옵니다. 보세요! Xiaohongshu 사용 튜토리얼 Xiaohongshu 메모 삭제 방법 1. 먼저 Xiaohongshu 앱을 열고 메인 페이지로 들어가서 오른쪽 하단에 있는 [Me]를 선택하여 특별 영역으로 들어갑니다. 2. 그런 다음 내 영역에서 다음과 같이 메모 페이지를 클릭합니다. 3. 노트 페이지에 들어가서 오른쪽 상단에 있는 [점 3개]를 클릭합니다. 4. 마지막으로 기능 표시줄이 하단에 확장되고 [삭제]를 클릭하여 완료합니다.

더 이상 pip가 필요하지 않나요? 와서 pip를 효과적으로 제거하는 방법을 알아보세요! 소개: pip는 Python 패키지를 쉽게 설치, 업그레이드 및 제거할 수 있는 Python의 패키지 관리 도구 중 하나입니다. 그러나 때로는 다른 패키지 관리 도구를 사용하고 싶거나 Python 환경을 완전히 지워야 하기 때문에 pip를 제거해야 할 수도 있습니다. 이 문서에서는 pip를 효율적으로 제거하는 방법을 설명하고 구체적인 코드 예제를 제공합니다. 1. pip 제거 방법 다음은 pip 제거의 두 가지 일반적인 방법을 소개합니다.

Xiaohongshu 사용자로서 우리 모두는 게시된 노트가 갑자기 사라지는 상황을 경험해 본 적이 있을 것입니다. 이는 의심할 여지 없이 혼란스럽고 걱정스러운 일입니다. 이런 경우, 우리는 어떻게 해야 합니까? 이번 글에서는 "샤오홍슈에서 발행한 노트가 누락된 경우 어떻게 해야 할까요?"라는 주제를 중심으로 자세한 답변을 드리겠습니다. 1. Xiaohongshu에서 발행한 노트가 누락된 경우 어떻게 해야 합니까? 첫째, 당황하지 마십시오. 메모가 누락된 경우 침착함을 유지하는 것이 중요하며 당황하지 마십시오. 이는 플랫폼 시스템 장애 또는 운영 오류로 인해 발생할 수 있습니다. 출시 기록을 확인하는 것은 쉽습니다. Xiaohongshu 앱을 열고 "나" → "게시" → "모든 출판물"을 클릭하면 자신의 출판 기록을 볼 수 있습니다. 여기에서는 이전에 게시된 메모를 쉽게 찾을 수 있습니다. 3.다시 게시합니다. 발견된 경우

Xiaohongshu 노트에 제품 링크를 추가하는 방법 Xiaohongshu 앱에서는 사용자가 다양한 콘텐츠를 탐색할 수 있을 뿐만 아니라 쇼핑도 할 수 있기 때문에 이 앱에는 쇼핑 추천 및 좋은 제품 공유에 대한 콘텐츠가 많이 있습니다. 이 앱에서는 일부 쇼핑 경험을 공유하고, 협력할 판매자를 찾고, 메모에 링크를 추가하는 등의 작업도 할 수 있습니다. 이 앱은 편리할 뿐만 아니라 많은 전문가가 만들 수 있기 때문에 많은 사람들이 쇼핑에 기꺼이 이 앱을 사용합니다. 흥미로운 콘텐츠를 탐색하고 자신에게 맞는 의류 제품이 있는지 확인할 수 있습니다. 노트에 제품 링크를 추가하는 방법을 살펴보겠습니다. 샤오홍슈 노트에 제품 링크를 추가하는 방법 휴대폰 데스크톱에서 앱을 엽니다. 앱 홈페이지를 클릭하세요

matplotlib 색상표에 대해 자세히 알아보려면 특정 코드 예제가 필요합니다. 1. 소개 matplotlib는 다양한 유형의 차트를 만드는 데 사용할 수 있는 풍부한 그리기 기능 및 도구 세트를 제공합니다. 컬러맵(colormap)은 차트의 색 구성표를 결정하는 matplotlib의 중요한 개념입니다. matplotlib 색상표에 대한 심층적인 연구는 matplotlib의 그리기 기능을 더 잘 익히고 그리기를 더 편리하게 만드는 데 도움이 될 것입니다.

처음부터 Pygame 배우기: 전체 설치 및 구성 튜토리얼, 특정 코드 예제 필요 소개: Pygame은 Python 프로그래밍 언어를 사용하여 개발된 오픈 소스 게임 개발 라이브러리로, 개발자가 다양한 유형을 쉽게 만들 수 있도록 풍부한 기능과 도구를 제공합니다. 게임의. 이 기사는 처음부터 Pygame을 배우는 데 도움이 될 것이며, 완전한 설치 및 구성 튜토리얼과 빠른 시작을 위한 특정 코드 예제를 제공할 것입니다. 1부: Python 및 Pygame 설치 먼저 다음 사항을 확인하세요.

Word에서 텍스트 내용을 편집할 때 수식 기호를 입력해야 하는 경우가 있습니다. 어떤 사람들은 Word에서 근수를 입력하는 방법을 모르기 때문에 편집자에게 Word에서 근수를 입력하는 방법에 대한 튜토리얼을 친구들과 공유해달라고 요청했습니다. 그것이 내 친구들에게 도움이 되기를 바랍니다. 먼저 컴퓨터에서 Word 소프트웨어를 연 다음 편집하려는 파일을 열고 루트 기호를 삽입해야 하는 위치로 커서를 이동합니다. 아래 그림 예를 참조하세요. 2. [삽입]을 선택한 후, 기호에서 [수식]을 선택하세요. 아래 그림의 빨간색 원과 같이 3. 아래의 [새 수식 삽입]을 선택하세요. 아래 그림의 빨간색 원과 같이 4. [부수]를 선택한 후 해당 부수를 선택합니다. 아래 그림의 빨간색 원에 표시된 대로:

C 언어 학습의 매력: 프로그래머의 잠재력을 여는 것 지속적인 기술 발전으로 컴퓨터 프로그래밍은 많은 주목을 받는 분야가 되었습니다. 많은 프로그래밍 언어 중에서 C 언어는 항상 프로그래머들에게 사랑을 받아 왔습니다. C 언어의 단순성, 효율성 및 폭넓은 적용 덕분에 많은 사람들이 프로그래밍 분야에 입문하는 첫 번째 단계는 C 언어입니다. 이 기사에서는 C 언어 학습의 매력과 C 언어 학습을 통해 프로그래머의 잠재력을 발휘하는 방법에 대해 설명합니다. 우선, C 언어 학습의 매력은 단순함에 있습니다. C언어는 다른 프로그래밍 언어에 비해
