У меня есть класс 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}')
Сначала я подумал о том, чтобы иметь список всех игроков, и всякий раз, когда что-либо случается с игроком:
- Я проверяю, увеличился или уменьшился его счет.
- найдите его в списке
- переместите его, пока его счет не окажется в правильном месте.
Но это было бы очень медленно. Могут быть сотни тысяч игроков, а игрок может reset собственный счет до 0
, что означало бы, что мне придется переместить всех за ним в стек. Даже найти игрока будет O (n).
То, что я ищу, - это высокопроизводительное решение. Использование ОЗУ не так важно, хотя здравый смысл следует использовать. Как я могу улучшить систему намного быстрее?
Обновленная информация: Я храню данные игрока в базе данных MySQL с SQLAlchemy каждый раз, когда он покидает сервер игр, и я загружаю его каждый раз, когда он присоединяется к серверу. Они обрабатываются через события '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