MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Warum friert PyGame ein, wenn es in Kombination mit PyMongo verwendet wird?

Die spezifische Ausnahme, auf die Sie stoßen, scheint sich auf Ihre Mongo-Verbindung zu beziehen. Können Sie in MongDB Compass eine Verbindung zu Ihrer Datenbank herstellen?

In jedem Fall wird Ihre aktuelle Architektur Ihre Spielschleife von den Datenbankschreibvorgängen abhängig machen, was viel Zeit in Anspruch nehmen kann.

Ich habe ein Beispiel erstellt, das einen separaten Thread zum Verwalten der MongoDB-Verbindung verwendet und über eine Warteschlange mit dem Haupt-Thread kommuniziert. Dieses Beispiel enthält auch die Bildrate in der Titelleiste und begrenzt die Spielschleife auf sechzig FPS. Wenn Sie dies zu Ihrem vorhandenen Skript hinzufügen, sollten Sie sehen, dass die Bildrate abfällt, wenn eine Datenbankeinfügung erfolgt.

import time
import threading
import queue
import pygame
import pymongo

# Thread for Database storage
class MongoThread(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue
        self.daemon = True

    def run(self):
        t_running = True
        client = pymongo.MongoClient("mongodb+srv://<insert-your-connection-string-here>")
        db = client.test
        c = db.scores
        while t_running:
            if self.queue.empty():
                time.sleep(0.1)
                pass
            else:
                data = self.queue.get()
                if data == "exit":
                    t_running = False
                else:
                    # do something with the queud data
                    c.insert_one(data)
                    print(c.count_documents({}))  # for debugging


WIDTH, HEIGHT = 1000, 400
FPS = 60

# create a queue to send commands from the main thread
q = queue.Queue()
# create and then start the thread
mongo_thread = MongoThread(q) 
mongo_thread.start()

pygame.init()
win = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
run = True
score = 0
while run:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            run = False
            q.put("exit")
        if e.type == pygame.KEYDOWN:
            # c.insert_one({"Score": score})
            q.put({"Score": score})

    score += 1
    win.fill((0, 0, 0))
    pygame.display.update()
    pygame.display.set_caption(f"FPS: {clock.get_fps():.1f}")
    clock.tick(FPS)
pygame.quit()