sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Por qué PyGame se congela cuando se usa en combinación con PyMongo?

La excepción específica que está encontrando parece estar relacionada con su conexión mongo. ¿Puedes conectarte a tu base de datos en MongDB Compass?

En cualquier caso, su arquitectura actual hará que su bucle de juego dependa de las escrituras de la base de datos, lo que podría llevar mucho tiempo.

Creé un ejemplo que usa un hilo separado para administrar la conexión MongoDB y se comunica con el hilo principal usando una cola. Este ejemplo también incluye la velocidad de fotogramas en la barra de título y limita el bucle del juego a sesenta FPS. Si agrega eso a su secuencia de comandos existente, debería ver que la velocidad de fotogramas cae cada vez que se inserta una base de datos.

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()