Zdá se, že konkrétní výjimka, se kterou se setkáváte, souvisí s vaším mongo připojením. Můžete se připojit ke své databázi v MongDB Compass?
V každém případě vaše současná architektura učiní vaši herní smyčku závislou na zápisech do databáze, což může trvat značnou dobu.
Vytvořil jsem příklad, který používá samostatné vlákno pro správu připojení MongoDB a komunikuje s hlavním vláknem pomocí fronty. Tento příklad také zahrnuje snímkovou frekvenci v záhlaví a omezuje herní smyčku na šedesát FPS. Pokud to přidáte do svého stávajícího skriptu, měli byste vidět pokles snímkové frekvence při každém vložení databáze.
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()