Du bist nicht angemeldet.

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

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

21

22.06.2014, 22:00

Btw. was mir gerade auffällt: der delete Operator wirft in C++11 keine Exceptions mehr!

22

22.06.2014, 22:01

Naja, also ich benötige momentan keinen shared_ptr, da die Handles im Endeffekt Schlüssel sind, die zum Suchen in der Tabelle des Ressource-Managers dienen, und es auch ermöglichen, die Ressourcen erneut zu laden. Der Ressourcen-Manager allein entscheidet, wann Ressourcen wieder freigegeben werden.

@DeKugelschieber: Also paranoid will ich sicher nicht werden, aber ich frage mich ernsthaft wie dieses Problem überhaupt lösbar ist, und welche Möglichkeiten überhaupt existieren.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

23

22.06.2014, 22:04

Meinst du jetzt speziell einen Resource Manager zu schreiben oder Speicher garantiert wieder frei zu geben?

24

22.06.2014, 22:09

Speicher garantiert wieder freizugeben.

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

25

22.06.2014, 22:31

Um das nochmals klarzustellen: Destruktoren sind in C++11 immer noexcept. Kommt es zu einer Exception im Destruktor, wird std::terminate aufgerufen. Oder um es auf Deutsch zu formulieren: C++11 will dir garantieren, dass Destruktoren immer funktionieren.
(Und tun sie es warum auch immer mal doch nicht, macht's halt bumms.)

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

26

22.06.2014, 22:43

Soll heißen, ich Zweifelsfall sollten die Destruktoren der RAII-Klassen die Exceptions lieber schlucken? Dann bleibt der Speicher also eben falsch?

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

27

22.06.2014, 22:50

Nein, dann beendet sich lieber dein Programm ...

Ausserdem vergesst nicht, dass zum shared_ptr auch der weak_ptr gehört. Meine Ressourcenverwaltung hält selber einen weak_ptr auf geladene Ressourcen. D.h. solange die Ressourcen "draussen" benutzt werden ist ein erneutes Laden nicht nötig und sobald die Ressource draussen freigegeben ist, wird auch ihr Destruktor aufgerufen. Nachteil ist natürlich, ich kann die Ressourcen nicht zentral entladen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

28

23.06.2014, 06:46

Ist das nicht etwas merkwürdig, wenn der Manager das Ding ständig wieder frei gibt, sobald es mal ganz kurz nicht verwendet wurde und es dann wieder neu laden muss? Ich würde ja davon ausgehen, dass ein Manager auch gewisse Caching-Strategien umsetzt. Das macht Deiner dann aber irgendwie nicht.

@EuadeLuxe: Also garantiert bei Dir niemand, dass ein Objekt nicht vielleicht eine Textur noch braucht, wenn der Ressourcen-Manager sie frei gibt. Das ist aber genau das Gegenteil dessen, was in diesem Topic gefragt war. Genau das sollte ja verhindert werden.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

29

23.06.2014, 11:31

@BC: Ich glaube ein allgemeiner Ressourcenmanager wird nie das korrekte Wissen haben, um die Entscheidung über eine sinnvolle Lebensdauer von Ressourcen zu treffen. Das wird alles mehr oder weniger heuristisch sein. Daher kümmert der sich bei mir nur darum das nichts doppelt geladen wird. Eher habe ich vor es separat zu implementieren das derartig häufig, aber kurz benötigte Ressourcen z.B. einmal zentral beim Ressourcenmanager abgeholt werden und für die Dauer eines Levels o.ä. gehalten werden. Dann werden die nicht entladen.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

30

23.06.2014, 12:59

So sehe ich das auch. Wichtig daher aus meiner Sicht eigentlich eher Redundanz zu vermeiden (also nichts mehrfach laden).
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige