2016-07-11 4 views
3

Guten Abend (aus Europa).2D Game Engine Wie kann ich Spielobjekte organisieren?

Ich versuche, eine 2D-Spiel-Engine mit Python und Pygame
zu erstellen, die ähnlich mit der Unity 3D funktioniert, aber Sie können nur 2D-Spiele erstellen.
Um mein Problem zu erklären, werde ich Ihnen einige meiner Klassen zeigen, die Sie brauchen, um zu wissen, bevor ich fortfahre .


Ich habe eine Klasse namens Sprite, die meine Objekte im Spiel und die Methode dar, die uns wichtig ist die Methode machen. Diese Methode heißt jedes Bild pro Sekunde und zeichnet das Bild des Sprite-Objekts auf den Bildschirm. Es ruft auch eine andere Methode Update, die Sie überschreiben können und erstellen Sie einige Logik für Ihr Sprite-Objekt (ich nenne es Gehirne: p). Auch ich habe eine Klasse Scene, wo ich alle meine Sprite-Objekte in einer verknüpften Liste speichern.

Um mein Spiel all Objekte meiner Szene zu machen habe ich eine Methode in meiner Szene Klasse mit dem obigen Algorithmus:

#obj is a sprite object. 
#Is been called every frame per second. 
for obj in gameobjects: 
    obj.render() 

Wie Sie sehen dies der einfachste Weg, um all das zu machen, Spielobjekte meiner Szene. Und hier beginnt mein Problem. Wenn wir sagen, dass ich 10.000 Spiele Objekte in der Szene habe, verzögert diese for-Schleife den Rahmen, der Lag-Probleme verursacht.

Eine Lösung, über die ich nachdachte, war, nur die Spielobjekte zu rendern, die ich sehen kann (Spielobjekte, die innerhalb der Fenstergrenzen liegen). Das funktioniert gut aber das Problem ist, dass ich alle Spielobjekte überprüfen müssen, die in meiner Szene in der Fensterauflösung sein und nur sie rendern. Also habe ich so etwas wie diese:

#This method is been called only every time there is a movement 
#action into te game causing all the game objects to change position. 
for obj in all_game_objects: 
    if inside_resolution(obj): 
     render_objects.append(obj) 

#Is been called every frame per second. 
for obj in render_objects: 
    obj.render() 

Wie Sie mich noch die Gameobjects alle überprüfen müssen sehen, damit ich nicht eine Sache Erfolg hat!

Wenn ich meine Spielobjekte irgendwie in eine Datenstruktur wie einen Binärbaum organisieren und einige intelligente Methoden erstellen könnte, die nur die Spielobjekte zurückgeben, die in der Fensterauflösung sind, könnte ich ein schnelles Rendering-System folgen.

Also ist mein ganzes Problem, welche Datenstruktur kann ich verwenden, um meine Spielobjekte zu speichern? Ein Baum wäre sehr schnell aber wie könnte ich wissen, welche Spielobjekte in der Bildschirmauflösung sind, ohne sie alle zu überprüfen?

Aus welchem ​​ein gehört haben, moderne Game-Engines wie unity3d verwenden Bäume zu verschiedenen Bereichen der Szene machen (und Theres, wo die Ansicht Abstand passt in) .Die Sache ist, wie das funktioniert.

Ich hoffe, die Beschreibung meines Problems war genug.
Vielen Dank für Ihre Geduld: p

+0

Quadtrees sind eine relativ gebräuchliche Art, schnell zu bestimmen, welche Objekte sich in bestimmten Teilen des Raums befinden. –

+1

Haben Sie * versucht * 10000 Objekte gerendert und wissen * sicher *, dass die Rendering-Schleife der größte Engpass Ihrer Anwendung ist? Wenn nicht, dann ist dies nur ein weiterer Fall von [vorzeitige Optimierung] (http://c2.com/cgi/wiki?PrematureOptimization). Die meisten Rendering-Bibliotheken sind effizient genug, um 10000 Objekte ohne Probleme zu rendern. Wenn Sie *** absolut * sicher * sind, dass die Rendering-Schleife einen Performance-Engpass verursacht, dann sollten Sie nur andere dazu bringen, sich Zeit zu nehmen, Ihnen zu helfen. – EvilTak

+0

Oh, und Sie könnten sehen, alle Rendering in einem anderen Thread zu tun, wenn es eigentlich der Flaschenhals ist. Die Sache, die Sie getan haben, ist tatsächlich der einfachste Weg, die Leistung zu verbessern * wenn * es das Problem ist. Sie ** müssen ** durch jedes Objekt iterieren und seine Update-Methode trotzdem ausführen, warum also nicht diese kleine Prüfung? Sie könnten den gesamten Rendering-Code in eine "Kamera" oder eine ähnliche Klasse verschieben, und jedes Objekt kann jede Kamera benachrichtigen, wenn sie das Ansichtsfenster verlassen oder betreten hat. Diese Überprüfung wird für jedes Objekt ausgeführt, bevor der Rendervorgang ausgeführt wird. – EvilTak

Antwort

0

Platzieren Sie alle Ihre Objekte in einem zweidimensionalen Raster, wo das Raster Ihre gesamte Szene darstellt.Dann können Sie einfach nur über die auf dem Bildschirm sichtbaren Bilder iterieren. Und die Kollisionserkennung wird jetzt einfacher.

Die Größe der Zellen hängt von Ihnen ab. Probieren Sie verschiedene Größen aus und sehen Sie, welche am besten funktioniert

Verwandte Themen