У меня мало вопросов по написанию игрового сервера, я надеюсь, что у кого-то есть опыт из практики, и он мне поможет.
Я занимаюсь разработкой сервера для Flash-игры (MMO avatar game) с использованием Python и Twisted Я впервые использую Twisted, а также впервые пишу игровой сервер, и у меня мало вопросов по поводу дизайна сервера и реализации Twisted.
Есть ли у кого-нибудь практический опыт или какой-либо пример извращенной производительности в «ситуациях игрового сервера» (общение друг с другом, общение со всеми в комнате, на прогулке и т. Д. - аватар сгруппирован по 50 в каждой комнате. также другие действия, но это наиболее распространенные). Сколько скрученных пользователей могут справиться? (Реально ожидать 10K пользователей на сервер)
Реактор Эполла? Это хороший выбор для игрового сервера MMO?
Как построить мониторинг и администрирование сервера? Если я хочу отключить некоторых пользователей или предпринять какие-либо действия, когда сервер уже запущен? Одним из решений является запись данных из Protocol и Factory на сервер memcache, затем обработка и отображение в веб-интерфейсе, но это односторонний обмен данными, и он «дорогой», эта информация мне нужна по запросу, не всегда.
Есть ли хороший способ построить «консоль» для мониторинга и администрирования? Я искал в Интернете, но я не нашел ни одного примера или текста об этом, и вот моя идея:
Создать сервер с одним Factory и двумя протоколами? Один протокол для игры, один для администрации. (один порт фабрики <-> прослушивания протокола 1234, второй фабрика <-> прослушивания протокола 1235). У меня есть вся информация, которая мне нужна на фабрике (количество пользователей, количество активных комнат и т. Д.), А также администратор может легко прочитать эту информацию, потому что у них одна фабрика. Но один завод один протокол, поэтому я сделал несколько изменений:
Две фабрики, два протокола, и одна фабрика передается другой в качестве эталона.
На практике примерно так:
from twisted.internet.protocol import Factory, Protocol
from twisted.protocols import basic
from twisted.internet import reactor
from twisted.application import service, internet
class Game(Protocol):
def connectionMade(self):
self.factory.users.append(self)
def dataReceiver(self, data):
for user in self.factory.users:
user.transport.write(data+"\n")
def connectionLost(self, why):
self.transport.write("You are off: {0}".format(why))
self.factory.users.remove(self)
class GameFactory(Factory):
users = []
protocol = Game
class Admin(basic.LineReceiver):
def lineReceived(self, line):
if line == 'stats':
self.transport.write("{0} users online\n".format(self.factory.stats()))
if line[0:4] == 'kill':
self.factory.kill(int(line[5:6]))
def connectionMade(self):
self.transport.write("hello fanta\n")
class AdminFactory(Factory):
protocol = Admin
def __init__(self, GameFactory):
self.GameFactory = GameFactory
def stats(self):
return len(self.GameFactory.users)
def kill(self, id):
self.GameFactory.users[id].connectionLost('die')
application = service.Application("game")
gf = GameFactory()
internet.TCPServer(1234, gf).setServiceParent(application)
internet.TCPServer(1235, AdminFactory(gf)).setServiceParent(application)
Это хорошее решение? Не влияет на производительность GameFactory? У кого-нибудь есть лучшее решение, предложение? Как я уже сказал, я совершенно новичок в написании игровых серверов (любых типов серверов), поэтому мне нужна помощь по организации и дизайну.