我正在用 Python 编写一个游戏服务器,并使用 Faucet Networking 插件在 Game Maker 中编写一个游戏客户端(尽管这无关紧要)。每次玩家移动时,客户端都会向服务器发送一条UPDATEXY消息,并且客户端中有消息聊天的东西。当有 2 个客户端连接到服务器时,客户端似乎会收到消息超载(进一步进入运行时,聊天消息显得更慢,并且玩家落后于实际其他玩家所在的位置)。我相信这是因为客户端无法以它们流入的速度处理消息,所以我在客户端中实现了一个功能,它将所有消息转储到接收缓冲区中,并忽略它们。这似乎有效,但玩家会猛烈地抽搐。这个问题有什么“干净的解决方法”吗?
顺便说一句,我使用的协议是 TCP。这是 TCP 本身的问题还是我只是用错了?切换到 UDP 有帮助吗?
谢谢。
编辑:请求代码,所以你去服务器:
def sendmsg(msgtype, msg, conn, args=None):
if msgtype == MSG_PLAYER_ASSIGN_ID:
dataload = struct.pack('!hhh', MSG_STARTBYTE, msgtype, msg)
conn.send(dataload)
elif msgtype == MSG_PLAYER_UPDATEXY: #This will only ever be broadcasted
#print("Sending xy from " + str(args['pid']))
dataload = struct.pack('!hhhhh', MSG_STARTBYTE, msgtype, args['pid'], msg[0], msg[1])
conn.send(dataload)
elif msgtype == MSG_ASKFORLIST:
players = msg
for player in players:
if args['pid'] != player.pid and player.dead == False:
dataload = struct.pack('!hhhh' + str(len(str(player.name))) + "s", MSG_STARTBYTE, MSG_PLAYERENTRY, player.pid, len(str(player.name)), player.name.encode())
conn.send(dataload)
loginfo("Sent a player")
^这只是几个包,还有更多,但它们都非常像那些
在这里,你去客户端:
if msgtype == MSG_PLAYER_UPDATEXY
{
if tcp_receive(serversocket, 6){
pidtoupdate = read_short(serversocket)
//show_message(string(pidtoupdate))
if objNewNetProcessor.pid != pidtoupdate
{
xtoupdate = read_short(serversocket)
ytoupdate = read_short(serversocket)
playertoupdate = ds_map_find_value(global.players, string(pidtoupdate))
if playertoupdate != objChar
{
playertoupdate.y = ytoupdate
playertoupdate.x = xtoupdate}
}}}
if msgtype == MSG_CHAT
{
if tcp_receive(serversocket, 4){
fromperson = read_short(objNewNetProcessor.serversocket)
strlen = read_short(objNewNetProcessor.serversocket)
tcp_receive(objNewNetProcessor.serversocket, strlen)
chatmsg = read_string(objNewNetProcessor.serversocket, strlen)
display_chat(fromperson, chatmsg)
}}
^抱歉,这完全是乱码,现在只是临时代码。它也只是几个数据包,它在该代码下面处理更多,尽管它们看起来都相似。