这真的不是一个简单的问题。在最基本的层面上,您可以说网络提供的数据与原始循环的 MoveEnemies 部分提供的数据相同。因此,您可以简单地将循环替换为:
while( user doesn't exit )
check for user input
run AI
send location to server
get locations from server
resolve collisions
draw graphics
play sounds
end while
但是,您需要考虑延迟,因此您真的不想通过调用网络来暂停主循环。为了克服这个问题,经常会看到网络引擎位于第二个线程上,尽可能快地从服务器轮询数据并将对象的新位置放入共享内存空间中:
while(connectedToNetwork)
Read player location
Post player location to server
Read enemy locations from server
Post enemy locations into shared memory
那么你的主循环应该是这样的:
while( user doesn't exit )
check for user input
run AI
read/write shared memory
resolve collisions
draw graphics
play sounds
end while
这种方法的优点是您的游戏循环将尽可能快地运行,但来自服务器的信息只有在完成与服务器之间的完整发布后才会更新。当然,您现在遇到了跨线程共享对象以及随之而来的锁等乐趣的问题。
在服务器端,循环大致相同,每个播放器都有一个连接(通常每个播放器也在一个单独的线程上,因此其中一个的延迟不会影响其他线程)它将运行的每个连接像这样的循环
while (PlayerConnected)
Wait for player to post location
Place new location in shared memory
当客户端机器请求敌人的位置时,服务器会从共享内存块中读取所有其他玩家的位置并将其发回。
这是一个非常简化的概述,还有更多可以提高性能的调整(例如,服务器将敌人的位置发送给客户端而不是客户端请求它们可能是值得的),并且您需要在逻辑上确定确定的位置做出决定(客户端是否决定他被枪杀是因为他有自己的最新位置,还是服务器停止作弊)