こんにちは、私は Python の初心者です。pygame モジュールを使用して、単純な LAN ゲーム (私にとっては単純ではありません) を作成しています。
ここに問題があります - 私は 2 台のコンピューターを持っています (1 台は古い intel Atom ネットブック、もう 1 台は intel i5 NTB)。少なくとも 5 FPS を達成したい (ネットブックは NTB を遅くしていますが、それほどではなく、現在は約 1,5 FPS です)、メインループで recv() 関数を 2 回呼び出すと、それぞれ合計で約 0.5 秒かかります機械。Wi-Fi 信号は強く、ルーターは 300Mbit/s で、約 500 文字の短い文字列を送信します。ご覧のとおり、時間の測定には time.clock() を使用します。
これは、私が通常i5 NTBで実行する「サーバー」コードの一部です。
while 1:
start = time.clock()
messagelen = c.recv(4) #length of the following message (fixed 4 character)
if " " in messagelen:
messagelen = messagelen.replace(" ","")
message = cPickle.loads(c.recv(int(messagelen))) #list of the arrows, other player position and changes in the game map
arrowsmod = message[0]
modtankposan = message[1]
removelistmod = message[2]
for i in removelistmod:
try:
randopos.remove(i)
except ValueError:
randopossv.remove(i)
print time.clock()-start
tosendlist=[]
if len(arrows) == 0: #if there are no arrows it appends only an empty list
tosendlist.append([])
else:
tosendlist.append(arrows)
tosendlist.append([zeltankpos, 360-angle])
if len(removelist) == 0: #if there are no changes of the map it appends only an empty list
tosendlist.append([])
else:
tosendlist.append(removelist)
removelist=[]
tosend=cPickle.dumps(tosendlist)
tosendlen = str(len(tosend))
while len(tosendlen)<4:
tosendlen+=" "
c.sendall(tosendlen) #sends the length to client
c.sendall(tosend) #sends the actual message(dumped list of lists) to client
...something else which takes <0,05 sec on the NTB
「クライアント」ゲーム コードの一部を次に示します (先頭を反転させただけです - 送信/受信部分):
while 1:
tosendlist=[]
if len(arrows) == 0: #if there are no arrows it appends only an empty list
tosendlist.append([])
else:
tosendlist.append(arrows)
tosendlist.append([zeltankpos, 360-angle])
if len(removelist) == 0: #if there are no changes of the map it appends only an empty list
tosendlist.append([])
else:
tosendlist.append(removelist)
removelist=[]
tosend=cPickle.dumps(tosendlist)
tosendlen = str(len(tosend))
while len(tosendlen)<4:
tosendlen+=" "
s.sendall(tosendlen) #sends the length to server
s.sendall(tosend) #sends the actual message(dumped list of lists) to server
start = time.clock()
messagelen = s.recv(4) #length of the following message (fixed 4 character)
if " " in messagelen:
messagelen = messagelen.replace(" ","")
message = cPickle.loads(s.recv(int(messagelen))) #list of the arrows, other player position and changes in the game map
arrowsmod = message[0]
modtankposan = message[1]
removelistmod = message[2]
for i in removelistmod:
try:
randopos.remove(i)
except ValueError:
randopossv.remove(i)
print time.clock()-start
... rest which takes on the old netbook <0,17 sec
i5 NTB の 1 台のマシン (ソケット モジュールなし) でシングル プレイヤー バージョンのゲームを実行すると、マップの左上隅に 50 FPS、右下隅に 25 FPS が表示されます (1000x1000 ピクセル マップ)。には 5x5 ピクセルの正方形が含まれています。座標が大きいために速度が遅いと思いますが、それほど信じられません.ところで、マップの右下隅で LAN ゲームとして実行されている間の受信には、ほぼ同じ時間がかかります) Atom ネットブックには 4 ~ 8 FPS があります。
では、なぜこんなに遅いのか教えてください。コンピューターは同期されていません。一方は高速で、もう一方は低速ですが、互いに待機しているわけではありません。最大 0.17 秒の遅延になりますよね? さらに、長い recv 呼び出しは、より高速なコンピューターでのみ行われますか? また、送信/受信機能がどのように機能するか正確にはわかりません。受信に0.5秒かかるのに、送信に文字通り時間がかからないのは奇妙です。プログラムの残りの部分が先に進んでいる間に、sendall がバックグラウンドで送信しようとしている可能性があります。