2009-09-09 56 views
0

这是情况的低谷。我正在用PHP创建一个角色扮演游戏。战斗系统由各种buff和debuff组成。战斗可能需要花费数轮(这是针对AI)。缓存数据与重新计算PHP中的数据

我是两个主意,保证了玩家的数据的正确性(BUFF和DEBUFF到期随着时间的推移,一个+5强度的buff可能只持续1回合)。通过这些用户的数据和变化获取从项目,设备,被动技能他的数据的字符序列初始化我能

1)进入,然后赤身裸体,存储在会话中添加。如果buff存在,我就应用它。如果没有,它就消失了。这样,数据的正确性就可以保证性能的提高......我假设。

2)将整个字符数据存储在会话中,并更新爱好者。当增益激活时,我添加修饰符,如果debuff/buff消失了,我必须记得'回滚'或者清理掉buff中的任何效果。我认为这对数据库不太重要,但是很难确保正确性,因为可能会有这么多不同类型的增益。

所以在

一)数据库的开销 二)作战系统 三)行业惯例对这种情况下的可维护性,

请问上述两种溶液票价方面?还有更多我不知道的事情吗?我正在考虑使用用户模式来实现#2,但是因为网络是无状态的,似乎会增加更多开销。

回答

2

我打算在这里用“既不”,并告诉你我会采取的做法。

我可以假设,因为你的问题,你明明在具有一些体面的交通规划要确保负载下您的应用程序执行。这就是说,你应该记住这里的会议的性质。如果您需要通过添加多个Web服务器来分散负载来集群您的前端,那么PHP的正常基于文件的会话处理变得相对无用,因为您无法确保Web访问者将访问相同的前端服务器所有的时间(当然,你可能可以,但这将是困难的)。如果你存储游戏状态,存储到cookie可能不是最好的选择,因为你可能有超过4Kb的数据。

所以之后,下一步就是在您的会话使用新的处理程序,一般是你的数据库移动到一个中心点。您存储到会话中的任何数据库收益现在都有一个偏移量,因为您仍然需要访问数据库。它可能并不昂贵,但并不理想。基本上,你只是将数据捆绑在一起,并以不同的形式重新写入。

我会在这里遵循的可扩展性模式将最接近你的#1。最初,每次重建BUFF并确保数据的正确性。使用会话来减轻某些表现,但不要大量依赖它们。当你遇到性能问题时,你会有几个选择。按照可能的优先顺序,它们将是:

  • 安装和使用memcached。缓存到会话,而不是缓存到会话!速度更快,性能增益更好。
  • 将数据库和Web服务器分离到不同的服务器上。
  • 当你不断成长,改变你的会话处理器是面向数据库,并添加更多的Web前端
0

字符数据有多广?简单地将角色的所有统计数据和项目存储在会话中是否可行?如果是这样,你可以得到两全其美。

+0

的统计数据是相当庞大的,至少> 30个属性(由玩家最隐藏;只是用于内部计算)。真正的问题是如果我缓存字符数据,当buff/debuff消失时,我必须将“de-init()”应用于缓存数据。而如果我使用解决方案#1并从DB重新计算角色的属性(基于EQ等),我不必去掉一个BUFF。 – Extrakun 2009-09-09 05:12:42

3

我拉克努特指出:“过早的优化是所有罪恶的根源。”

你不知道这个设计决定的实际性能的影响是什么,你在开发过程中是。如果没有实际的数据,就不可能判断这是否会成为未来的瓶颈,否则可能会有其他问题导致您的应用程序比应用程序慢10倍。

措施。测试。使用真实世界的数据。优化。