支持: 0 | 反对: 0 | 打印 | 推荐 | 订阅 | 收藏
标题: 纯技术贴:关于如何让资源每时每刻都在增长的研究结果
alp
游戏官方特派
Rank: 68Rank: 68Rank: 68Rank: 68Rank: 68



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


risingdragon 我觉的你有点钻牛角尖了,真的没必要周期更新资源表的

顶部
[广告] web棋牌市 6.16内测开启
risingdragon
骑士
Rank: 24Rank: 24Rank: 24



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

好吧,这个问题其实没什么技术含量,算法是一样的,就是客户端执行还是服务器端执行而已。
换个别的问题讨论吧

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



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

看各人的需求了,呵,,

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



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

risingnox risingdragon
我这才发现不是同一个人啊

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



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



QUOTE:
原帖由 risingnox 于 2007-8-1 08:01 发表
关键问题就在一个实时问题上,我说的并没有1000人同时刷新,而是1/10的人刷新,那样数据库和带宽的压力会比较大,除非是有足够的带宽和过硬的服务器可以忽略这个问题。试想一下执行100条update语句每条更新一条 ...

  简直莫名其妙!

  想想看,如果策略是服务器每分钟刷新一次资源,那么,游戏是没办实现资源的实时更新的。既然在这样的环境下,通过用户访问来更新资源,也可以实行1分钟更新一次的策略。在SESSION中记录用户最后一次访问的时间,如果下次访问超过1分钟,则更新一次资源,如果没有越过,则不执行更新。这样,达到的效果和利用服务器循环更新是一样的。但是它的优点在于,只有在线的人才占用服务器资源。

  服务器端循环更新所需要的代价是按注册人数的数量增长的!与用在服务器端用循环更新的策略相比,每分钟会节约多少带宽和资源!!

  换句话说,如果需要即时更新资源,服务器循环更新是无法实现的(除非你有超级服务器,每几秒钟能循环一次),但是,如果不需要即时更新,比如说1分钟-几分钟更新一次,那么,使用按访问更新还是要节约许多资源。所以,无论在任何的情况下,服务器循环更新都是不可取的!

顶部
[广告] web棋牌市 6.16内测开启
risingdragon
骑士
Rank: 24Rank: 24Rank: 24



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

flymagic好像不太清楚
即使在服务器更新,也和人数没有太大关系
并不是说有1000人就循环update1000次,有2000人就得update2000次
不管你多少人,都是一条update命令就搞定
因此2000人和1000区别不大,就算有10000人,和1000人的区别也在毫秒级
但点击时临时计算比服务器定时更新,可能在数据上会精确一点。

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



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



QUOTE:
原帖由 risingdragon 于 2007-8-1 21:59 发表
flymagic好像不太清楚
即使在服务器更新,也和人数没有太大关系
并不是说有1000人就循环update1000次,有2000人就得update2000次
不管你多少人,都是一条update命令就搞定
因此2000人和1000区别不大,就算有 ...

呵,和我的想法一样,也就是所谓的1+1>2,当然这里我们仅仅是在讨论,如果有人觉得我们的方法不好,那另劈蹊径也不是不好,只是希望可能用得到的人有所启发,问题是人来解决的,呵。

如果觉得有更好的办法,讲出来大家一同研究一下,希望对各位都能够有启发。


目前我也在搞一个webgame,刚开始,不过现在有点迷茫,不知道做这个游戏最终结果要怎么样,一个人搞策划真的很累。

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



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

假如1分钟update一次,你的注册用户有10万,那每分钟都要去更新10万条数据,不可想像。虽然是一条update就可以了,我也没去测过需要多少时间,但我觉的效率高不了。

顶部
[广告] web棋牌市 6.16内测开启
risingnox
老兵
Rank: 9Rank: 9



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

一条update语句更新10万的速度,绝对比你执行500次update一条记录的速度快,呵。

这个我也没有具体的数据来测,不过效率方面应该不会差太多。

再说如果能够做到10万用户的话,估计可以换好点的服务器了,哈,纯属玩笑。

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



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

但是用客户端计算的方法,一条update语句都不用
掉过头说,就算有10万注册,一般在线也就2000多人
那么也能解决
资源表
村庄 资源 当前值 小时产量 结算时刻 是否在线
周期执行
UPDATE 资源表 SET 当前值=当前值+小时产量/(SYSDATE-结算时刻)/24,结算时刻=SYSDATE WHERE 是否在线=TRUE;
总之,两种方法都可以,看程序员个人偏好了。

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



UID 36795
精华 0
积分 158
帖子 19
威望 0
现金 2163 银币
金币 0 金币
阅读权限 30
注册 2007-7-16
状态 离线
发表于 2007-8-2 03:52  资料  个人空间  短消息 

试问一个问题..
怎么用1条update语句更新10万条数据???
例如更新每个玩家的资料..

顶部
[广告] 本月CWG有才贴---侦探火狼,孽缘曝光全解析
risingnox
老兵
Rank: 9Rank: 9



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



QUOTE:
原帖由 wkavenger 于 2007-8-2 03:52 发表
试问一个问题..
怎么用1条update语句更新10万条数据???
例如更新每个玩家的资料..

这个找一下数据库的相关资料吧,呵,做肯定能够做到,不过语句超长……如果用存储过程或者触发器来做的话,可能会方便一些。

顶部
[广告] 本月CWG有才贴---侦探火狼,孽缘曝光全解析
risingdragon
骑士
Rank: 24Rank: 24Rank: 24



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

回#31:
执行#30的语句就可以做到了
但如果写成
UPDATE 资源表 SET 当前值=当前值+小时产量/(SYSDATE-结算时刻)/24,结算时刻=SYSDATE WHERE 村庄='XXX';
那就累咯,有几个用户就得update几条。

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



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

执行一条Update语句更新500条语句,比执行500条Update语句更快速的很大一个原因是使用连接。使用连接池可以很大程度地解决这一问题。“一条update语句更新10万的速度,绝对比你执行500次update一条记录的速度快,呵。”这句话实在不敢苟同,做了测试之后再来说吧。
另外,在数据库中保存在线状态,这个在线状态是不准确的。难以与WEB服务器同步,用来显示给其它用户看是否在线,或是用于在线统计还可以,可是进行精确计算的时候就不行了。

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



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

刚刚做了测试,500次更新大约需要0.5秒,2000次更新需要大约1.8秒,一次更新10W条需要0.6秒。
risingnox的思路还是正确的,从效率上讲这两者相差并不大。

测试代码如下:

        protected void btn2000High_Click(object sender, EventArgs e)
        {
                SqlConnection connection = new SqlConnection(ConfigurationManager.AppSettings["DSN"]);

                SqlCommand command = new SqlCommand("Test2000", connection);
                command.CommandType = CommandType.StoredProcedure;

                command.Parameters.Add("@Now", SqlDbType.DateTime);
                command.Parameters.Add("@ID", SqlDbType.Int);

                DateTime dt = DateTime.Now;

                for (int i = 0; i < 2000; i++)
                {
                        command.Parameters[0].Value = DateTime.Now;
                        command.Parameters[1].Value = i;

                        connection.Open();
                        command.ExecuteNonQuery();
                        connection.Close();
                }


                TimeSpan ts = DateTime.Now - dt;

                lblResult.Text = "执行用时:" + ts.ToString();
        }

        protected void btn100K_Click(object sender, EventArgs e)
        {
                SqlConnection connection = new SqlConnection(ConfigurationManager.AppSettings["DSN"]);

                string cmd = "update [Test] set [Gold] = [GoldPerHour] * datediff(second, [LastUpdate], @Now), [LastUpdate] = @Now";
                SqlCommand command = new SqlCommand(cmd, connection);

                command.Parameters.AddWithValue("@Now", DateTime.Now);

                DateTime dt = DateTime.Now;

                connection.Open();
                command.ExecuteNonQuery();
                connection.Close();
        
                TimeSpan ts = DateTime.Now - dt;

                lblResult.Text = "执行用时:" + ts.ToString();
        }

表的结构如下
3 ID int
0 Gold int
0 GoldPerHour int
0 LastUpdate datetime

[ 本帖最后由 flymagic 于 2007-8-2 10:18 编辑 ]

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



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

我同时使用了存储过程和语句,发现效率居然没有变化!
可能在一个command对象中的语句在SQL中只编译一次吧。

效率上相差不大,实际上采用哪种都差不多了。不过,服务器计算的同步问题有点难以解决。不可能每访问而面就要到数据库去select,所以还是分而治之,在WEB服务器的SESSION中“骗”用户。

[ 本帖最后由 flymagic 于 2007-8-2 10:55 编辑 ]

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



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

如果是发生事件更新的话,即使有2000个活动用户(在进行操作),一分钟也不会发生500次更新事件,比这个数少的多的多(如果平均建设个建筑是30分钟,那一分种平均也就140次更新,事实上也不是每个用户都在做这种操作,因此实际情况比这还要少,而这种方式又可以保证无误差)。如果服务器每分钟把资源UPDATE一次,这也不是实时的,还是有误差,做它有何意义?如果更新周期短,服务器压力大也不现实,而且也有误差。

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



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

还有一个问题想请教一下,数据库的日志文件你们是怎么处理的?
我刚刚进行了测试操作之后,发现日志文件暴涨了500M。想必这是一个相当消耗资源的动作,有没有什么办法把日志禁掉呢?

顶部
[广告] 本月CWG有才贴---侦探火狼,孽缘曝光全解析
risingnox
老兵
Rank: 9Rank: 9



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

flymagic 比较敬业,呵,由我的一句话,就去做了相应的测试,佩服。

目前有这样的结果应该已经很明显了,我还是那句话,看自己的需要了,感谢flymagic为我们作了深 入的测试,也让我们有了更清楚的量化比较。

这里就直接锁帖吧?拖在那边好象也讨论不出什么所以然了。

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



UID 36542
精华 0
积分 124
帖子 34
威望 0
现金 2548 银币
金币 0 金币
阅读权限 30
注册 2007-7-14
状态 离线
发表于 2007-8-2 10:50  资料  个人空间  短消息 
回复 #38 flymagic 的帖子


SQL server吧?把故障还原模型改成简单就行了。

[ 本帖最后由 risingnox 于 2007-8-2 11:11 编辑 ]

顶部
[广告] 本月CWG有才贴---侦探火狼,孽缘曝光全解析
 



当前时区 GMT+8, 现在时间是 2008-8-29 11:17
沪ICP备06036464号

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

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