如何使这个PHP / MySQL游戏地图更有效率?

时间:2013-10-10 02:22:19

标签: php mysql game-engine

我目前正在研究基于网格的游戏地图原型。每个“平铺”为24px×24px,脚本在屏幕上绘制出31个基于x的平铺和21个基于平铺的平铺,共计651个平铺。

我遇到的问题是我的脚本运行的方式,它正在为每个页面刷新时绘制的每个单独的tile进行数据库调用,这意味着它正在进行651个数据库调用以检查tile是什么以及坐标的瓷砖。对我来说,这似乎是非常低效的。

x和y坐标存储在会话变量中。当用户单击地图下方的某个方向按钮时,它会相应地偏移相应的坐标并重新绘制地图。

如果我根据我正在使用的逻辑创建一个游戏,并玩数字游戏让我们假设说我有100个玩家在任何时间玩游戏,他们都在浏览地图,我会同时有65,100个数据库调用。这不利于系统资源。

我在PHP / MySQL编程方面不是一个菜鸟,因为我创建并推出了一些不同的基于浏览器的游戏,但是,这是我第一次尝试生成地图并在其中导航。

可以在此处查看瓷砖地图:

http://fordserver.com/gamemap/

可以在此处找到实际代码:

http://fordserver.com/gamemap/index.txt

有人能推荐一种让这种运行更顺畅的好方法吗?您会注意到,当使用其中一个方向按钮时,游戏可能需要很长时间来生成实际地图,特别是如果您是第一次访问它时。

我已经尝试过考虑使用数组和其他所有内容的不同方法,但实际上,游戏 需要 在我计划的每个单独的磁贴上检查数据库合并功能,以便显示特定用户当前所在的位置,或建筑物等。

我感谢任何帮助。

瑞奇

1 个答案:

答案 0 :(得分:2)

我曾经实现了一个简单的游戏,它也使用了笛卡尔坐标系,并且每个点都有数据库中的数据行。我只是通过以下几行打电话来解决这个问题:

$xCord=34;
$xCord=16;
// Example data


select
    ID,
    tileImage,
    xcord,
    ycord,
    otherStuff
from
    mainLocationTable
where
    abs(xCord-$xCord)<15
    and abs(yCord-$yCord)<15

这将为您提供玩家位置本身两侧的15个牌。如果当然你可以根据自己的需要进行定制,但原理是一样的。如果将x,y笛卡尔坐标存储在数据库中,则可以轻松地从单个查询中提取所需的所有数据并从那里开始。

由于您还将玩家位置的数据存储在会话中,您可以简单地让代码本身在玩家所在的磁贴上进一步检查详细信息 - 或者使用第二次调用来获取更多信息单个地点的详细信息。