level

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

Beitrag von Macros »

Im Codearchiv ist irgendwo ein Code
um Linkedlists zu Speichern.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ihr habt meinen Code wohl nicht durchgelesen oder einfach nicht
verstanden. Ein kleines einfaches Beispiel:

Da man in seinem Spiel ja meist mehr als nur eine Art Boden benutzt,
würde ich dazu raten die verschiedenen Böden in einer einheitlichen
Struktur verpackt in eine LinkedList zu lesen.
Jetzt gibt es das Field-Array, das die einzelnen Tiles beinhaltet. Dieses
Array speichert aber pro Feld nur den Pointer zu einem Element der
Boden-LinkedList, also 4 Byte, trotzdem liegen dann alle Daten zu dieser
Art Boden vor und man kann direkt damit arbeiten. Wenn man jetzt in der
Boden-LinkedList eine Art Boden verändert, z.B. das man darauf
langsamer laufen kann o.ä., dann wird das sofort auf jedes Feld im Field-
Array vererbt, weil diese neue Eigenschaft ja nur einmal im Speicher ist
und nur der Pointer im Field-Array darauf weist.
Und da es nicht nur verschiedene Böden, sondern auch Häuser, Gewässer
und was weiß ich noch alles gibt, habe ich dafür auch eine Beispielstruktur
entworfen und alles in der Field-Struktur in eine StructureUnion
geschrieben.

Und langsam ist das keineswegs, höchstens schneller, einfacher,
Speicherplatzschonender, usw.
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

NicTheQuick hat geschrieben:Und langsam ist das keineswegs, höchstens schneller, einfacher,
Speicherplatzschonender, usw.
Du hast noch genial vergessen ;)
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Wenn man die Anzahl der der Böden, Gewässer, Häuser usw. kennt kann man auch mit Arrays arbeiten.

Ist noch Speicherplatzschonender da man hier keine interene Struktur mit Pointer bräuchte, für eine Linkedliste <) . Und wenns sogar noch sehr viele von diesen Elementen gibt, dürfte das Laden und Freigeben vielleicht sogar merklich schneller ablaufen.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Das mit der LL ist wirklich ein gutes Beispiel. Der Zugriff ist doch auch besser als mit Arrays. :allright:
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

Sry ich habe deinen Code wirklich nicht richtig gelesen er ist tatsächlich genial (Solange man nicht von Java kommt. Da sind Pointer böse ) :twisted:
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Batze hat geschrieben:Das mit der LL ist wirklich ein gutes Beispiel. Der Zugriff ist doch auch besser als mit Arrays. :allright:
Öhm, wenn mit hilfe von Pointer auf ein Element einer LinkedListe zugreift gibt es keinen unterschied zu einem Array.

Bei LinkedListen muss man sogar zudem entweder die PB interne Struktur von LinkedListen auslesen um den Pointer zum nächsten Element aus zu lesen oder die PB-Befehle verwenden. Bei Arrays geschieht das natürlich ganz einfach in dem man einen anderen Index eines Elementes angibt.

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Ok, dann ist die Methode eben genial. :wink: :mrgreen:

Das geniale daran ist meiner Meinung nach die Unabhängigkeit des Field-
Array von den eigentlichen Tile-Daten. Eine Änderung und alles ist getan.
Schwierig wirds natürlich, wenn ein Tile den Typ Boden hat und trotzdem
anders sein soll wie alle anderen, aber deswegen habe ich noch die
Speziell-Struktur eingebaut. Vielleicht braucht man die aber auch gar
nicht.

Natürlich könnte man die Böden und so auch in ein Array schreiben, aber
dort kann man nicht mal eben ein Element aus der Mitte rauslöschen,
ohne dass dieser Speicherbereich dann unbenutzt bleibt oder die
Restlichen nachrücken und somit die Pointer im Field-Array auf das
falsche zeigen. Die Elemente einer LinkedList haben ihren Speicherbereich
und rücken nicht von der Stelle, egal was mit den anderen Elementen ist.
Also LinkedLists sind mir dafür einfach lieber. Und ein "MaxElements"-
Variable für eine Liste muss man sich auch nicht merken, wohl aber bei
einem Array. Ich arbeite eben gerne mit wenigen Variablen, aber vielen
Strukturen und Pointern. Gefällt vielleicht nicht jedem, finde ich allerdings
sehr praktisch. :allright:

@PVM:
Du brauchst bei dieser Methode garantiert nicht herausfinden, wo das
nächste Element in einer LinkedList ist. Die LinkedList wird lediglich dazu
verwendet dynamisch Speicher reservieren zu können und gleichzeitig
noch schön in einer Liste alle Böden sortiert zu haben zum schnellen
Finden oder Manipulieren.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

@PVM:
Du brauchst bei dieser Methode garantiert nicht herausfinden, wo das
nächste Element in einer LinkedList ist. Die LinkedList wird lediglich dazu
verwendet dynamisch Speicher reservieren zu können und gleichzeitig
noch schön in einer Liste alle Böden sortiert zu haben zum schnellen
Finden oder Manipulieren.
^^ich fühl micht jetzt einfach mal angesprochen :mrgreen:

Beim freigeben des Speichers bzw löschen der Elemente schon, oder wenn man die Objekte warum auch immer durchlaufen, z.B. wegen einer Animation, um das aktuelle Sprite zu verändern.

Ob Array oder LinkedListe kommt im Endeffekt auf das Spiel drauf an bzw der Verwendung der Objekte der Liste. Wenn man während des Spiels Elemente löschen muss ist eine LinkedListe besser.
Wäre es aber notwendig eine "Liste" von solchen Objekten bei jedem Frame komplet durch zu arbeiten wäre ein Array ab einer bestimmten Menge für die Optimierung unumgänglich.
Und wenn beides der Fall ist kommt es wohl auf die maximale Anzahl der möglichen Elemente und den dadurch verursachten Rechenaufwand an.

Aja, mir ist aufgefallen das ich auch immer mehr Pointer und Strukturen verwende. Könnte aber auch an den aktuellen Projekten liegen :lol:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
diGGa
Beiträge: 249
Registriert: 01.04.2005 11:00
Kontaktdaten:

Beitrag von diGGa »

mag mir vielleicht jemand in kurzen worten die vorteile und den nutzen von pointern erklären? aus der hilfe werd ich nicht schlau... aber ich bin ja auch lange nicht soweit das ich mich als fortgeschritten bezeichnen würde xD
Antworten