玩家位置以哪种变量类型存储在MMORPG(例如WoW)上?


18

我什至听说J. Carmack很快就谈到了...

在如此巨大的世界中,软件如何能够如此精确地跟踪玩家的位置,而无需在区域之间加载,并且可以在多玩家规模上进行跟踪?数据通过网络代码时如何格式化?

我可以理解顶点是如何存储在图形卡的内存中的,但是当涉及到同步多人游戏时,我无法想象什么是最好的。

Answers:


26

斯科特·比拉斯(Scott Bilas)从事《地牢围攻》并撰写了论文《地牢围攻的连续世界》。虽然Dungeon Siege不是MMO,但它确实有世界,他在论文中谈到球员的位置。我发现这是一本好书。这是相关的部分:

精度问题

从一开始,工程团队就知道连续世界将对引擎和内容设计产生重大影响,而核心问题是数值稳定性。想象一下,有两个角色走在相距两米的编队中,向东离开原点。在某个点上,彼此之间的距离被与原点的距离所淹没,并且这些字符看起来像是“在同一位置”。

使用浮点运算,您离原点越远,您失去的精度就越高,这可能导致各种麻烦的问题。事情无法正确进行,相邻网格之间出现裂缝,空间开始量化,猫狗开始生活在一起。Dungeon Siege在单精度模式下使用FPU具有明显的性能优势,并与视频硬件的固有精度相匹配。但是,即使我们提高了精度,它最终也将永远无法解决问题,因为这个世界计划并最终变得非常大。

精度问题意味着不可能像大多数其他游戏一样拥有统一的世界坐标空间。相反,解决方案是将连续世界分割成一组独立的坐标空间,并定期在它们之间切换以重置精度。在这些限制条件下尝试了各种想法,我们最终决定使用标准门户网站系统的变体。

我们的解决方案由基于关系节点的坐标系统组成,其中几何的每个块(围攻节点)都有自己的坐标空间,并通过与相邻对象共享的门在空间上链接到相邻的几何对象。由门连接的节点的排列形成代表整个世界地图的连续图形。随着时间的推移,该节点系统从最初保持FPU精度的目标演变为有效细分空间的主要方法,以及无数次优化的根本。

为了封装相对于特定节点的3D位置的概念,传统(x,y,z)向量必须增加一个节点ID(x,y,z,node)并代表与原点的偏移量而不是特定节点。该4元组被封装为Siege节点位置或SiegePos。稍后,我们添加了SiegeRot(四元数,节点),以便处理节点之间方向之间的比较。

“没有世界空间”一词成为车队的口头禅,尽管从字面上看,每个人都花了数年时间才能完全理解其含义。

您可以在此处查看有关《地牢围攻》的更多论文


这似乎是一个非常好的答案!谢谢 !我想知道今天的游戏是否会像gmp的整数那样使用四舍五入的数字。
10

3

对于巨大的无区域世界,我要么选择双精度顶点,要么使用浮点数较小的块来划分陆地。

每个块都有自己的坐标系。当您跨过这些块中的每一个时,您都会将所有内容转换为该坐标系。无论如何,这就是他们在飞行模拟游戏中的做法。

如果您的区域很小,我想浮动就足够了。


双精度会迅速带来巨大的性能和内存优势。(x,y,z,zone)是16个字节;(x,y,z)的倍数至少为24。您无法对其进行快速数学运算,也无法在图形卡上使用它们。

好吧,费米卡可以使用双精度;)但是,是的,无论如何,答案都暗示了分块的方法。
Nailer

2

我会说实际位置是3个浮点数的向量。但是也会有一个与玩家相关的区域索引。(但不是位置的一部分,因为该区域服务器处理的所有内容都在同一区域中,因此不需要在同一数据结构中。)

请记住,至少有四个区域。四大洲。我认为其中任何一个都不超过一侧约10公里。例如,博客在最新扩展之前已将整个可旅行区域计算为41平方英里。所有战场,所有实例,每个都有各自的区域,并协调空间。

使用LUA API,您可以获得播放器的位置GetPlayerMapPosition()返回两个浮点数,每个浮点数在整个世界地图上的比例为0到1。


1

对于WoW,我希望他们使用简单的float x / y / z-但相对于特定的“区域”

这将有助于处理“活动区域”,例如船和齐柏林飞艇


1

通常是Wow,Tibia等在线游戏。存储玩家pos。在SQl播放器元表中使用三个变量X + Y +Z。Runescape在不使用Z的情况下执行此操作-这样,播放器始终呈现在地面网格的顶部。


什么是元表?我真的怀疑它将存储在数据库中,需要实时使用...
jokoon 2012年

(1)在这种情况下,元表是具有基本字符数据的DB表,例如。性别,职位xyz,健康状况,银行现金等,以及其他可能的信息。(2)我一直在托管开放的Tibia服务器,在其中播放器pos存储在服务器缓存中。但是...每30秒钟就有一个服务器保存在上,并且玩家的POS将被添加到玩家的元数据中。因此,如果服务器关闭/崩溃,则玩家位置将返回到数据库位置:)
Mikolaj Marcisz 2012年

-2

浮子?好吧,一个3D游戏的数组包含3个浮动元素。至少对于我们来说,我们以英尺为单位,因此您所需要的只是3-4个小数位,以确保浮动噪声不成问题。如果一个大区域的一侧只有一英里或两英里,那么就不那么重要了。至于MMO中的透明分区,这完全是另一个问题。在MMO中​​解决难题的宏伟计划中,存储位置在列表上非常低。


在开发过程中,某些大型STO区域中存在浮点精度问题。我不知道他们怎么了。它可能不是头等大事,但确实需要尽早考虑才能真正达到水平。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.