発生している特定の例外は、mongo接続に関連しているようです。 MongDB Compassでデータベースに接続できますか?
いずれにせよ、現在のアーキテクチャでは、ゲームループがデータベースの書き込みに依存するため、かなりの時間がかかる可能性があります。
別のスレッドを使用してMongoDB接続を管理し、キューを使用してメインスレッドと通信する例を作成しました。この例では、タイトルバーにフレームレートも含まれており、ゲームループは60FPSに制限されています。これを既存のスクリプトに追加すると、データベースの挿入が発生するたびにフレームレートが低下するはずです。
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()