假设我有一个地图坐标x和y的数据库表。我获取了我想要显示的内容并使用PIL创建地图图像。
我创建了一个图像,遍历每个地图图块以粘贴背景图像,一切都很好。
现在,瓷砖上可能有n个玩家,一个怪物,一个npc,一个门户或其他任何东西。 如果图块上有任何对象,我需要粘贴特定图像。
问题:如何检查瓷砖上是否有东西? DB结构应该是什么?
每个玩家都有位置(FK到MapTile的位置)。如果我查询DB以找出tile上有任何player / monster / 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用于具有泛型关系的表,但是IMHO泛型关系并不那么快。 请记住,查询集由49个磁贴组成,如何才能轻松找出磁贴上存在的对象?
答案 0 :(得分:0)
我头脑中的第一件事就是以下内容。如果对象的密度不是很高(例如,小于15%,这是可计算的),则可能包含这些字段的表:x, y, objects
。其中objects
可能是腌制数组或列表的其他文本表示形式。磁贴名称列表。
如果您的地图足够密集,您最好将其拆分为方形非重叠块并将其保存为对象的基质(矩阵的大小是常量并取决于视口大小)。当然,对象本身也必须序列化为矩阵单元格。
但有一件事是荒谬的,你无法获得太多表现“对象”的“简单”表现。您需要以某种方式打包它们以减少行级操作。
答案 1 :(得分:0)
为什么要为每个磁贴或每个磁贴+可能的对象运行查询?运行1查询以返回所有切片的所有对象,并按切片遍历结果集。
即使每个瓷砖有100个对象,其中有49个瓷砖,结果集中只有4900个。
fetch database rows and store resultset in some data structure foreach tile if( have tile in DB resultset) place all object from tile