0

我正在开发这款名为“堡垒”的游戏,位于http://www.joemajewski.com/fortress。无论如何,它是基于浏览器的角色扮演游戏之一,玩家可以在其中建立一支军队并升级他们的统计数据以在排行榜上获得高排名。

每 30 分钟就会执行一个 cron 作业,这会进行一些更新。它循环遍历游戏的每个玩家(随着更多人加入,随着时间的推移自然会继续上升),并更新某些统计数据。它给每个人额外的一回合,根据他们的收入、食物、木材、铜、铁等给他们金币,而且它会更新他们的排名。

我知道,这都是胡说八道,但重点是每个玩家都有自己的更新查询。我只用三个成员为脚本计时:

mysql_query() 函数的执行时间为更新注释掉:~ 3.5 ms

mysql_query() 函数正常工作的执行时间:~ 14 ms

很明显,一旦游戏拥有 100 多个注册会员,更新查询将导致我的 cron 工作变得非常缓慢。我希望在游戏发布后的两周内有 100 名活跃玩家,但许多玩家创建了多个帐户,所以我预计几周后至少会有 200 名会员。有 200 个更新查询,加上对成员进行排序和计算排名的额外时间,运行 cron 作业可能需要 2 秒以上。

我问你的问题。有没有更快的方法来做这样的事情?我尝试分别在循环之前和之后添加“START TRANSACTION”和“COMMIT”查询,但很难用 3 个成员来衡量速度。事务会使脚本变得更好还是更糟?有没有其他办法解决这个问题?任何帮助,将不胜感激。

非常感谢您花时间听取我的请求。

4

3 回答 3

4

根据问题中有限的细节,听起来您可能能够在一个查询或几个查询中完成所有播放器更新,而不是单独遍历所有这些。

考虑添加回合,并根据公式更新他们的黄金,所有这些都在一个影响整个表格的查询中完成。

即作为基本的过度简化:

update Players set turns = turns + 1,
                   gold  = (gold + (income * 100) + (wood * 25) + (copper * 25))

这有帮助吗?

至于排名,你现在是怎么计算的?

于 2010-07-30T16:23:34.617 回答
1

我的建议是创建一个测试环境。然后用数千行用户数据填充该测试环境。对于要放入多少数据的想法,我使用((What You Expect) + (What You Hope For)) * 2. 因此,如果您期望 100 个用户,并希望(现实的希望)获得 5000 个,那么您应该测试至少 10200 个用户...

所以创建大型数据库,并尽量做到现实,但不要在这上面花费太多精力。一旦你在那里,一次尝试你的查询。优化每一个。query1, sleep 50ms, query2, sleep 100ms, query3, query4, sleep 100ms, etc然后构建一个简单的 PHP 脚本以在不同的延迟 ( )下执行多个查询。然后使用ab(Apache Bench)之类的工具同时执行该脚本并在数据库中查找问题(请记住,这里的任务是对数据库施加压力,因此如果没有压力,请继续推动直到压力)。

于 2010-07-30T16:30:43.043 回答
0

你做错了。

每当有人访问用户资源数据时计算资源量。当没有人访问它们时,您不需要计算这些数据。

存储上次计算数据的时间 (lt)。

现在的资源量是:r2=r+dr*(now-lt) 其中
dr - 现在的资源更改时间 - 现在的时间 lt - 最后一次 r 保存到数据库的时间。r - 存储在数据库中的资源量 r2 - 现在的资源量

您甚至不需要每次都更新表,只需从数据库中读取 r、dr、lt,现在计算 r2。

这样做,您将获得实时数量的资源,而您没有玉米工作。

于 2010-07-30T16:38:10.373 回答