Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Aber ja, es dauert etwas, bis man das eingesehen hat.
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
Wie gesagt, da stimme ich Dir zu. Ich habe auch in meinem aktuellen Framework eine *Art* Singleton... zumindest eine Klasse, die eine Static-Liste von Kostruktoren als Fabrik hält, die sie mittels Refactoring über die Assembly gewonnen hat. Das braucht man nur einmal global, egal wie viele Plugins ich dazu lade oder wie viele Ressourcen-Manager oder sonstewas verwendet werden. Aber, wie auch schon gesagt, werden Singletons gerade in Hobby-Projekten gerne für Dinge verwendet, wo es fraglich ist, bzw. wo nur aus Faulheit ein Singleton gewählt wurde. Z.B. will *ich* nicht nur einen Ressourcen-Manager haben können, denn dann hätte ich bei der Verwaltung von Plugin-Daten oder Multiplen Fenstern arge Probleme, wenn eines davon sich dazu entscheidet alle geladenen Ressourcen zu entladen... oder eines will Daten eben *nicht* aus dem Manager-Cache laden, sondern von Platte (was bei Singletons mit Verschachtelter Verwendung durch Ressourcen-Unterklassen unmöglich ist) oder ähnliches. Man sollte also schon wirklich wissen was man tut, das ist aber leider viel zu selten der Fall, ganz ehrlich. Ist nicht böse gemeint, auch ich erwische mich immer wieder dabei.Man muss sich nur vorher Gedanken machen. Dann ist gegen ein Singleton nichts einzuwenden.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
//////////////////////////////////////////////////////////////////////////// /// \brief A RAII (Resource Acquisition Is Initialization) class with /// a data member (m_instance). /// /// If RAII is enabled, the derived class should delete its /// data content. //////////////////////////////////////////////////////////////////////////// template<typename T> class bsxRAII { protected: //! If enabled, a derived class should release itself its data per deconstructor. bool m_activeRAII; //! The instance of data. T m_instance; public: //////////////////////////////////////////////////////////////////////////// /// \brief Default constructor. //////////////////////////////////////////////////////////////////////////// __forceinline bsxRAII() { m_activeRAII = true; } //////////////////////////////////////////////////////////////////////////// /// \brief Constructor. /// Note: It disables the RAII mode, because it is using /// an external resource. /// /// \param from The RAII class. //////////////////////////////////////////////////////////////////////////// __forceinline bsxRAII(const bsxRAII<T> &from) { setInstance(from.getInstance()); } //////////////////////////////////////////////////////////////////////////// /// \brief The copy operator for the class. /// Note: It disables the RAII mode, because it is using /// an external resource. /// /// \param from The RAII class. /// /// \return A shallow copy of this object. //////////////////////////////////////////////////////////////////////////// __forceinline bsxRAII operator=(const bsxRAII<T> &from) { setInstance(from.getInstance()); return *this; } //////////////////////////////////////////////////////////////////////////// /// \brief Gets the instance. /// /// \return The instance. //////////////////////////////////////////////////////////////////////////// __forceinline T getInstance() const { return m_instance; } //////////////////////////////////////////////////////////////////////////// /// \brief Sets the instance of the class. /// Note: It disables the RAII mode, because it is using /// an external resource. /// /// \param instance The instance. //////////////////////////////////////////////////////////////////////////// __forceinline void setInstance(const T &instance) { m_instance = instance; disableRAII(); } //////////////////////////////////////////////////////////////////////////// /// \brief Enables the RAII mode. //////////////////////////////////////////////////////////////////////////// __forceinline void enableRAII() { m_activeRAII = true; } //////////////////////////////////////////////////////////////////////////// /// \brief Disables the RAII mode. //////////////////////////////////////////////////////////////////////////// __forceinline void disableRAII() { m_activeRAII = false; } //////////////////////////////////////////////////////////////////////////// /// \brief Query if this object is a RAII class. /// /// \return true if it is an RAII enabled class. //////////////////////////////////////////////////////////////////////////// __forceinline bool isRAII() const { return m_activeRAII; } //////////////////////////////////////////////////////////////////////////// /// \brief The derived class has to implement a release() method. //////////////////////////////////////////////////////////////////////////// virtual void release() = 0; }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class VertexBuffer : public bsxRAII<ID3D11Buffer*> { protected: Device m_Device; public: VertexBuffer() { SafeNull(m_instance); } ~VertexBuffer() { if(isRAII()) release(); } void create(const Device &iDevice, const void* iData, size_t iSizePerElement, size_t CountOfVertices) { ... } ... void release() { ... } } |
idontknow
unregistriert
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
C-/C++-Quelltext |
|
1 2 3 |
class VertexBuffer : public bsxRAII<3DVector*> { } |
idontknow
unregistriert
Community-Fossil
Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer
idontknow
unregistriert
najaaaa, so einfach wird das nicht sein denke ich. weil es doch entscheidnede veränderungen gibt, z.b. (hab nur davon gehört) dass alle renderstates in sonem state block gespeichert werden und man den dann setzen kann.
Werbeanzeige