多人台球游戏物理模拟[关闭]

2024-04-16

我正在构建一款在线多人台球游戏,并且正在努力思考多人物理模拟的最佳方法。我想到了三种可能的方案,每种方案都有自己的优点和缺点,我想听听那些已经实现了类似功能或具有多人在线游戏经验的人的一些意见。

第一个场景:客户端上的物理模拟:击球的玩家依次将击球角度和力量发送到服务器,服务器用这些值更新所有客户端,以便它们可以独立模拟击球。

优点:

  1. 服务器过热程度低

缺点:

  1. 同步问题。无论帧速率如何,客户端都必须进行精确的模拟。 (可以用一些聪明的算法来解决,就像所描述的那样here http://gafferongames.com/game-physics/fix-your-timestep/)
  2. 作弊。玩家可以通过调整物理引擎来作弊。 (可以在击球结束时与其他球员的球位置进行比较时确定。如果桌上只有两名球员(即不引人注目),那么谁是作弊者?)

第二种情况:

在一个(即“主”)客户端(例如,谁进行射击)上进行物理模拟,然后将每个物理步骤广播给其他所有人。

优点:

  1. 同步没有问题。

缺点:

1.服务器过热。每个时间步骤“主”客户端都会将所有球的坐标发送到服务器,并且服务器必须将它们广播给房间中的其他人。 2.“高手”玩家作弊的可能性仍然存在。

第三种情况:物理现象将在服务器上进行模拟。

优势:

  1. 由于模拟是独立于客户端运行的,因此不可能作弊。
  2. 没有同步问题,一次模拟意味着每个人都会看到相同的结果(如果由于网络延迟而不同时发生事件)

缺点:

  1. 服务器超载巨大。服务器不仅必须每秒为每张桌子计算 30/60 次物理数据(可能同时有 100 张桌子),而且还必须向房间中的每个人广播所有坐标。

EDIT一些与我正在制作的游戏类似的游戏,以防有人熟悉他们如何克服这些问题:

http://apps.facebook.com/flash-pool/
http://www.thesnookerclub.com/download.php
http://gamezer.com/billiards/

我认为第三个是最好的。

但是,如果您在将服务器中的所有碰撞和移动发送到客户端之前计算它们(每次碰撞和移动等),那么您可以做得更好,然后客户端只需“执行”它们即可。

如果这样做,每次拍摄只需发送一次信息,这将大大减少网络问题。

正如 JimR 所写,您应该使用速度或运动方程,而不是一步一步进行增量模拟(如龙格库塔方法)

服务器发送给客户端的信息如下所示:

Blackball hit->move from x1,y1 to x2,y2 until time t1
Collision between blackball and ball 6 at time t1
Ball 6 -> move from x3,y3 to x4,y4 until time t3
Blackball -> move from x5,y5 to x6,y6 until time t4
Collision between Ball 6 and Ball 4 at time t3
and so on until nothings move anymore

此外,您可能需要一堆表示不同物理方程的类,并有办法序列化它们以将它们发送到客户端(Java 或 C# 可以轻松序列化对象)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多人台球游戏物理模拟[关闭] 的相关文章

  • 我可以在不使用 system() 命令的情况下用 C 读/写路由表吗?

    我有用 C 编写的代码 我想使用存储在路由表中的 C 代码信息 是否可以 您还可以运行 strace route add 来查看如何route命令执行此操作 在我的系统上 它使用ioctl with SIOCADDRT 稍微搜索一下就会发现
  • 如何使弹丸转弯时带有弧线

    我有一门大炮 可以以抛物线弧线发射子弹 现在 当我发射子弹时 子弹的旋转速度与从大炮中发射时的旋转速度相同 如何使子弹在空气中飞行时沿着弧线旋转 我尝试了以下作为在项目符号上运行的脚本 附件1 public class PointingBe
  • MySQL:从另一台服务器选择

    恐怕我已经知道问题的答案 但我还是会问 当有两台 MySQL 数据库服务器时 我可以访问另一台服务器上存储的数据吗 换句话说 我能以某种方式这样做吗 INSERT INTO table x y z SELECT x y x y FROM o
  • 对等网络应用程序的网络发现

    我希望有两个类 一个服务器类和一个客户端类 服务器类应该接收每个新客户端的 IP 地址和端口号并将它们存储在列表中 它应该为每个客户端提供已连接客户端及其 IP 地址的列表 然后 客户端可以使用 TCP 连接相互通信 问题是客户端不知道服务
  • 如何在 Docker-Compose 中一起使用主机网络和任何其他用户定义的网络?

    我想将 Docker Compose 文件中定义的两个 Docker 容器相互连接 app and db 其中之一 app 也应该连接到host网络 容器应连接到通用的用户定义网络 appnet or default 使用嵌入式DNS来自
  • 设计 EAP-TLS 客户端问候消息

    我正在尝试设计第一个启动 EAP TLS 握手的数据包 这是我的数据包目前的样子 我通过用相应的信息手动填充 C 中的缓冲区来设计 EAP 部分 我使用 OpenSSL 导出的 TLS 部分如图所示在这个问题中 https stackove
  • openMPI/mpich2 不能在多个节点上运行

    我正在尝试在多节点集群上使用 install openMPI 和 mpich2 但在这两种情况下 我在多台计算机上运行时都遇到问题 使用 mpich2 我可以从头节点在特定主机上运行 但是如果我尝试从计算节点到不同节点运行某些内容 我会得到
  • 如何在 Windows 中拦截 DNS 查询

    我正在研究如何在 Windows 中拦截 DNS 查询 以一种不需要将 DLL 注入到每个进程中的方式 并且理想情况下能够根据发出查询的进程做出决策 因此简单的 DNS 代理服务器是不够的 从表面上看 DNS 查询所采用的路径如下所示 某些
  • 自 2012 年以来,WinSock 注册 IO 性能是否有所下降?

    我最近使用 MS 为该 API 提供的稍微可接受的文档编写了基于 WinSock Registered IO RIO 的 UDP 接收 最终的性能非常令人失望 单套接字性能有些稳定 约为每秒 180k 数据包 使用多个 RSS 队列 即多个
  • 客户端使用高端口号

    为什么客户端会结束连接 使用高端口号 临时端口 而应用程序 监听通常较小的端口号 谢谢你的优点 卡蒂克 巴拉古鲁 服务器侦听固定端口号 以便客户端知道连接到哪里 客户端不需要使用固定端口号 因为没有人发起与它们的连接 事实上 如果同一台计算
  • 根据 TCP 的 C++ 函数

    我正在使用 recv 函数 C 来获取有关网络问题的指示 在这种情况下它返回负值 看这里 https www rfc editor org rfc rfc1122 page 100 https www rfc editor org rfc
  • 设备锁定时,互联网音乐播放器无法加载歌曲(打瞌睡模式?)

    我正在构建一个音乐播放器 可以播放互联网上的歌曲 我注意到 通常 当一首歌曲结束并且必须加载另一首歌曲时 应用程序不会播放下一首歌曲 我等啊等 终于决定解锁手机以了解发生了什么 令人惊讶的是 设备解锁后立即开始播放以下歌曲 第一次我以为这只
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • 什么是接口标识符

    我有一台笔记本电脑 使用一个或多个网络适配器连接到我组织的网络 我正在尝试编写一个工具来持续监控每个网络的连接状态和连接质量 然而 我的网络知识有限 术语让我感到困惑 特别是查找所有网络适配器 有人建议我使用命令ifconfig它给了我所谓
  • 除了 iptables 之外还有数据包管理实用程序吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Linux 实用程序 它可以根据一组规则更改网络数据包的有效负载 理想情况下 我会使用
  • Docker DNS 设置

    我尝试使用自定义网络和 dos 设置创建 docker 容器 docker网络创建 driver bridge opt com docker network bridge enable ip masquerade true opt com
  • 为什么 TCP 段中的 SYN 或 FIN 位会占用序列号空间中​​的一个字节?

    我试图理解这种设计背后的基本原理 我浏览了一些 RFC 但没有发现任何明显的东西 这并不是特别微妙 这样 SYN 和 FIN 位本身就可以被确认 因此如果丢失则可以重新发送 例如 如果连接关闭而没有发送更多数据 那么如果 FIN 没有发送任
  • 在 Python 中通过网络发送对象的最佳方式是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我需要通过网络发送对象 我将使用 Twisted 并且我刚刚开始查看它的文档 据我所知 python实现套接字的唯一方式是通过文本 那么我如何使
  • 这个平面射线相交代码正确吗?

    我的 Plane 类有两个字段 public Vector3 Norm normal vector public double Offset signed distance to origin 这是我用于交集的代码 不知道是否正确 我加倍
  • 如何从 Gforth 网站读取原始代码?

    我想要一个像这样的词 read site add n buff max n flag 其中 add n 是站点名称缓冲区 buff max 是应读取 ASCII 文本的缓冲区 n 是读取的字节数 flag如果操作成功则为 true 这在 L

随机推荐

  • 龙卷风错误处理

    我希望能够处理输入错误 URL 时显示的更好的错误E g localhost 8000 AFDADSFDKFADS 我收到一条丑陋的 python 回溯消息 因为抛出了一个ornado web HTTPError 异常 我知道我可以使用正则
  • iOS 9+ 通用链接不适用于 Google 应用

    我工作的公司让我问以下问题 当在其他应用程序 原生 Apple 应用程序 Slack 等 中点击通用链接时 我们的应用程序会打开 但如果在任何 Google 应用程序 环聊 收件箱等 中点击相同链接 则不会直接打开通用链接通过我们的应用程序
  • 在 Visual Studio 2017 中删除垂直虚线缩进线

    我刚刚安装了 Visual Studio 2017 代码编辑器中出现了奇怪的垂直缩进标记 我怎样才能删除它们 附 我禁用了所有扩展 但这没有帮助 下面有一个选项Tools Options Text Editor called Show st
  • mvc3 路由设置为 id, id2 id3

    我有以下区域路线设置 context MapRoute Admin default3 Admin controller action id id2 id3 new action Index context MapRoute Admin de
  • capistrano,:db 角色,它的用途是什么?

    据我所知 卡皮斯特拉诺 db角色仅用于运行迁移 因此 在大多数情况下 它可能不应该实际上是运行数据库的服务器 为什么那里会有 ruby rails 堆栈 或者允许 ssh 登录 它只是您想要实际执行 Rails 迁移的任何服务器 并且只有标
  • 实现移动运动体

    Project 我正在制作一个简单的项目 其中我希望能够制作一个运动体并将其从 x 点移动到 y 点 创建运动体 似乎没有太多直接内容 我一直在关注一些关于实现运动体的不同教程 因为我找不到指定如何正确执行此操作的教程 Problem 这似
  • 如何使用数据列表比较并返回数据

    我是 Haskell 的新手 我正在努力寻找一种使用类成员变量来返回我正在寻找的成员变量的方法 我有这个数据 data Place Place name String north Float east Float rainfall Int
  • 奥尔森 时区 到 windows

    我需要在 Windows 中从奥尔森时区转换时区 使用PHP 我找到了这个http unicode org repos cldr trunk common supplemental windowsZones xml http unicode
  • 用于搜索 Google 云端硬盘的 Google Apps 脚本

    是否可以使用 Google Apps 脚本在 Google 云端硬盘中搜索文档和文件夹 谷歌已经取消了自己的文档 驱动器搜索小工具 因为它似乎依赖于 iGoogle 谷歌企业支持也承认了这一点 谢谢 我想你正在寻找搜索文件 https de
  • Unity使用Invoke在另一个脚本上调用方法

    我有两个脚本 其中一个重新启动场景 另一个是倒计时器 而不是在第一个脚本中调用重新启动场景方法 但是 它没有重新启动 即使没有错误 我也不明白为什么 重新启动场景的第一个脚本 using UnityEngine using UnityEng
  • 在编译时通过 constexpr 或模板函数获取多维 std::array 的大小

    我用的是三维std array 因为大小在编译时已知 但是 我注意到 size 函数不是静态的 因此 constexpr 模板函数无法访问 我已经找到了下面的演示示例 它估计一维的大小std array 然而 这不适用于二维或更多维度 有没
  • C# 中的并发集合

    我正在寻找一种方法来获得并发收集 in C 或者至少是一个支持的集合并发枚举器 现在我得到了InvalidOperationException当我正在迭代的集合发生变化时 我可以深度复制该集合并使用私人副本 但我想知道是否有更好的方法 代码
  • DisplayMemberPath 在 WPF 中不起作用

    我要显示CustomerList CustomerName财产项目ListBox using ItemsSource DisplayMemberPath仅限财产 但它不起作用 我不想使用DataContext或我的问题中的任何其他绑定 请帮
  • 实体框架 6 和集合

    我正在开发我的第一个实体框架应用程序 我正在使用 EF 版本 6 来自 Nuget 和 net 4 0 然而 我在一些对我来说似乎应该非常简单的事情上遇到了一些困难 我在互联网上发现了很多相互矛盾的建议和解决方案 但是在花了几天时间尝试解决
  • Firebase - Firestore - 使用 collection.add() 获取密钥

    我在使用 Firebase 的新 Firestore 时遇到问题 情况 我有一个collection room 我创建房间collection room add room 我正在尝试做的事情 我需要更新一个房间 为此 我使用 collect
  • 示例 urllib3 和 python 中的线程

    我正在尝试在简单线程中使用 urllib3 来获取多个 wiki 页面 该脚本将 为每个线程创建 1 个连接 我不明白为什么 并永远挂起 urllib3 和线程的任何提示 建议或简单示例 import threadpool from url
  • 将多行转换为一行,并以逗号作为分隔符[重复]

    这个问题在这里已经有答案了 如果我发出SELECT username FROM Users我得到这个结果 username Paul John Mary 但我真正需要的是one所有值均以逗号分隔的行 如下所示 Paul John Mary
  • 计算网格上两点之间恰好有“n”个节点的最短路径

    我在网格上定义了以下 3D 表面 pylab inline def muller potential x y use numpy False Muller potential Parameters x float np ndarray or
  • 实体框架 Fluent API 映射简单的一对多关系

    我有两张桌子 文档 Id DocumentTypeId 标题 详细信息 文档类型 ID 名称 描述 DocumentTypeId 是引用 DocumentTypes 表的外键 IE 所有文件都可以应该 有一个分配给它们的类型 我有两节课 p
  • 多人台球游戏物理模拟[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi