我有一個Player
類與score
屬性:如何跟蹤球員的排名?
class Player(game_engine.Player):
def __init__(self, id):
super().__init__(id)
self.score = 0
這個分數增加/減少爲玩家成功/失敗做目標。現在我需要告訴玩家他的軍銜從玩家的東西總額的像
print('Your rank is {0} out of {1}')
首先我想爲所有的球員名單中,每當有什麼事情發生球員:
- 我檢查,如果他的分數增加或減少
- 發現他在列表
- 動他,直到他的得分是在正確的位置
但這會是極其慢。可以有成千上萬的玩家,並且玩家可以將他自己的分數重置爲0
,這意味着我必須將他之後的所有人移動到堆疊中。即使找到球員將是O(n)。
我在尋找的是一款高性能解決方案。儘管應該使用常識,但RAM的使用並不那麼重要。我怎樣才能改善系統速度?
更新信息:每次他離開遊戲服務器時,我都會使用SQLAlchemy將玩家數據存儲到MySQL數據庫中,並且每次他加入服務器時都會加載它。這些通過'player_join'
和'player_leave'
事件處理:
@Event('player_join')
def load_player(id):
"""Load player into the global players dict."""
session = Session()
query = session.query(Player).filter_by(id=id)
players[id] = query.one_or_none() or Player(id=id)
@Event('player_leave')
def save_player(id):
"""Save player into the database."""
session = Session()
session.add(players[id])
session.commit()
而且,玩家的分數是在'player_kill'
事件更新:
@Event('player_kill')
def update_score(id, target_id):
"""Update players' scores upon a kill."""
players[id].score += 2
players[target_id].score -= 2
您使用的數據庫? –
@ r-m-n我在某些數據庫中使用MySQL –
,它可以用DENSE_RANK窗口函數完成,但MySQL不支持這個函數。你可以嘗試這樣的事情http://dukesoftware00.blogspot.ru/2012/11/calculate-denserank-for-mysql.html –