1

Als ich vor kurzem begann, in Cocos2d zu entwickeln, war eines der ersten Merkmale, das ich sehr eigenartig fand, das Objective-C-Stil-Autorelease-Pool-Speichermodell. In meiner ganzen Erfahrung mit C++ habe ich es vermieden, irgendeine Form der dynamischen Speicherzuweisung zu verwenden, es sei denn, sie ist ABSOLUT notwendig (was sehr selten ist).Welche Vorteile bietet das benutzerdefinierte Speichermodell Cocos2d-x?

Zunächst war ich überrascht, dass Cocos2D Vorteil sichererer Alternativen nicht nahmen Zeiger Objekte für die Erstellung (zB Smart-Pointer), aber dann stieß ich auf this Gewinde, die die Nachteile der shared_ptr<class T> diskutiert (die bedeutendsten was Geschwindigkeit war) gegenüber dem aktuellen Speicherparadigma in Bezug auf manuelle Retain/Release-Methoden.

Dann dachte ich, "warum nicht einfach ein Objekt regelmäßig zuweisen und seine Referenz übergeben und speichern, wenn nötig?" Ich verstehe, dass es sehr zeitaufwändig wäre, das gesamte Speichersystem von Cocos2d-x in ein neues Paradigma zu portieren, aber ist es auf lange Sicht nicht sinnvoll, stabileren idiomatischen C++ - Code zu verwenden?

Worauf kommt es an, welche Vorteile bietet das aktuelle Speichermodell im Gegensatz zur regulären Objektzuordnung?

Antwort

1

Speicherverwaltung in Game Engines ist ein sehr spezifisches Thema, besonders wenn Sie Ihren Motor einfach bedienen wollen. Wenn Sie sich die Unreal Engine 4 anschauen, sind sie in ihrem Speichermanagement-Ansatz viel weiter gegangen und haben einen Reflexionscode generiert. Generell ist es möglich, ein cocos2d-x-Spiel zu erstellen, ohne explizit retain oder release aufzurufen. Diese Methoden werden zuerst verwendet, wenn Sie die Lebensdauer des Objekts manuell verlängern müssen, um zu vermeiden, dass es gelöscht und neu erstellt wird (Caching).

Gemeinsame Zeiger machen die Syntax viel komplexer und verursachen zusätzliche Schwierigkeiten mit dynamischen Umwandlungen und Bindezeigern als Argumente. Und was noch wichtiger ist, Sie müssen eine schwache_ptr zusammen mit shared_ptr verwenden, um Querverweise zu vermeiden, die auch zusätzlichen Aufwand erfordern.

Grundsätzlich shared_ptr ist eine Referenz Zähltechnik wie intrusive_ptr, die natürlich in cocos2d-x integriert werden kann. Und Funktionen wie addChild/removeChild in Cocos sind inkrementierende und dekrementierende Zähler des Child-Objekts, so dass diese Paradigmen nicht so vielfältig sind, wie es auf den ersten Blick scheinen mag.

0

Ich glaube nicht, dass Cocos2d-x verwaltet Ref abgeleitete Objekte mit einem Objective-C-Paradigma aus irgendeinem technischen Grund. C++ Smart Pointer (oder "reguläre Objektzuordnung") würden wahrscheinlich genauso gut funktionieren, wenn nicht sogar besser.

Historisch gesehen ist Cocos2d-x jedoch ein C++ - Port des Cocos2d-Projekts - das native Objective-C war (das war iirc, ein Port einer früheren Python-basierten Spielengine). Daher ist die Verwendung von AutoReleasePool- und Retain- und Release-Methoden historisch.

Das Ändern würde jetzt viel Code kaputt machen und viele Entwickler nerven und zu welchem ​​Zweck? Eine etwas mehr idiomatische Verwendung von C++ STL?

Das Wichtigste ist, dass das Management von Ref Objekten ist einfach, wohl viel einfacher, als zu versuchen, Entwickler zu lehren, die Dinge in den richtigen wickelt * _ptr <>, und ermöglicht es die Cocos2d-x Projekt - von den meisten der Verschleierung Speicherverwaltung - um die Funktionsparität mit Cocos2d-js zu erhalten. (Ich denke, es gibt auch einen Versuch, API-Kompatibilität mit Cocos2d zu halten).