- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
全部-
所以我需要存储与视频游戏中的对象关联的 3D 位置(x、y、z)。
我很好奇,这是个糟糕的主意吗?位置生成非常频繁,并且可能会有所不同。
我基本上只想将位置存储在我的数据库中,如果它不在已存储位置的一码范围内的话。
我基本上是在游戏中选择对象的现有位置(通过 object_id、object_type、continent 和 game_version),循环遍历,并使用 PHP 计算距离。如果它 > 1,我会插入它。
现在我有大约 700 万行(显然不是针对同一个对象),这效率不高而且我正在使用的服务器正在爬行。
有没有人对我如何更好地存储这些信息有任何想法?我更希望它以某种方式在 MySQL 中。
表格结构如下:
object_id
object_type (like unit or game object)
x
y
z
continent (an object can be on more than one continent)
game_version (positions can vary based on the game version)
以后需要访问数据的时候,基本上只通过object_id、object_type、continent、game_version来查询(所以我对这4个都有索引)
谢谢!乔希
最佳答案
大概认为不同大陆上的物体相距无限远。此外,您还没有透露您在表格中使用的单位。我假设英寸(一码有 36 英寸)。
因此,在插入点之前,您需要确定您是否在院子内。为此,您将需要 MySQL geo extension(您可以阅读相关内容)或至少在 x 和 y 列上以及可能在 z 列上的单独索引。
一码之内有没有点?此查询将让您了解新点周围 +/- 一码的边界框内是否有任何点。一个或多个的“附近”结果意味着您不应插入新点。
SELECT COUNT(*) nearby
FROM table t
WHERE t.x between (?xpos - 36) AND (?xpos + 36)
AND t.y between (?ypos - 36) AND (?ypos + 36)
AND t.z between (?zpos - 36) AND (?zpos + 36)
AND t.continent = ?cpos
如果您需要查询使用笛卡尔距离而不是边界框,您可以添加平方和距离计算。但我怀疑边界框对您的应用程序来说工作得很好,并且比在您的应用程序中重复获取 75 行结果集来进行邻近测试要高效得多。
从概念上讲,为 MySQL 创建一个存储过程并不会更难,该存储过程只有在满足邻近条件时才会有条件地插入新行。这样一来,您将拥有一个简单的单向交易,而不是来回服务器。
关于mysql - 在 MySQL 中存储数百万个 3D 坐标——坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12902068/
3-d 中的点由 (x,y,z) 定义。任意两点 (X,Y,Z) 和 (x,y,z) 之间的距离 d 为 d= Sqrt[(X-x)^2 + (Y-y)^2 + (Z-z)^2]。现在一个文件中有一百
我是一名优秀的程序员,十分优秀!