【问题标题】:Optimized way to solve the following解决以下问题的优化方法
【发布时间】:2012-02-03 06:52:17
【问题描述】:

假设我有一个地图坐标 x 和 y 的数据库表。我使用 PIL 获取我想要显示和创建的地图图像。

我创建了一个图像,循环遍历每个地图图块以在其上粘贴背景图像,一切都很好。

现在,图块上可以有 n 个玩家,一个怪物,一个 npc,一个传送门或其他任何东西。 如果图块上有任何对象,我需要粘贴特定图像。

问题:如何检查瓷砖上是否有东西?应该是什么数据库结构?

每个玩家都有位置(FK 到其位置的 MapTile)。如果我查询数据库以找出瓷砖上的任何玩家/怪物/npc 的位置会很痛苦,所以我在每个坐标中添加一个列 objects_count。如果它 > 0,那么我会寻找出现的情况。

然后它看起来像:

if objects_count:
    if query_for_players_exists:
        show player
    elif query_for_monster_exists:
        show monster
    elif query_for_npc...
        show npc
    and so on.

我可以将 M2M 用于具有通用关系的表,但恕我直言,通用关系并没有那么快。 请记住,查询集由 49 个图块组成,我怎样才能轻松找出图块上存在的对象?

【问题讨论】:

    标签: python sql django optimization


    【解决方案1】:

    我首先想到的是以下内容。如果对象的密度不是很高(例如小于 15%,例如,这是可计算的),您可能有包含这些字段的表:x, y, objects。其中objects 可能是腌制数组或列表的其他文本表示形式。磁贴名称列表。

    如果您的地图足够密集,您最好将其拆分为方形不重叠块并将它们保存为对象矩阵(矩阵的大小是恒定的,取决于视口大小)。当然,对象本身也必须序列化为矩阵单元。

    但有一件事是绝对正确的,即您无法获得太多性能“简单”的对象表示。您需要以某种方式打包它们以减少行级操作。

    【讨论】:

      【解决方案2】:

      为什么要为每个图块或每个图块+可能的对象运行查询?运行 1 个查询以返回所有图块的所有对象并逐个图块遍历结果集。

      即使每个图块有 100 个对象和 49 个图块,结果集中也只有 4900 个项目。

      获取数据库行并将结果集存储在某些数据结构中 foreach 瓷砖 if(在 DB 结果集中有图块) 放置平铺中的所有对象

      【讨论】:

      • 这是一个查询。问题是如何获取位于这些图块中的对象。
      • 啊。我误解了伪代码然后意味着您正在运行多个数据库查询。
      猜你喜欢
      • 1970-01-01
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多