【问题标题】:Sending game state only for entities that are "visible"?仅为“可见”的实体发送游戏状态?
【发布时间】:2021-05-18 10:45:50
【问题描述】:

假设我有一个支持多个玩家的开放世界游戏。
游戏通过 X 和 Y 存储他们在这个世界中的位置。
此外,玩游戏的任何人都可以看到 11x11 的画布,他的玩家自己在此屏幕上显示,始终居中。
游戏世界有 1000x1000 个方格,可以使用按键行走。

我所知道的是:

  • 我可以在玩家行走时发出事件,
  • 在服务器端检查此事件数据(看是否可行,速度是否正确/防作弊措施),
  • 更新包含所有玩家和位置的游戏状态,
  • 从服务器重新发出此状态,以便每个客户端都能正确渲染此新播放器。

问题是,我真的应该更新一个甚至没有被发现的人吗?
当每个人都在四处走动、移动物品、赚取等级等时——这些事件是从客户端发出的,这没关系,但考虑到服务器端,它会为每个更新状态重新发出这些事件,而且,也许那个会超载吗?

此外,发送整个游戏状态,即使它没有被渲染,也会导致许多违规行为,这让我认为还有另一种选择。

我是网络和游戏开发的初学者,这让我很难想到 - 所以我决定试着把它变成一个问题。这样,也许有人阅读了我的想法,我可能会得到一些澄清。也许我只是想错了。

【问题讨论】:

    标签: sockets networking server state game-development


    【解决方案1】:

    问:我真的应该更新一个甚至没有被发现的人吗?

    没有必要。

    MMORPG游戏在服务器端的正常做法是循环处理网络包和其他一些计算,比如技能施放等玩家的连接。

    服务器的中心可能如下所示

    void run()
    {
        while (true)
        {
            processNetwork();
            processSkills();
            processMoves();
            ...
        }
    }
    
    

    循环每秒会运行几次,比如每秒 20 帧就足够了,因为玩家感觉不到小帧,他们认为自己移动/播放流畅,但事实并非如此。

    对于你的问题,玩家只需要看到一些小区域,当他移动时,服务器会将他的位置广播给该区域的其他人和下一帧他所在区域的玩家。

    这只是最简单的模型,实际模型会更复杂,我们会将游戏的不同功能分离到不同的服务器上,如聊天服务器、战斗服务器、拍卖服务器等。

    【讨论】:

    • 有趣。因此,不是更新状态并为每次更新发出它,我将有一个循环来保存这个更新的状态并在某个循环中为那些玩家发出它,并且只有他们应该实际收到的关于他们的区域的信息。谢啦。真的帮了大忙。很高兴看到有人用不同的词谈论它。服务器架构让我很吃惊,以后我可能会深入尝试一下。
    • 该架构适用于WOW等MMORPG游戏,成熟。所以我认为这可以帮助你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2016-01-25
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2021-05-17
    相关资源
    最近更新 更多