首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网络游戏并发控制

网络游戏并发控制
EN

Stack Overflow用户
提问于 2010-11-09 15:37:52
回答 1查看 445关注 0票数 1

还有其他一些关于并发性的问题,但它们并不能完全解决我的情况。

因此,假设我有一个游戏,用户之间的互动,打架和诸如此类的。在任何给定的时间,玩家都可能参与到与其他玩家的多个交互中,他们都可以看到事件的发生。当其中任何一位玩家访问该站点时,它需要更新所涉及的任何数据,并向用户展示这一点。

例子:玩家A正在和B玩家战斗,在这场战斗中每隔几分钟就会发生一次事件。同时,玩家A也在与玩家C互动,运气不好,两种互动的事件恰好发生在同一秒钟。

当那一秒到来的时候,幸运的是,玩家B和玩家C同时访问这个站点,为了检查他们与玩家A的战斗状态,战斗需要更新关于玩家A的信息,如果我不正确地编码,A的数据可能会被弄乱。

对于这种情况,我有两场比赛,每一场都有不同的解决方案和不同的问题。其中之一使用锁,因此当用户访问站点时,他们在db行上获取一个锁,读取他们成功获得的锁的数据,然后编写更改并释放锁。但有时,由于未知的原因,这一失败和锁永远卡住,用户抱怨,我们必须手动修复它。我的另一个游戏使用守护进程来执行这些事务,使问题(几乎)没有意义,因为只有一个进程进行这些更改。但是玩家仍然可以同时做其他的事情,并且有可能导致同样的问题。

我读过一些关于这方面的不同解决方案的文章,比如乐观或基于时间戳的控制。我想问:

  1. 中哪一个最常用于我的情况,哪个是最容易实现的?
  2. --我的下一个项目是使用Kohana (PHP)及其ORM,所以我的db写默认采用“覆盖所有这些字段”的形式。为此,我需要编写自己的更新查询吗?还是可以获得与ORM兼容的解决方案?
  3. ,涉及多个表的事务怎么办?战斗的结果必须改变战斗表和玩家信息表,可能还有更多的东西。哪种解决方案在这里更容易使用?我的所有表都需要事务时间戳列吗?
  4. 很多这样的解决方案都说,当发生冲突时,要么重试要么忽略。这对我意味着什么?“重试”是否意味着重新启动整个脚本,这会给用户带来额外的加载时间?我不认为忽略是一个有效的选择,因为事件必须在某个时候执行。在我发现的其他问题中,向用户展示冲突错误通常是一个有效的选项--对我来说,不是。
  5. ,并发控制的性能含义是什么--值得吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-09 15:52:50

我认为你正在寻找的东西已经包含在你的问题:交易。如果使用的是MySQL,则需要使用innoDb引擎设置表,以便能够使用事务。一些文件:

  • http://dev.mysql.com/doc/refman/5.1/en/commit.html
  • http://www.php.net/manual/en/pdo.begintransaction.php
  • http://www.php.net/manual/en/mysqli.autocommit.php

如果可能的话,不要试图重新发明轮子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4135475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档