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()方法CCObject* copy(void); bool isSingleReference(void); unsigned int retainCount(void); virtual bool isEqual(const CCObject* pObject); virtual void update(float dt) {CC_UNUSED_PARAM(dt);}; friend class CCAutoreleasePool;}; 执行一次autorelease()后对象的引用并没有被立刻释放,在下一帧开始之前,对象被释放。
但是考虑到效率问题,如果在一帧过程中生成了大量autorelease对象,导致回收池性能下降,因此在使用autorelease()密集的地方,可以手动设置一个回收池。如下:
CCPoolManger::sharedPoolManager()->push(); for(int i = 0;i addObject(dataItem); } CCPoolManager::sharedPoolManager()->pop();代码执行n次循环,每次都会创建一个autorelease对象CCString,为了保持回收池的性能,在循环前使用push方法创建了一个新的回收池,在循环结束后使用pop方法释放刚才的回收池。
工厂方法:
工厂方法是程序设计中一个经典的设计模式,指的是类中定义创建对象的接口,将实际实现推迟到子类中。分析如下代码:
<pre name="code" class="cpp">CCObject* factoryMethod() { CCObject* ret = new CCobject(); return ret; }
返回ret时ret指向的内存被释放。用autorelease()解决了这个问题。虽然调用了autorelease,但对象并未直接被释放掉,而是在一帧结束后释放回收池。修改后的代码
CCObject* factoryMethod() { CCObject* ret = new CCobject(); ret->autorelease(); return ret; }使用工厂方法创建的对象,虽然引用计数也为1,但是由于对象已经被放入回收池,因此调用者没有该对象的引用权,除非我们认为调用retain()来获取引用权,否则不用主动释放对象。
关于传值:
将一个对象赋值给某一指针作为引用的时候,为了遵循内存管理的原则,我们需要获取新对象的引用权,释放就对象的引用权。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; }第一个错误,当other和object指向同一个对象时,第一个release就会将对象回收,所以先执行retain()来保证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容器,对象必须以指针形式存入。

MysqloffersVariousStorageEngines, EverySuitedfordifferentusecases: 1) InnoDbisidealforApplicationsNeedingaCidComplianceandHighConcurrency, SupportingingTransactions und MisseractersactionSactions.2) MyisamisBestforread-Heavyworks, Fehlen von Abladungen, mangelndtransaktionen

Zu den allgemeinen Sicherheitslücken in MySQL gehören die SQL -Injektion, schwache Passwörter, unsachgemäße Berechtigungskonfiguration und eine nicht updierte Software. 1. SQL -Injektion kann durch Verwendung von Vorverarbeitungsanweisungen verhindert werden. 2. Schwache Passwörter können vermieden werden, indem Sie starke Kennwortstrategien verwenden. 3. Eine unsachgemäße Berechtigungskonfiguration kann durch regelmäßige Überprüfung und Anpassung der Benutzerberechtigungen behoben werden. 4. Die nicht updierte Software kann durch regelmäßiges Überprüfen und Aktualisieren der MySQL -Version gepatcht werden.

Das Identifizieren langsamer Abfragen in MySQL kann erreicht werden, indem langsame Abfrageprotokolle aktiviert und Schwellenwerte festgelegt werden. 1. Aktivieren Sie langsame Abfrageprotokolle und setzen Sie Schwellenwerte. 2. Sehen und analysieren Sie langsame Abfrageprotokolldateien und verwenden Sie Tools wie MySQLDUMPSLOW oder PT-Query-Digest für eingehende Analysen. 3. Die Optimierung langsamer Abfragen kann durch Indexoptimierung, Umschreiben von Abfragen und Vermeidung der Verwendung von Select*erreicht werden.

Um die Gesundheit und Leistung von MySQL -Servern zu überwachen, sollten Sie auf Systemgesundheit, Leistungsmetriken und Abfrageausführung achten. 1) Überwachen Sie die Systemgesundheit: Verwenden Sie die Befehle von Top-, HTOP- oder ShowglobalStatus, um CPU-, Speicher-, Festplatten -E/A- und Netzwerkaktivitäten anzuzeigen. 2) Leistungsindikatoren verfolgen: Überwachen Sie die Schlüsselindikatoren wie die Abfragennummer pro Sekunde, die durchschnittliche Abfragezeit und den Cache -Hit -Rate. 3) Optimierung der Abfrageausführung sicherstellen: Aktivieren Sie langsame Abfragenprotokolle, zeichnen und optimieren Sie Abfragen, deren Ausführungszeit den festgelegten Schwellenwert überschreitet.

Der Hauptunterschied zwischen MySQL und Mariadb ist Leistung, Funktionalität und Lizenz: 1. MySQL wird von Oracle entwickelt und Mariadb ist seine Gabel. 2. Mariadb kann in Umgebungen mit hoher Last besser abschneiden. 3.MariADB bietet mehr Speichermotoren und Funktionen. 4.Mysql nimmt eine doppelte Lizenz an, und Mariadb ist vollständig Open Source. Die vorhandene Infrastruktur, Leistungsanforderungen, funktionale Anforderungen und Lizenzkosten sollten bei der Auswahl berücksichtigt werden.

MySQL verwendet eine GPL -Lizenz. 1) Die GPL -Lizenz ermöglicht die freie Verwendung, Änderung und Verteilung von MySQL, aber die geänderte Verteilung muss GPL entsprechen. 2) Gewerbelizenzen können öffentliche Änderungen vermeiden und für gewerbliche Anwendungen geeignet sind, die Vertraulichkeit erfordern.

Die Situationen bei der Auswahl von InnoDB anstelle von MyISAM umfassen: 1) Unterstützung der Transaktion, 2) hohe Genauigkeitsumgebung, 3) hohe Datenkonsistenz; Umgekehrt umfasst die Situation bei der Auswahl von MyISAM: 1) hauptsächlich Lesen von Operationen, 2) Es ist keine Transaktionsunterstützung erforderlich. InnoDB ist für Anwendungen geeignet, die eine hohe Datenkonsistenz und Transaktionsverarbeitung erfordern, z. B. E-Commerce-Plattformen, während MyISAM für lessintensive und transaktionsfreie Anwendungen wie Blog-Systeme geeignet ist.

In MySQL besteht die Funktion von Fremdschlüssel darin, die Beziehung zwischen Tabellen herzustellen und die Konsistenz und Integrität der Daten zu gewährleisten. Fremdeschlüssel behalten die Wirksamkeit von Daten durch Referenzintegritätsprüfungen und Kaskadierungsvorgänge bei. Achten Sie auf die Leistungsoptimierung und vermeiden Sie bei der Verwendung häufige Fehler.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

mPDF
mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

SecLists
SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

VSCode Windows 64-Bit-Download
Ein kostenloser und leistungsstarker IDE-Editor von Microsoft

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

WebStorm-Mac-Version
Nützliche JavaScript-Entwicklungstools
