私は 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)
}}
^申し訳ありませんが、これは完全に混乱したものです。これは今のところ一時的なコードです。それもほんの数パケットで、そのコードの下でより多くを処理しますが、それらはすべてそれらに似ています。