gpt4 book ai didi

Python 服务器和游戏客户端 : Message overload?

转载 作者:可可西里 更新时间:2023-11-01 02:49:35 25 4
gpt4 key购买 nike

我正在用 Python 编写一个游戏服务器,在 Game Maker 中使用 Faucet Networking 插件编写一个游戏客户端(尽管这应该无关紧要)。每次玩家移动时,客户端都会向服务器发送一条UPDATEXY消息,并且在客户端中有一个消息聊天的东西。当有 2 个客户端连接到服务器时,客户端的消息似乎重载了(在运行时,聊天消息看起来更慢,玩家落后于实际其他玩家所在的位置)。我相信这是因为客户端无法以消息流入的速度处理消息,所以我在客户端中实现了一个功能,它只会将所有消息转储到接收缓冲区中,并忽略它们。这似乎行得通,但玩家会猛烈地抽动。这个问题是否有任何“干净的修复”,或者这是我从一开始就做错的基本事情?

顺便说一下,我使用的协议(protocol)是 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)
}}

^抱歉,这完全是一团糟,目前只是临时代码。它也只是几个数据包,它在该代码下面处理更多,尽管它们看起来都与那些相似。

最佳答案

通常这应该工作正常,我怀疑这是高 CPU 负载的问题 - 每秒 60 次更新是相当多的,但是只有两个客户端连接,应该没有那么多的流量要处理。相比之下,Gang Garrison 2 每秒仅使用 30 次更新,但如果使用一台像样的 PC,它可以在服务器上处理 20 名玩家。检查任务管理器中的客户端和服务器 CPU 负载以确保安全,但我不认为这是问题所在。

如果清除客户端上的“积压”让它们 catch ,这可能不是网络速度或服务器的问题,但使用 Wireshark 记录客户端上的流量可能仍然有值(value)。查看是否一切都符合预期(例如,数据包以预期的速率发送和接收,并且时间均匀)。

因为客户端似乎积压了:客户端是尝试在每个步骤中使用尽可能多的消息,还是只在一个服务器步骤中使用消息?如果每个客户端步骤只处理一个服务器步骤,任何不可避免发生的连接中断都会导致您永久滞后,这似乎与您描述的一致。

Russell Borogove 也给了你一个很好的指导,一定要确保在服务器上每个与游戏相关的套接字上禁用 Nagle 的算法(= 启用 tcp_nodelay)。水龙头默认执行此操作。

关于Python 服务器和游戏客户端 : Message overload?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10609261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com