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

71

07.06.2010, 15:55

Durch Raw Input hat man einfach viel mehr Möglichkeiten. Man kann selbst bestimmen welche Hardware verwendet werden soll, man bekommt mehr Informationen über die Hardware, die Eingabedaten kommen direkt von der Hardware, man kann alle möglichen anderen Eingabegeräte verwenden, usw.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

72

07.06.2010, 19:31

Ich denke ich lasse es so wie es ist.
Ich brauche keine anderen Geräte außer die Maus und Tastatur und das klappt ja bestens ^^

Eine Frage: Sollte ich die Anzahl der Fenster auf 1 minimieren? Weil warum sollte man 2 verschiedene Fenster haben wollen?
Das sind 2 verschiedene Programme.
Weil so könnte ich sehr viele Probleme weg machen

73

07.06.2010, 19:44

Für z.B. Editoren wirst du mehrere Render Fenster brauchen oder halt ähnliche Anwendungen. Es ist aber nicht immer gut alles zu beschränken, nur weil man Probleme damit hat es umzusetzen. Je beständiger du bist, desto mehr lernst du auch.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

74

08.06.2010, 19:27

Ja stimmt. Irgendwie hast du immer so gute Argumente -Insane- :D
Werde mir jetzt doch noch einmal Raw Input angucken, wäre ganz praktisch die relative UND absolute Position der Maus zu kennen :)

Hat sonst noch jemand etwas Gutes zu sagen? :D

EDIT: Mmh irgendwie bekomm ich das nicht hin das alles ohne die Module per Parameter zu übergeben.
Der Vorschlag von -Insane- würde klappen mit dem LoadSprite(), aber ich würde es gern ohne eine externe Funktion machen :(

75

08.06.2010, 21:53

Ähm sry dass ich jetzt hier rein schreib, aber ich will keinen neuen Thread für so ein kleines Problem aufmachen ;)
Also die Frage ist: Wann sollte man Speicher wärend der Runtime reservieren und wann nicht?
Also wann new/delete und wann einfach so/RAII?

76

08.06.2010, 22:20

Also auf jeden Fall immer, wenn du etwas dynamisch anlegen musst. Z.B. eine variable Mapgröße. Bei einfachen Variablen wie z.B. einem char macht es natürlich keinen Sinn, da kann man auch gleich eine normale Variable benutzen. Für Arrays benutze ich im Grunde immer Pointer. Es kommt halt immer drauf an. Willst du keine Arrays benutzen, sondern nur einfache Klassen Instanzen oder ähnliches, brauchst du von diesen natürlich auch keinen Pointer erstellen. Nur wenn du eine Klasse hast, die mit dem Konstruktor initialisiert werden muss, macht es Sinn von diesem einen Pointer zu erstellen, wenn sich diese Instanz in einer anderen Klassendeklaration befindet. Am Besten ist du probierst einfach aus, was wo am Besten geeignet ist, das kommt mit der Zeit von alleine, weil man recht schnell merkt, wo etwas Sinn macht und wo nicht.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

77

10.06.2010, 21:57

Also auf jeden Fall immer, wenn du etwas dynamisch anlegen musst. Z.B. eine variable Mapgröße.
Nein, nein. Es gibt sehr wenige Fälle, in denen manuelle Speicherverwaltung tatsächlich gerechtfertigt ist. Wenn, dann sollte sie lokal gekapselt sein. Aber im Anwendercode hat sie im Allgemeinen nichts verloren.

Variable Kartengrösse ist ein schönes Beispiel für einen Fall, wo man new und delete weder verwenden muss noch sollte.


Für Arrays benutze ich im Grunde immer Pointer.
Sowas mache ich zum Beispiel nie. Und zwar einfach, weil dieses Vorgehen sehr viele Fehlerquellen und Risiken birgt, ohne dass es irgendwelche relevanten Vorteile hätte. Für Arrays kann man Containerklassen verwenden (STL und Boost). Für einzelne Objekte gibt es Smart-Pointer mit den unterschiedlichsten Besitz-Semantiken. Sehr oft ist es ohnehin sinnvoll, direkt den Wert statt einer Indirektion über Zeiger zu haben.


Am Besten ist du probierst einfach aus, was wo am Besten geeignet ist, das kommt mit der Zeit von alleine, weil man recht schnell merkt, wo etwas Sinn macht und wo nicht.
Diesen Eindruck habe ich nicht. Meistens werden einem solche Dinge erst bewusst, wenn man sich ausführlich mit der Thematik beschäftigt und Bücher wie Exceptional C++ liest. Viele C++-Programmierer setzen new und delete nach wie vor leichtsinnig ein. Deswegen gibt es z.B. immer noch etliche Leute mit der Ansicht, in C++ hätte man mit Memory Leaks zu kämpfen, was aber faktisch nicht stimmt.

C++ bietet dem Programmierer mit RAII eine sehr elegante Möglichkeit, den Schwierigkeiten der manuellen Speicherverwaltung Herr zu werden. Es braucht schon gute Gründe, um darauf zu verzichten und sich freiwillig den Problemen aus C zu stellen.


Also die Frage ist: Wann sollte man Speicher wärend der Runtime reservieren und wann nicht?
Also wann new/delete und wann einfach so/RAII?
Benutze manuelle Speicherverwaltung (new, new[], delete, delete[]) so wenig wie möglich. Überlege dir jedes Mal, bevor du ungeschützten Speicher anforderst, warum dieses Vorgehen gerechtfertigt (d.h. besser als die Alternativen) ist. Wenn du dir irgendwo nicht sicher bist, frage ohne zu zögern wieder nach.

Du solltest dich auf jeden Fall in moderne Speicherverwaltung einlesen. Aus dem C++-Forum gibt es beispielsweise zwei nützliche Artikel:
STL-Container
Boosts Smart-Pointer
Und etwas Literatur wie Effective C++ oder Exceptional C++ schadet grundsätzlich nie.

78

10.06.2010, 23:31

Also auf jeden Fall immer, wenn du etwas dynamisch anlegen musst. Z.B. eine variable Mapgröße.
Nein, nein. Es gibt sehr wenige Fälle, in denen manuelle Speicherverwaltung tatsächlich gerechtfertigt ist. Wenn, dann sollte sie lokal gekapselt sein. Aber im Anwendercode hat sie im Allgemeinen nichts verloren.

Variable Kartengrösse ist ein schönes Beispiel für einen Fall, wo man new und delete weder verwenden muss noch sollte.

Und wie sollte man es dann machen? Batzer hat hier nicht explizit nach manueller Speicherverwaltung gefragt.


Für Arrays benutze ich im Grunde immer Pointer.
Sowas mache ich zum Beispiel nie. Und zwar einfach, weil dieses Vorgehen sehr viele Fehlerquellen und Risiken birgt, ohne dass es irgendwelche relevanten Vorteile hätte. Für Arrays kann man Containerklassen verwenden (STL und Boost). Für einzelne Objekte gibt es Smart-Pointer mit den unterschiedlichsten Besitz-Semantiken. Sehr oft ist es ohnehin sinnvoll, direkt den Wert statt einer Indirektion über Zeiger zu haben.

Das "im Grunde" sollte betont sein, denn ich verwende auch die Boost Library. Aber innerhalb der z.B. shared_ptr oder der shared_array Klasse sind Pointer gespeichert, die genauso verwendet werden, als wenn man es selber mit new und delete machen würde. Es bietet halt nur die Sicherheit, dass man nicht vergessen kann delete aufzurufen (+einige weitere kleine Features, versteht sich).


Am Besten ist du probierst einfach aus, was wo am Besten geeignet ist, das kommt mit der Zeit von alleine, weil man recht schnell merkt, wo etwas Sinn macht und wo nicht.
Diesen Eindruck habe ich nicht. Meistens werden einem solche Dinge erst bewusst, wenn man sich ausführlich mit der Thematik beschäftigt und Bücher wie Exceptional C++ liest. Viele C++-Programmierer setzen new und delete nach wie vor leichtsinnig ein. Deswegen gibt es z.B. immer noch etliche Leute mit der Ansicht, in C++ hätte man mit Memory Leaks zu kämpfen, was aber faktisch nicht stimmt.

Also bei mir kam es von alleine, da ich versucht habe es möglichst zu vermeiden, als ich noch nicht wusste, wann man z.B. delete und wann delete[] aufrufen muss. Dadurch habe ich mir immer die Frage gestellt, ob eine Speicherreservierung Sinn macht oder nicht. Nach ein wenig probieren, habe ich dann schnell gemerkt, was geht und was nicht und was Sinn macht oder auch nicht.
Ich weiß es dauert viel zu lange, aber ich habe echt nur Pech. Habe mir heute mal eben im Zeigefinger Nerv und Sehne durchtrennt. Dennoch kann es nicht mehr all zu lange dauern mit dem Tutorial. Außerdem kamen auch noch Prüfungen und dergleichen dazwischen.
Klatscht die Hopper an die Wand, Deutschland ist ein Raverland! :D

79

11.06.2010, 18:27

Und wie sollte man es dann machen? Batzer hat hier nicht explizit nach manueller Speicherverwaltung gefragt.
Container verwenden. Zum Beispiel verschachtelte STL-Container oder Boost.MultiArray.


Das "im Grunde" sollte betont sein, denn ich verwende auch die Boost Library. Aber innerhalb der z.B. shared_ptr oder der shared_array Klasse sind Pointer gespeichert, die genauso verwendet werden, als wenn man es selber mit new und delete machen würde. Es bietet halt nur die Sicherheit, dass man nicht vergessen kann delete aufzurufen (+einige weitere kleine Features, versteht sich).
Ja natürlich, aber genau diese Abstraktion ist der grosse Fortschritt. Du musst dich nicht mehr um Handlangerjobs wie Speicherfreigabe kümmern, sondern kannst dich wichtigen Aufgaben widmen. Was spricht denn dagegen, auf einer höheren Abstraktionsebene zu programmieren und von den daraus entstehenden Vorteilen zu profitieren?


Also bei mir kam es von alleine, da ich versucht habe es möglichst zu vermeiden, als ich noch nicht wusste, wann man z.B. delete und wann delete[] aufrufen muss. Dadurch habe ich mir immer die Frage gestellt, ob eine Speicherreservierung Sinn macht oder nicht. Nach ein wenig probieren, habe ich dann schnell gemerkt, was geht und was nicht und was Sinn macht oder auch nicht.
Bitte nicht falsch verstehen, aber mir scheint, du hättest da auch noch ein wenig Nachholbedarf. Vielleicht hat manuelle Speicherverwaltung bei dir bisher immer irgendwie funktioniert, oder du hast das Potential der Alternativen noch nie voll ausschöpfen können.

Tatsache ist, dass manuelle Speicherverwaltung in vielen Fällen ausschliesslich Nachteile mit sich bringt, für welche C++ eigentlich eine schlagfertige Antwort bereit hätte. Es ist im Übrigen nicht so, dass ich nie manuell Speicher verwalte. Aber wenn ich es tue, kapsle ich es so gut wie möglich und sorge dafür, dass der Anwendercode möglichst frei davon bleibt.

80

18.06.2010, 17:30

Also bevor ich hier wieder gelehrt bekomme, dass Singletons böse sind frag ich lieber :D
Ist es schlimm wenn ich meinen Texturen Manager als Singleton implementiere?
Funktionen wären dann: Load, Unload, GarbageCollector etc.

Und die andere Frage: Ich hae für eine Textur eine Struktur erstellt:

C-/C++-Quelltext

1
2
3
4
5
6
struct LoadedTexture
{
     unsigned int refCounter;
     IDirect3DTexture9* texture,
     std::string filename;
};


kostet es leistung wenn ich die Instanzen der Struktur nicht per "new" erzeuge und dann in die Liste eintrage?
Habe es bis jetzt so gemacht

C-/C++-Quelltext

1
std::list<LoadedTexture> textureList;

und zu der Frage

C-/C++-Quelltext

1
std::list<LoadedTexture*> textureList;

Werbeanzeige