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

1

12.11.2010, 18:49

Einige Fragen

Guten Abend zusammen,

vorab ich habe schon einige Browsergames programmiert, daher weiß ich auch wie umfangreich ein 2D Game ist.
Ich habe bereits ein PHP Socket Server aufgesetzt der die Bewegung von den Spielern handelt.
Als Client verwende ich derzeit Javascript mit Flashsocketsupport und anzeigen lasse ich das ganze über das HTML Canvas Element und Tiles.

Jetzt zur eigentlichen Frage, ich nehme an, dass PHP nicht so performant ist wie C++, oder?
Daher wäre ich auch bereit den Server in C++ zu schreiben. Was wären die Vorteile/Nachteile gegenüber PHP?


Meine zweite Frage ist, wie ich Kollisionen überprüfe. Derzeit hat der Spieler eine X und Y Koordinate.
Objekte hätten die ebenfalls die X und Y Koordinate.
Wie speichere ich nun diese Map am besten?

Als Bsp.:
Spieler ist auf Position 10, 10. Tilebreite 10 und Höhe 10. Er nimmt also optisch den Pixelbereich von 10,10 bis 20,20 ein.
Ein Objekt befindet sich auf Position 25,20 (5 Pixel rechts vom Spieler), hat eine Breite von 20 und eine Höhe von 20, also optisch 25,20 bis 45,40

Müsste ich jetzt in meinem Karten Array die Pixel von 25,20 bis 45,40 als "blocked" markieren? Oder gibt es da eine bessere Methode?


Bisher mache ich es so, dass alle Spieler die aktuelle Position der Spieler erhalten, wenn eine größere Map existiert ist das natürlich nichtmehr performant genug.
Wie macht das Spiel World of Warcraft das? Es gibt dort ja "nahtlose" Übergänge in den einzelnen Zonen und man sieht nur die Spieler / NPCs die in der Nähe sind.

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

2

12.11.2010, 20:09

PHP ist nicht annähernd so schnell wie es C++ sein kann. Das liegt allein schon daran, dass PHP eine interpretersprache ist, C++ wird kompiliert. In den C++ compilern steckt viel wissen und arbeit, weshalb sie heutzutage extrem gut optimieren können. PHP interpretiert standardmäßig immer wieder neu und hat deshalb auch garkeine zeit sich dabei jedesmal gedanken zu machen, was irgendwelche optimierungen angeht.

Allerdings weiß ich nicht, ob C++ als backend eines browsergames so das wahre ist. Ich behaupte mal 90% aller browsergames verwenden dafür PHP, die performance sollte normalerweise ausreichend sein, wenn du halbwegs vernünftig codest.

Da du nach Vor-/Nachteilen gegenüber PHP fragst, nehme ich mal an, dass du bisher noch nicht mit C++ programmiert hast. Daher meine Frage: Hast du bereits mal in einer anderen Sprache als PHP programmiert? Wenn nicht, wird der umstieg auf C++... aufwändig. Meiner Meinung nach ist der aber auch nicht nötig. PHP bringt sozusagen schon alle werkzeuge mit, was du für so ein browsergame-backend benötigst. Bei C++ stehst du da mit leeren Händen da, oder musst dir zumindest erstmal eine bibliothek suchen, die dir diese werkzeuge bereitstellt (z.B. zugriff auf eine datenbank).

Gibt es denn bereits einen wirklichen Performance-engpass, oder willst du einfach nur so zu C++ wechseln, weils halt schneller wäre?

Was das übertragen der Spielerpositionen angeht: dann schickst du halt nur die positionen der spieler, die in der nähe sind... wo ist da dein problem?

3

12.11.2010, 20:24

PHP ist nicht annähernd so schnell wie es C++ sein kann. Das liegt allein schon daran, dass PHP eine interpretersprache ist, C++ wird kompiliert. In den C++ compilern steckt viel wissen und arbeit, weshalb sie heutzutage extrem gut optimieren können. PHP interpretiert standardmäßig immer wieder neu und hat deshalb auch garkeine zeit sich dabei jedesmal gedanken zu machen, was irgendwelche optimierungen angeht.

Allerdings weiß ich nicht, ob C++ als backend eines browsergames so das wahre ist. Ich behaupte mal 90% aller browsergames verwenden dafür PHP, die performance sollte normalerweise ausreichend sein, wenn du halbwegs vernünftig codest.

Da du nach Vor-/Nachteilen gegenüber PHP fragst, nehme ich mal an, dass du bisher noch nicht mit C++ programmiert hast. Daher meine Frage: Hast du bereits mal in einer anderen Sprache als PHP programmiert? Wenn nicht, wird der umstieg auf C++... aufwändig. Meiner Meinung nach ist der aber auch nicht nötig. PHP bringt sozusagen schon alle werkzeuge mit, was du für so ein browsergame-backend benötigst. Bei C++ stehst du da mit leeren Händen da, oder musst dir zumindest erstmal eine bibliothek suchen, die dir diese werkzeuge bereitstellt (z.B. zugriff auf eine datenbank).

Gibt es denn bereits einen wirklichen Performance-engpass, oder willst du einfach nur so zu C++ wechseln, weils halt schneller wäre?

Was das übertragen der Spielerpositionen angeht: dann schickst du halt nur die positionen der spieler, die in der nähe sind... wo ist da dein problem?
Richtig, die meisten Browsergames werden ich PHP geschrieben. Ich möchte aber ein Socket basiertes Game schreiben. Der Client ist nur ein Browser, das ist aber uninteressant.

Ich denke mal, dass C++ 50 Spieler und mehr gleichzeitig besser handeln kann als ein PHP Socketserver, oder etwa nicht?

Die Frage stelle ich mir lieber vorher, ob es einen Performance-Engpass geben könnte, nicht nachdem ich alles fertig habe.

Und zu der Spielerposition, woher weiß ich denn, wer in der Nähe ist?
Bsp.: Spieler 1 befindet sich auf 50,50 Spieler 2 auf 35,35 und Spieler 3 auf 10,10.
Spieler 1 möchte aber nur alle Spieler die sich in einer Range von 20 befinden.

Ich müsste praktisch zwei for Schleifen nehmen, mit jeweils 40 Dürchgänge, was in der Summe 1600 Durchgänge wären.
Weil ich alles prüfen muss, was sich zwischen 30,30 bis 70,70 befindet (20 Range von 50,50 aus).

Habe ich da gerade ne absolute Denkblockade?

4

12.11.2010, 20:29

Na und?

1600 Schleifendurchgänge sind ja noch nich wirklich viel. Du musst eher sehn, was du bei einem Schleifendurchgang machst und in deinem Fall geht es nur darum zwei Zahlen zu vergleichen, das ist ja verhältnismäßig nicht sooo zeitaufwendig. Aber warum gehst du dann nicht die Spieler durch und schaust welche sich im sichtbaren Ausschnitt befinden?



Gruß
SaRu_

5

12.11.2010, 20:32

Die Spieler durchzugehen wäre natürlich die performantere Möglichkeit.
Gibt es da nicht noch performantere Möglichkeiten?

Ich kann mir kaum vorstellen, dass WoW das genauso macht.
Angenommen 500 Spieler sind online, und diese Fragen an welche von den 500 Spielern in Ihrem Bereich sind, währen das 250000 Durchläufe.

6

12.11.2010, 20:38

Ja ich bin mal davon ausgegangen, dass dein Spiel natürlich keine mehrere tausend Spieler hat, sonst ist das natürlich nicht umbedingt die günstigste Variante.

Also zum einen würd ich ma vorschlagen du schaust dir kleinere Online-Spiele an. WoW als Vorbild bzw. Orientierung zu nehmen ist meist nicht besonders gut. (im Hobby-Entwickler-Bereich)
Aber ich denke mal nicht, dass es bei WoW eine Liste / ein Array gibt AlleSpielerAufDemServer[] die dann auch noch alle Informationen zu jedem einzelnen Spieler bereithält.

Du kannst deine Spielwelt ja in Bereich (Instanzen) einteilen. Aber ich denke wirklich nur den sichtbaren Ausschnitt zu betrachten ist die gängige Methode.

Gruß
SaRu_

7

12.11.2010, 20:43

Ja ich bin mal davon ausgegangen, dass dein Spiel natürlich keine mehrere tausend Spieler hat, sonst ist das natürlich nicht umbedingt die günstigste Variante.

Also zum einen würd ich ma vorschlagen du schaust dir kleinere Online-Spiele an. WoW als Vorbild bzw. Orientierung zu nehmen ist meist nicht besonders gut. (im Hobby-Entwickler-Bereich)
Aber ich denke mal nicht, dass es bei WoW eine Liste / ein Array gibt AlleSpielerAufDemServer[] die dann auch noch alle Informationen zu jedem einzelnen Spieler bereithält.

Du kannst deine Spielwelt ja in Bereich (Instanzen) einteilen. Aber ich denke wirklich nur den sichtbaren Ausschnitt zu betrachten ist die gängige Methode.

Gruß
SaRu_

Ja ist schon richtig, dass ich mir WoW nicht als Vorbild nehmen sollte, es hat mich nur nebenbei auch interessiert wie die das gelöst haben könnten.

Ich werde die Lösung mit den Spielern durchgehen nehmen.


Und wie löse ich das mit den Objekten am besten?

Wird denn ein spürbarer Unterschied zwischen C++ und PHP als Backend bei 100 Spielern zu merken sein?

8

12.11.2010, 20:52

Naja also genau sagen kann ich dir dazu nichts, hab ich noch nicht ausprobiert.

Aber die Latenz für den Netzwerkverkehr sollte annährend gleich sein, wenns auf dem gleichen Server läuft. Die potentielle Zeitersparnis müsste also großteilig in der Bearbeitung der Daten liegen. Wenn der Quellcode von der Theorie her der gleiche ist, dann sollte auch hier kein Unterschied sein. Was dann bleibt ist nach meiner Vermutung der Unterschied zwischen C++ und PHP in Bezug auf z.B. Speicherzugriff etc. Ich könnte mir Vorstellen das Listen in C++ eventuell schneller durchlaufen werden können als ein Array in PHP. Ob das allerdings ins Gewicht fällt ist eine ganz andere Sache. Wenn du ja z.B. eh nur ein paar Spieler hast (im zwei oder von mir aus auch dreistelligen Bereich) dann weiß ich nicht ob sich die geringe Anzahl schon merklich auf die Geschwindigkeit auswirkt. Das sind zumindest so meine Überlegungen...


Gruß
SaRu_

9

12.11.2010, 20:57

OK, dann danke erstmal dafür.

Wie würdest du das mit den Objekten (Wände, Bäume etc.) lösen?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

12.11.2010, 20:58

Wird denn ein spürbarer Unterschied zwischen C++ und PHP als Backend bei 100 Spielern zu merken sein?

das kann man pauschal nicht sagen. das ist abhängig vom spiel. ein spiel wie WoW benötigt viel mehr berechnung als ein browsergame wie ogame z.b.
ich glaube nicht, dass dein erstes spiel von so vielen spielern genutzt wird. du stellst fragen die mich das vermuten lassen. die entwicklung eines größeres spiels dauert jahre. ich hab die erfahrung gemacht, dass man selbst nach einem jahr programmiererfahrung noch so große schritte macht, dass man innerhalb von einem weiteren jahr große teile des codes ersetzen muss.
hast du schon tetris, snake oder ähnliches geschrieben?
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige