支持: 0 | 反对: 0 | 打印 | 推荐 | 订阅 | 收藏
标题: 纯技术贴:关于如何让资源每时每刻都在增长的研究结果
赵烨
准骑士
Rank: 18Rank: 18Rank: 18Rank: 18


UID 39181
精华 1
积分 988
帖子 8
威望 2
现金 3532 银币
金币 0 金币
阅读权限 40
注册 2007-7-29
来自 北京
状态 离线
发表于 2007-7-29 09:28  资料  个人空间  短消息  添加 赵烨 为MSN好友 通过MSN和 赵烨 交谈 QQ

纯技术贴:关于如何让资源每时每刻都在增长的研究结果


前面看到有位仁兄在问如何让资源每时每刻都在增长,最近我也在研究这个问题

有个想法,不过实现起来也许很难,我一直在找这条路的实现方法。
给大家说一下我的思路(c#)
将资源缓存到CACHE里,通过IIS嵌入式编程,将程序写成service,循环更新CACHE里的数据,页面只要用ajax即时获取CACHE里的数据就可以了。

还有一个方法是没办法的办法。(SQLSERVER适用)
资源生产基本都是以小时为单位,比如1小时能生产500金币,我们可以在数据库里加一个表,记录的就是每个玩家一小时能生产多少资源。技能的升级只要改这个表。
写一个作业,每分钟定时去UPDATE资源。
比如:
update resource set resource.food = resource.food + resource_per_hour.food/60 from resource_per_hour where resource.user_code = resource_per_hour.user_code
(UPDATE不能写别名,弱弱的BS一下微软)
SQLSERVER2005 + VS2005 可以实现更新数据库的同时更新CACHE,页面用ajax即时获取CACHE里的数据。
不用怀疑这种方式的执行效率,我在自己的电脑上UPDATE 1万条记录的时间是1秒左右,在服务器上执行的时间是毫秒级,所以效率还是不错的,不过这种方式的误差比较大
比如我在10分59秒的时候升级完了建筑或技能,食物每小时的生产量会立即发生变化。
但是前59秒的出产量仍旧是原来的,用这种方式做更新会让前59秒的出产按照新的更新。
个人感觉第一种方式实现起来太难,不过也不是完全没办法,我还在研究怎样去实现,研究出来再跟大家一起分享


本帖最近评分记录
今夜没得疯   2007-8-2 01:15  现金  +100   很好
顶部
q810105 (血雨)
勋爵
Rank: 40Rank: 40Rank: 40Rank: 40Rank: 40


UID 36040
精华 7
积分 7636
帖子 167
威望 14
现金 4713 银币
金币 0 金币
阅读权限 60
注册 2007-7-11
状态 离线
发表于 2007-7-29 11:13  资料  个人空间  短消息 

按我们策划的思想里,这只是一个简单的公式:A(变量)+B(常数)=C(最后值)
由于WEBGAME的编程思路我没去了解,所以不知道。哈哈~~~~何况纯技术帖子咱还真看不懂!呵呵~~
为奋斗在技术第一线的兄弟们致敬!
沙发~~~~~~~~~~~~~~~``````

顶部
[广告] 把自己写进最经典的角色扮演游戏中去,这就是同人版魔法门7!(第二版)
risingdragon
骑士
Rank: 24Rank: 24Rank: 24



UID 37719
精华 1
积分 2046
帖子 66
威望 2
现金 3891 银币
金币 0 金币
阅读权限 50
注册 2007-7-20
状态 离线
发表于 2007-7-29 13:19  资料  个人空间  短消息 

不需要每时每刻增长,只要按周期结算就可以了
海盗世纪是15分钟涨一次
travian是每分钟涨一次
比如travian的结构是
资源表
村庄 资源 当前值 小时产量
然后建个job,每分钟执行一次
update 资源表 set 当前值=当前值+小时产量/60;
就行了

顶部
[广告] 绿豆蛙四格漫画填字活动
flymagic
游戏官方特派
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68



UID 22434
精华 2
积分 4246
帖子 189
威望 3
现金 15542 银币
金币 50 金币
阅读权限 100
注册 2007-4-20
状态 离线
发表于 2007-7-29 19:42  资料  个人空间  短消息  添加 flymagic 为MSN好友 通过MSN和 flymagic 交谈

仔细观察一下这些游戏的结算方式,就会发现他们是怎么做的。
OGAME每分每秒都在刷新资源,这是根据玩家访问网页的时候进行的刷新。WEB服务器会在SESSION和数据库中记录玩家最后一次访问的时间,也就是最后一次刷新资源的时间(为什么在SESSION中记录,下面会有说明)。比如说最后一次访问时间是10分钟之前,那么在玩家这次访问网站时,就计算10分钟之内的产量。这样,可以把结算节约成每次访问时结算一次。
许多其它问题也可以得到解决。比如说,如果新建了一个资源设施。比如说金属矿,那么在金属矿建成的那一瞬间,先结算一次,这样就可以避免发生新旧产量冲突的问题。在OGAME的环境中,这种操作几乎不费什么时间。想想看,金属矿、晶体矿、太阳能一共能升多少级?玩家在整个游戏过程中,1个星球能执行这种操作的次数根他要访问这个星球页面的次数比起来要少得多。同样,战斗中资源的夺取也是如此。
这样你会说,玩家在每访问一次网页的时候,都要更新一次数据库,这样不是很浪费资源吗?其实不然,根据各方面的分析,这样的结算是最节约资源的,而且又最能保证及时性。因为它有两点长处,第一,只有在线的人才消耗服务器资源。第二、不一定玩家每次访问时都要访问数据库。可以在SESSION中计算当前的产量,然后返回给用户,只有当用户执行消耗资源的操作时,比如说新建建筑或是舰队时才进行一次结算。换句话说,在“骗”用户。但是用户永远不会知道其中的运作方式。因为当他实际要“用”的时候,服务器总会根据数据库中的数据才计算正确的值(这也是防止异地登陆所必须处理的手段,因为只有数据库中的数据才是可靠的!)。

[ 本帖最后由 flymagic 于 2007-7-29 20:04 编辑 ]

顶部
flymagic
游戏官方特派
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68



UID 22434
精华 2
积分 4246
帖子 189
威望 3
现金 15542 银币
金币 50 金币
阅读权限 100
注册 2007-4-20
状态 离线
发表于 2007-7-29 20:08  资料  个人空间  短消息  添加 flymagic 为MSN好友 通过MSN和 flymagic 交谈

顺便一说,travian才真正是在骗用户。它的确会在一定时间内访问一下服务器,以得到一些信息(比如说战斗信息之类),不过,它的资源结算好像是在客户端用Javascript算出来的(具体不清楚,因为没办法搞到源码)。因为我记得有一次,我的电脑断网了,travian的资源仍然还在每分钟增长……-_-
不过记得不太清楚了。如果哪位师兄有空,可以拨掉网线去试一试。

顶部
[广告] 论坛投票锁帖系统(主题帖投票)启用,会员可以控制帖子的关闭与否
tonger
版主
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68


UID 2435
精华 0
积分 4150
帖子 86
威望 0
现金 17912 银币
金币 0 金币
阅读权限 120
注册 2006-9-21
状态 离线
发表于 2007-7-30 10:05  资料  个人空间  短消息 

确实是用js是表现出来的。真正的计算是在操作中进行。

顶部
[广告] 论坛投票锁帖系统(主题帖投票)启用,会员可以控制帖子的关闭与否
risingnox
老兵
Rank: 9Rank: 9



UID 36542
精华 0
积分 236
帖子 34
威望 0
现金 2548 银币
金币 0 金币
阅读权限 30
注册 2007-7-14
状态 离线
发表于 2007-7-31 20:05  资料  个人空间  短消息 

travian完全是由js计算后反馈给用户的,而服务端上是自己有运算的动作。

分而制之,这样可以最大限度的减少对服务器的压力。

顶部
[广告] 那啥,不回老家结婚的就来DOTA吧!
risingnox
老兵
Rank: 9Rank: 9



UID 36542
精华 0
积分 236
帖子 34
威望 0
现金 2548 银币
金币 0 金币
阅读权限 30
注册 2007-7-14
状态 离线
发表于 2007-7-31 20:06  资料  个人空间  短消息 

服务器这一块可以用一个定时执行的小程序来完成更新的动作。

顶部
risingnox
老兵
Rank: 9Rank: 9



UID 36542
精华 0
积分 236
帖子 34
威望 0
现金 2548 银币
金币 0 金币
阅读权限 30
注册 2007-7-14
状态 离线
发表于 2007-7-31 20:12  资料  个人空间  短消息 



QUOTE:
原帖由 flymagic 于 2007-7-29 19:42 发表
仔细观察一下这些游戏的结算方式,就会发现他们是怎么做的。
OGAME每分每秒都在刷新资源,这是根据玩家访问网页的时候进行的刷新。WEB服务器会在SESSION和数据库中记录玩家最后一次访问的时间,也就是最后一次 ...

我在这里发表一些我的个人看法,基于每个用户而更新数据库,对带宽以及数据库的压力都比较大,试想一下有1000个人在线,100个人同时刷新页面,你需要更新多少次数据库?
我看不如直接由服务端运行一个小程序自动刷新来得更现实一点。

顶部
flymagic
游戏官方特派
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68



UID 22434
精华 2
积分 4246
帖子 189
威望 3
现金 15542 银币
金币 50 金币
阅读权限 100
注册 2007-4-20
状态 离线
发表于 2007-8-1 00:01  资料  个人空间  短消息  添加 flymagic 为MSN好友 通过MSN和 flymagic 交谈

1000人在线并不一定1000人都会同时去点击网站。
试想一下,你玩WEBGAME时,点击网页的频率有多高?一般是在进入游戏的时候,点选几个需要建设的东西,然后几乎要等很久才会点另一次。在SESSION中进行计算,实际消耗时才进行更新,这算是最折中的办法了。
可惜看不到OGAME的源码,不然就可以知道他使用的是什么策略。
至少现在的WEBGAME不会在后台进行刷新。

顶部
[广告] 把自己写进最经典的角色扮演游戏中去,这就是同人版魔法门7!(第二版)
risingnox
老兵
Rank: 9Rank: 9



UID 36542
精华 0
积分 236
帖子 34
威望 0
现金 2548 银币
金币 0 金币
阅读权限 30
注册 2007-7-14
状态 离线
发表于 2007-8-1 08:01  资料  个人空间  短消息 

关键问题就在一个实时问题上,我说的并没有1000人同时刷新,而是1/10的人刷新,那样数据库和带宽的压力会比较大,除非是有足够的带宽和过硬的服务器可以忽略这个问题。试想一下执行100条update语句每条更新一条数据快呢?还是执行一条update更新100条数据甚至是1000条数据的效率高呢? 1+1>2

刷新网页的时候,只有读取数据库的动作,比更新数据库快很多。

顶部
[广告] 把自己写进最经典的角色扮演游戏中去,这就是同人版魔法门7!(第二版)
risingdragon
骑士
Rank: 24Rank: 24Rank: 24



UID 37719
精华 1
积分 2046
帖子 66
威望 2
现金 3891 银币
金币 0 金币
阅读权限 50
注册 2007-7-20
状态 离线
发表于 2007-8-1 08:58  资料  个人空间  短消息 

我赞成服务器端计算,客户端读取的方案
服务器每分钟执行一次update
比用户刷新一次就update一次
对服务器的压力要小多了吧

顶部
[广告] 那啥,不回老家结婚的就来DOTA吧!
alp
游戏官方特派
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68



UID 18496
精华 0
积分 13994
帖子 2053
威望 0
现金 24275 银币
金币 1 金币
阅读权限 100
注册 2007-3-25
状态 离线
发表于 2007-8-1 09:05  资料  个人空间  短消息  QQ

根本不需要不停刷新,用2楼的公式。只要在发生资源消耗的时候刷新

顶部
[广告] 把自己写进最经典的角色扮演游戏中去,这就是同人版魔法门7!(第二版)
risingnox
老兵
Rank: 9Rank: 9



UID 36542
精华 0
积分 236
帖子 34
威望 0
现金 2548 银币
金币 0 金币
阅读权限 30
注册 2007-7-14
状态 离线
发表于 2007-8-1 10:28  资料  个人空间  短消息 

那你怎么让资源数实时的显示出来呢?

顶部
[广告] 把自己写进最经典的角色扮演游戏中去,这就是同人版魔法门7!(第二版)
alp
游戏官方特派
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68



UID 18496
精华 0
积分 13994
帖子 2053
威望 0
现金 24275 银币
金币 1 金币
阅读权限 100
注册 2007-3-25
状态 离线
发表于 2007-8-1 10:39  资料  个人空间  短消息  QQ

显示简单啊 资源=某时候点的资源数+产量*(现在的时间-某时刻点)*系数

顶部
[广告] 那啥,不回老家结婚的就来DOTA吧!
risingnox
老兵
Rank: 9Rank: 9



UID 36542
精华 0
积分 236
帖子 34
威望 0
现金 2548 银币
金币 0 金币
阅读权限 30
注册 2007-7-14
状态 离线
发表于 2007-8-1 12:41  资料  个人空间  短消息 

呵,这就各显神通。

用使用资源的时候再更新的话,需要考虑的就是双方数据同步的问题了。另外,万一一级资源田升级之后,你能够准确的加上这么多的资源吗?否则你按照最新的量来算,人家就多了一点资源了,这算BUG吗?

所以说实时这个问题很重要。

顶部
[广告] web棋牌市 6.16内测开启
alp
游戏官方特派
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68



UID 18496
精华 0
积分 13994
帖子 2053
威望 0
现金 24275 银币
金币 1 金币
阅读权限 100
注册 2007-3-25
状态 离线
发表于 2007-8-1 12:53  资料  个人空间  短消息  QQ

你仔细想想,并没有你所说的问题。有问题的是点了升级田后关闭浏览器直到升级完后再登录游戏,那么系统是按照老的产量给资源还是升级后新的产量给资源,不过这个问题也很好解决,取2个时间段分别给就是了。
实时给的话,要是服务器突然挂了资源就不长了,哪个WG是这样的。。。维护时照长嘛

[ 本帖最后由 alp 于 2007-8-1 12:55 编辑 ]

顶部
[广告] 绿豆蛙四格漫画填字活动
risingnox
老兵
Rank: 9Rank: 9



UID 36542
精华 0
积分 236
帖子 34
威望 0
现金 2548 银币
金币 0 金币
阅读权限 30
注册 2007-7-14
状态 离线
发表于 2007-8-1 14:02  资料  个人空间  短消息 

举个夸张一点的例子吧:
我现在某资源每小时60单位,我现在开始升级这个资源,升级后会有600个单位每小时,假设我现在升级完之后这个资源数为0,升级所需要时间为1小时,我在2小时后登录查看资源数或者说再升级某资源(使用资源),现在为全资源应该是多少?

按正常的情况应该为0+60+600=660单位,按你的算法,就变成了:0+600+600=1200

如果再按时间段来算的话,还是会继续增加数据库的压力。

至于你说的实时给维护阶段不能加资源,这也不是没办法解决,你之前的方法都有办法离线算出资源数,这点应该不会有问题吧?当然也有例外,比如:一个人升级某资源了,但是刚升完,服务器就维护了,当到了升级完成的时间后的某时间,资源会按新的资源量来给了。这样的话,会有一些误差,只是不知道能不能够接受。

顶部
[广告] 把自己写进最经典的角色扮演游戏中去,这就是同人版魔法门7!(第二版)
alp
游戏官方特派
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68



UID 18496
精华 0
积分 13994
帖子 2053
威望 0
现金 24275 银币
金币 1 金币
阅读权限 100
注册 2007-3-25
状态 离线
发表于 2007-8-1 14:16  资料  个人空间  短消息  QQ

你举的例子,就是我说的那个存在的问题嘛。分两个时间段分开给不会增加数据库压力,跟数据库一点关系都没有(多加几行代码罢了)。不知道您对这个问题有没有实际操作过(写过代码),没那么复杂的嘛。

顶部
[广告] 绿豆蛙四格漫画填字活动
risingdragon
骑士
Rank: 24Rank: 24Rank: 24



UID 37719
精华 1
积分 2046
帖子 66
威望 2
现金 3891 银币
金币 0 金币
阅读权限 50
注册 2007-7-20
状态 离线
发表于 2007-8-1 14:17  资料  个人空间  短消息 

维护也不要紧
资源表
村庄 资源 当前值 小时产量 结算时刻
周期执行
update 资源表 set 当前值=当前值+小时产量/(SYSDATE-结算时刻)/24,结算时刻=SYSDATE;
就行了

[ 本帖最后由 risingdragon 于 2007-8-1 14:30 编辑 ]

顶部
[广告] 那啥,不回老家结婚的就来DOTA吧!
 



当前时区 GMT+8, 现在时间是 2008-10-12 20:25
沪ICP备06036464号

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.5.0 Licensed  © 2001-2007 Comsenz Inc.
Processed in 0.081433 second(s), 12 queries , Gzip enabled

清除 Cookies - 联系我们 - Chinese Webgame BBS 中国网页游戏论坛 - Archiver - WAP