我对编写游戏服务器没有什么疑问,希望有人能从实践中获得经验,并会对我有所帮助.
我正在开发使用python的Flash游戏(MMO头像游戏)服务器.这是我第一次使用Twisted,也是第一次编写游戏服务器,并且对服务器设计和Twisted实现几乎没有疑问.
>是否有人有实践经验或关于“游戏服务器情况”下的扭曲表现的一些案例研究(彼此交谈,与房间中的每个人交谈,走路等.-虚拟人物在每个房间中按50个分组.还有其他动作,但这是最常见的).可以处理多少个用户扭曲? (确实期望每台服务器有1万名用户)
> Epoll反应堆?这是MMO游戏服务器的好选择吗?
>如何建立服务器监控和管理?如果我想断开某些用户的连接,或者在服务器已经运行时采取任何措施?解决方案之一是在Memcache服务器中从Protocol和Factory中写入数据,然后在Web界面中进行处理和显示,但这是一种通信方式,而且很“昂贵”,我并非总是需要此信息.
有什么好的方法来构建用于监视和管理的“控制台”?我在网上搜索,但是没有找到任何示例或文字,这是我的主意:
创建具有一个工厂和两个协议的服务器?一种用于游戏的协议,一种用于管理协议. (一个工厂协议监听端口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的性能吗?有没有更好的解决方案,主张?正如我所说的,我在编写游戏服务器(任何类型的服务器)方面是一个全新的人,因此我需要有关组织和设计的帮助.
解决方法:
twisted.conch.manhole
是监视/管理的一种可能性.最终,您可能会需要许多用于不同用途的控制接口.不要害怕在另一个端口上设置Web服务器,在另一个端口上设置IRC服务器,也许是SMTP客户端,以便在一天结束时通过电子邮件将统计信息发送给您-这就是Twisted的重点.您将主要为连接数而不是服务数付费.
在首次尝试负载测试并确认它太慢之前,请不要担心性能,您可能会发现当前设置足以满足您的需求.如果不是,请尝试将UDP用于播放器通信的某些方面(例如位置),以及用于播放器聊天的消息队列.第二人生写了overview of some popular message queue implementations.
祝好运.