首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

游戏中一般是怎么控制攻击速度的

2013-03-19 
游戏中一般是如何控制攻击速度的?比如A和B互相攻击,各自都有不同的攻击速度,我现在是开两个线程,根据不同

游戏中一般是如何控制攻击速度的?
比如A和B互相攻击,各自都有不同的攻击速度,我现在是开两个线程,根据不同的攻击速度,计算出一个间隔时间,然后在while中Sleep(),while一次就是攻击一次,这样感觉比较粗糙。不知道一般的做法是如何处理这个东西?大牛指点,欢迎大家讨论!
[解决办法]
参考quake3源代码?
[解决办法]
游戏中最基本的单位是帧,现在有两个速度 假设快的是2帧一刷 慢的是4帧一刷
只要刷新帧的时候判断是否满足了2或者4的条件刷新就行

另外,两个线程控制两个物体的做法看起来不妥 不需要设计线程
[解决办法]
在while中Sleep()

用这个 会出现假死吧!
[解决办法]
我感觉都不要用线程的,在开始打的时候就算好每次的攻击时刻了可以
[解决办法]

引用:
游戏中最基本的单位是帧,现在有两个速度 假设快的是2帧一刷 慢的是4帧一刷
只要刷新帧的时候判断是否满足了2或者4的条件刷新就行

另外,两个线程控制两个物体的做法看起来不妥 不需要设计线程


首先,我没做过大型游戏,顶多写个棋牌什么的,我说说自己的看法,可能有误,仅供参考。
1.不同的物体,应该有自己独立的控制线程,否则在操控的时候,应该会很容易产生相互干涉;
2.应该有一个总控线程,如果某个物体的动作对外在有影响,应该提交给总控线程来判断(如果是复杂的游戏,存在多级线程,应该是提交给上一级线程评判);
3.帧涉及到显示问题,而速度是游戏逻辑问题,两者不能混合在一起。
[解决办法]
不能用sleep,不然卡屏卡死你,用多线程控制它的速度,你可以采用物理应用的V来控制。
[解决办法]
引用:
引用:
在while中Sleep()

用这个 会出现假死吧!A打B和B打A放在两个单独的线程中了,不会假死

放线程中不会的,不过你要控制好线程哦!
[解决办法]
可以参考物理引擎的做法,建议看看Box2D(http://box2d.org/)的源码及其应用。
[解决办法]
用帧来控制 

假设希望游戏主逻辑循环 1s跑60次
则每帧是16.67ms

A的攻击速度是1次/s,第1000帧开始攻击
B的攻击速度是1次/2s,第1001帧开始反击

则:
A的攻击逻辑的调用 分别在 1000帧 1060帧 1120帧 ...
B的攻击逻辑的调用 分别在 1001帧 1121帧 1241帧 ...




一个角色一个线程 那所谓的万人国战你怎么办?开一万个线程?....
[解决办法]
象这种战斗,需要有专门的守护程序来完成。
而不是 A 和 B 之间直接交互。
而是战斗精灵让 A 物件 和 B 物件作为参数来处理。
根据各自的属性,计算出攻击的参数,比如速度等等。
他们是在一个线程中执行。

想象一下,多人 Pk 。 
[解决办法]
引用:
引用:游戏中最基本的单位是帧,现在有两个速度 假设快的是2帧一刷 慢的是4帧一刷
只要刷新帧的时候判断是否满足了2或者4的条件刷新就行

另外,两个线程控制两个物体的做法看起来不妥 不需要设计线程

首先,我没做过大型游戏,顶多写个棋牌什么的,我说说自己的看法,可能有误,仅供参考。
1.不同的物体,应该有自己独立的控制线程……


帧为什么就不可以在命令行下当作一个时间单位线,不必拘泥于显示这个概念
如果是个会移动的物体都独立个线程,那游戏就完全没法做了

[解决办法]
引用:
用帧来控制 

假设希望游戏主逻辑循环 1s跑60次
则每帧是16.67ms

A的攻击速度是1次/s,第1000帧开始攻击
B的攻击速度是1次/2s,第1001帧开始反击

则:
A的攻击逻辑的调用 分别在 1000帧 1060帧 1120帧 ...
B的攻击逻辑的调用 分别在 1001帧 1121帧 1241帧 ...




一个角色一……

一万个线程很多吗?你有没有考虑过电信和银行业务,一万个并发算不了什么的,但你一个线程去处理这一万个并发就很有事了。
[解决办法]
一万个线程还不多... 系统能否允许你创建这么多个线程都是问题
电信和银行的后台绝对不是你想的这种架构
[解决办法]
引用:

引用:用帧来控制 

假设希望游戏主逻辑循环 1s跑60次
则每帧是16.67ms

A的攻击速度是1次/s,第1000帧开始攻击
B的攻击速度是1次/2s,第1001帧开始反击

则:
A的攻击逻辑的调用 分别在 1000帧 1060帧 1120帧 ...
B的攻击逻辑的调用 分别在 1001帧 112……



1、你可以自己google   windows/linux系统下进程最大线程数

2、1W个线程,系统挨个进行线程切换都是一笔不小的消耗了

3、一个进程下线程的数目一般是设置成CPU核心数的2倍左右,多个任务并行处理,是会开多个线程,但是不会开1W个

[解决办法]
引用:
……1、你可以自己google   windows/linux系统下进程最大线程数
 
2、1W个线程,系统挨个进行线程切换都是一笔不小的消耗了
 
3、一个进程下线程的数目一般是设置成CPU核心数的2倍左右,多个任务并行处理,是会开多个线程,但是不会开1W个

既然你局限于PC机和单进程,那我也没话说。
[解决办法]
引用:
一万个线程还不多... 系统能否允许你创建这么多个线程都是问题
电信和银行的后台绝对不是你想的这种架构

理论上说,一个活动的事务对应一个线程,这是一个抽象的原则,但实际上,这样做确实有很大的开销,所以就需要优化。但你如果做简单的单机游戏,两个人对打,需要这个优化么?我觉得,连线程池都不需要。
[解决办法]
引用:
引用:一万个线程还不多... 系统能否允许你创建这么多个线程都是问题
电信和银行的后台绝对不是你想的这种架构
理论上说,一个活动的事务对应一个线程,这是一个抽象的原则,但实际上,这样做确实有很大的开销,所以就需要优化。但你如果做简单的单机游戏,两个人对打,需要这个优化么?我觉得,连线程池都不需要。

大开眼界,"理论上说,一个活动的事务对应一个线程,这是一个抽象的原则"
混了这么多年,第一次听说这个理论和抽象原则
啥也不说了,本屌已吓尿
[解决办法]
你说的这些都是均匀的射击模式吧
具体的游戏编程不太熟悉 
要是我去设计,我会采用以下方式:
     角色对应的是对象,将自己注册给游戏引擎,由游戏引擎来统一驱动这些对象运作。
    比如
    角色A 将自己的射击频率5秒一次注册给游戏引擎或框架,角色B注册另外一个时间间隔。游戏引擎在后台应该有一个线程做定时器,专门驱动这些对象工作。
    换言之,所有的事件,都是由游戏引擎或框架来驱动的,由框架做时间片的管理。

[解决办法]
引用:
既然你局限于PC机和单进程,那我也没话说。


那请问  对于lz这样的一个游戏程序

你准备推荐lz用多少台机器 多少个进程呢


引用:
理论上说,一个活动的事务对应一个线程,这是一个抽象的原则。


那请问 在这个游戏当中 
你认为是 A砍B一下 应该算成是一个事务
还是 A跟B的整个战斗流程 应该算成是一个事务

如果 A砍B一下算成一个事务 那简单的两个人对打 你都要开几十个线程了?
如果 整个战斗流程算成是一个事务 那岂不是说 A跟B战斗完之前 别人都不能加入战斗了?

[解决办法]
引用:
引用:
引用:用帧来控制 

假设希望游戏主逻辑循环 1s跑60次
则每帧是16.67ms

A的攻击速度是1次/s,第1000帧开始攻击
B的攻击速度是1次/2s,第1001帧开始反击

则:
A的攻击逻辑的调用 分别在 1000帧 1060帧 1120帧 ...
B的攻击逻辑的调用 分……
同意。不能开过多线程。不同意“CPU核心数的2倍左右”。多几个应该没问题。如果系统有几个相互独立,而且又都耗时的操作,就应该都弄成单独线程。你这个2倍左右是从完成端口那看的吧?
[解决办法]
我只想说一句

在游戏设计当中,帧是时间单位,跟时、分、秒是一样性质的东西

把帧定义为 游戏画面的刷新一次为一帧的 
我想 你也许是跟flash、电影的帧的概念混淆了
[解决办法]
引用:
引用:一万个线程还不多... 系统能否允许你创建这么多个线程都是问题
电信和银行的后台绝对不是你想的这种架构
理论上说,一个活动的事务对应一个线程,这是一个抽象的原则,但实际上,这样做确实有很大的开销,所以就需要优化。但你如果做简单的单机游戏,两个人对打,需要这个优化么?我觉得,连线程池都不需要。


纠正:“事务”纠正为“事物”。
[解决办法]
引用:

引用:引用:一万个线程还不多... 系统能否允许你创建这么多个线程都是问题
电信和银行的后台绝对不是你想的这种架构
理论上说,一个活动的事务对应一个线程,这是一个抽象的原则,但实际上,这样做确实有很大的开销,所以就需要优化。但你如果做简单的单机游戏,两个人对打,需要这个优化么?我觉得,连线……


首先,看我的纠正。其次,你第一次听说,那是你的事情。游戏本来就是使用代码来对现实世界进行模拟,所以,开发的时候,一切都应该尽可能贴近现实世界。“一个活动的事物对应一个线程”,这在现实世界中,是一个很平常的事情。
[解决办法]
引用:
引用:既然你局限于PC机和单进程,那我也没话说。

那请问  对于lz这样的一个游戏程序

你准备推荐lz用多少台机器 多少个进程呢


引用:理论上说,一个活动的事务对应一个线程,这是一个抽象的原则。

那请问 在这个游戏当中 
你认为是 A砍B一下 应该算成是一个事务
……

1.对于楼主的游戏程序,简单的来说,使用1台机器,2-3个线程足够,但你要从最复杂的角度去考虑这个问题,使用上万线程的线程池也未尝不可。从虚拟现实的角度来说,你要模拟重力系统,要模拟风,水,地面,考虑摩擦、撞击等等,这些是外在的。内在的,你要考虑战斗者的特性,难道你和别人打架,从头到尾都是一成不变?

2.即使是“事务”对应线程,也未必不可以。你所谓的“别人不能加入战斗”是不成立的,因为这个线程是相对A和B来说是独立的,级别比A和B要高,只要有新人加入战斗,把信息提交给该线程处理即可。
[解决办法]
是呀,学习了!
[解决办法]
引用:
引用:引用:引用:一万个线程还不多... 系统能否允许你创建这么多个线程都是问题
电信和银行的后台绝对不是你想的这种架构
理论上说,一个活动的事务对应一个线程,这是一个抽象的原则,但实际上,这样做确实有很大的开销,所以就需要优化。但你如果做简单的单机……


好吧 事物

请问你又是怎么定义事物的
是人算一个事物 装备算一个事物 还是人穿上装备算一个事物
是一个人算一个事物 还是人跟人组队了 队伍算一个事物队伍中的人不算事物了
又或者你想说 一个细胞算一个事物 一个原子算一个事物 一个点算一个事物


既然 你也说对于这个游戏“使用1台机器,2-3个线程足够”,那请问你干嘛又建议要一个事物一个线程,你又因为什么原因,不再遵守“一个活动的事物对应一个线程”这个原则了


“难道你和别人打架,从头到尾都是一成不变?”请问为什么我把整个游戏中的所有战斗都由一个线程来处理的话,这个战斗就变成“一成不变”的了?为什么我放在一个线程,我就不可以考虑撞击、摩擦了?


恕我对“事务”的理解依然是停留在数据库中提出的“事务”的概念上,我所理解的事务就是具有ACID性质的,首先我不认为AB战斗是一个事务,因为它不具有原子性,其次你如果认为AB战斗是一个“事务”了,在么在这个事务结束之前,C加入战斗就是破坏了事务的隔离性。

[解决办法]
引用:
引用:
引用:既然你局限于PC机和单进程,那我也没话说。

那请问  对于lz这样的一个游戏程序

你准备推荐lz用多少台机器 多少个进程呢


引用:理论上说,一个活动的事务对应一个线程,这是一个抽象的原则。

那请问 在这个游戏当中 
你认为是 ……


虚心才能进步。这个世界上不可能有游戏只有两个人对砍的,而且这一点你肯定也明白。其实从这个帖子里了解到真的游戏是怎么控制速度的,不是挺有用的
[解决办法]
引用:
引用:引用:
引用:用帧来控制 

假设希望游戏主逻辑循环 1s跑60次
则每帧是16.67ms

A的攻击速度是1次/s,第1000帧开始攻击
B的攻击速度是1次/2s,第1001帧开始反击

则:
A的攻击逻辑的调……


不是 是因为之前都是这样做的
但是可能因为 我之前处理线程多跟IO相关 
如果说是纯计算的线程 那么理论上应该等于cpu核心数 减少线程的竞争
[解决办法]
引用:
用帧来控制 

假设希望游戏主逻辑循环 1s跑60次
则每帧是16.67ms

A的攻击速度是1次/s,第1000帧开始攻击
B的攻击速度是1次/2s,第1001帧开始反击

则:
A的攻击逻辑的调用 分别在 1000帧 1060帧 1120帧 ...
B的攻击逻辑的调用 分别在 1001帧 1121帧 1241帧 ...




一个角色一个线程 那所谓的万人国战你……


从来没写过游戏,请教个问题,这个主循环一秒跑60次是通过什么来控制的?

有没有可能主循环内逻辑太多,导致一秒钟可劲跑也跑不了60次这种情况发生过呢
[解决办法]
引用:
引用:用帧来控制 

假设希望游戏主逻辑循环 1s跑60次
则每帧是16.67ms

A的攻击速度是1次/s,第1000帧开始攻击
B的攻击速度是1次/2s,第1001帧开始反击

则:
A的攻击逻辑的调用 分别在 1000帧 1060帧 1120帧 ...
B的攻击逻辑的调用 分别在 1001帧 112……


很有可能 可劲跑也跑不了60次
有多重情况
一种是线程任务分配的不合理  这个是需要重新规划的
另一种是 均摊任务了 就是跑不了60帧 这个时候要么 新开进程 准备新机器进行扩展
要么 降帧 比如降到30帧 15帧 12帧
[解决办法]


引用:
我只想说一句

在游戏设计当中,帧是时间单位,跟时、分、秒是一样性质的东西

把帧定义为 游戏画面的刷新一次为一帧的 
我想 你也许是跟flash、电影的帧的概念混淆了

汗 游戏逻辑基本计时单位也是一帧啊,或者说tick,至于1 tick等于现实世界多少秒,那是可以调节的。不过多人对战为了同步,有时候就得跳帧,并帧,其实就相当于改变时间流速。比如原来是1秒30帧,但是你机器慢,落后了,你就得抛下渲染,逻辑层直接猛跑40帧跟上别人

对于super_admi说的“一个活动的事物对应一个线程”,我觉得用“一个活动的事物对应一个协程”更好
[解决办法]
引用:


引用:我只想说一句

在游戏设计当中,帧是时间单位,跟时、分、秒是一样性质的东西

把帧定义为 游戏画面的刷新一次为一帧的 
我想 你也许是跟flash、电影的帧的概念混淆了
汗 游戏逻辑基本计时单位也是一帧啊,或者说tick,至于1 tick等于现实世界多少秒,那是可以调节的。不过多人对战为了同步,有……


我说的就是  游戏逻辑基本计时单位也是帧

我的意思是 “把帧狭隘的定义为 游戏画面的刷新一次才称为一帧的人 他是跟flash、电影的帧的概念混淆了”
[解决办法]
攻击速度是传递参数给速度引擎,引擎再根据参数来画每一帧的时候才有体现的吧。

游戏除了在后台加载一些资源时候才会使用多线程,大部分情况下都是单线程画每一帧
[解决办法]
引用:
呵呵,有争论是好事啊。我感觉大游戏的引擎是个比较神秘的东西,各种战斗单位的运动等特性都是靠它来管理的吧,比如在玩魔兽争霸时,有时候放个死亡缠绕给目标,但是突然目标又被小强扎起来了,此时可能那个死亡缠绕会失效,就不明白引擎怎么做到这么精准的计算或者场景处理的。很想了解里边的很多处理方法

就是tick,要么有精确的时间戳,要么直接一个u64的值不停加,引擎执行这些的时候是一个队列,fifo,自然就能区分开来了
[解决办法]
引用:
引用:额

引用:
我只想说一句

在游戏设计当中,帧是时间单位,跟时、分、秒是一样性质的东西

把帧定义为 游戏画面的刷新一次为一帧的 
我想 你也许是跟flash、电影的帧的概念混淆了
汗 游戏逻辑基本计时单位也是一帧啊,或者说tick,至于1 tick等于现……

都有关系,各种各样的条件,同步是做这些网游最坑爹的地方之一。渲染慢的话其实可以抛下渲染使劲跑物理和逻辑引擎的,只不过画面卡一些而已。传输慢的话得看情况。毕竟比如CS,谁也不可能同步传输子弹飞行的轨迹,所以服务器基本上是接到消息,然后做预测。客户端也是,发完不等回馈直接往前演算。直到错了被纠正回来。
[解决办法]
就用帧率算
否则100个人岂不是用100个线程?
[解决办法]
我没做过游戏。我觉得每个线程处理一类动作比较好。
[解决办法]
引用:
引用:
引用:用帧来控制 

假设希望游戏主逻辑循环 1s跑60次
则每帧是16.67ms

A的攻击速度是1次/s,第1000帧开始攻击
B的攻击速度是1次/2s,第1001帧开始反击

则:
A的攻击逻辑的调用 分别在 1000帧 1060帧 1120帧 ...
B的攻击逻辑的调用……


这个60次是通过什么来控制的?是简单的usleep()吗。比如跑一次10个毫秒。一秒钟只想跑60次,那就每跑完一次就usleep几个毫秒? 

还有就是电脑速度也不是均匀的,也许刚开始一秒钟可以跑60次,后来东西一多就只能跑10次了。这时候程序会自动降帧?攻击这种东西就合并起来算了?比如本来一秒钟攻击60次的。现在一秒钟只能跑10次,但是计算的时候就会算成每帧都攻击了6次?
[解决办法]
你需要CD
[解决办法]
引用:
引用:引用:
引用:用帧来控制 

假设希望游戏主逻辑循环 1s跑60次
则每帧是16.67ms

A的攻击速度是1次/s,第1000帧开始攻击
B的攻击速度是1次/2s,第1001帧开始反击

则:
A的攻击逻辑……


不是单单靠 sleep来控制 因为sleep并不精准
一般是用QueryPerformanceCounter来取毫秒数

while (true)
{
    取当前毫秒数
    run(当前毫秒数);
    sleep(0);


}

run(当前毫秒数)
{
    static 逻辑执行次数
    if (当前毫秒数 > 逻辑执行次数 * 帧时间)
    {
         执行逻辑
         逻辑执行次数++;
    }
}

这样如果 逻辑消耗时间比较小的情况下 逻辑会等到时间到了在执行下一次逻辑
如果逻辑消耗时间比较大 就会连续命中if跑逻辑 直到把多消耗的时间追上了为止


这个帧时间 是需要多次测试进行调整设置的 不是动态调整
因为对于一些同步要求比较严格的游戏来说,帧是做为客户端和服务器之间同步的一个标志的


[解决办法]

引用:
引用:引用:
引用:额

引用:
我只想说一句

在游戏设计当中,帧是时间单位,跟时、分、秒是一样性质的东西

把帧定义为 游戏画面的刷新一次为一帧的 
我想 你也许是跟flash、电影……

有 当然有时间 但是现实世界是连续的,计算机的世界是离散的。用离散模拟连续,意味着越接近运算越多,这是一对矛盾。
子弹飞行穿过的时候,会有物理碰撞检测。但是子弹太快了,就会导致穿透。所以迭代运算是否碰撞不现实,就得改变计算模型。
[解决办法]
引用:
比如A和B互相攻击,各自都有不同的攻击速度,我现在是开两个线程,根据不同的攻击速度,计算出一个间隔时间,然后在while中Sleep(),while一次就是攻击一次,这样感觉比较粗糙。不知道一般的做法是如何处理这个东西?大牛指点,欢迎大家讨论!


不要涉及线程,单线程完全可以应付来,计算攻防的值 一个就ok
[解决办法]
引用:
引用:
引用:引用:
引用:用帧来控制 

假设希望游戏主逻辑循环 1s跑60次
则每帧是16.67ms

A的攻击速度是1次/s,第1000帧开始攻击
B的攻击速度是1次/2s,第1001帧开始反击……


有个问题啊,单从这个循环看,如果很快就跑完逻辑了,程序实际上就是while(true)。CPU占用率不就百分百了吗? 还有其他线程的话,会影响到其他线程执行速度吧,用户一般还要开其他程序,会不会很卡?虽说操作系统会在线程间做切换,但是根据我做其他程序的经验,任何时候有个百分百占用cpu的线程都挺碍事的
[解决办法]
引用:
引用:引用:
引用:引用:
引用:用帧来控制 

假设希望游戏主逻辑循环 1s跑60次
则每帧是16.67ms

A的攻击速度是……


sleep(0);是会让出cpu的 这个你可以实际试一下就知道了
[解决办法]
引用:
引用:
引用:引用:
引用:引用:
引用:用帧来控制 

假设希望游戏主逻辑循环 1s跑60次
则每帧是16.6……


sleep(0)跟sched_yield的作用应该差不多吧,都是告诉操作系统当前线程让出时间片。但是实际执行起来效果没有那么好啊。有一个很忙的线程的时候,其他线程执行同样操作所需时间的波动就会比较大,不过这种波动是不是对于用户级别的应用,比如听歌,开qq,至少用户是看不出来影响的?
[解决办法]
引用:
引用:引用:
引用:引用:
引用:引用:
引用 11 楼 zilaishuichina 的回……


除非你这个很忙的线程 他优先权比其他等待执行的线程的优先权都高 
才会导致sleep(0)失效 才会导致一直占用cpu
否则 在线程优先权相等的情况下 sleep都是会让出cpu的 sched_yield应该也一样
[解决办法]
引用:
我只想说一句

在游戏设计当中,帧是时间单位,跟时、分、秒是一样性质的东西

把帧定义为 游戏画面的刷新一次为一帧的 
我想 你也许是跟flash、电影的帧的概念混淆了

俺其实就是那个狭隘的人,在我的理解中,帧就是一屏(或者一组)数据,所谓的15FPS,30FPS,就是每秒出现多少屏(组)数据。既然你说帧是时间单位,能否给出一个定义,或者给出一个稳定的换算公式?
[解决办法]
Quote: 引用:

都有关系,各种各样的条件,同步是做这些网游最坑爹的地方之一。渲染慢的话其实可以抛下渲染使劲跑物理和逻辑引擎的,只不过画面卡一些而已。传输慢的话得看情况。毕竟比如CS,谁也不可能同步传输子弹飞行的轨迹,所以服务器基本上是接到消息,然后做预测。客户端也是,发完不等回馈直接往前演算。直到错了被纠正回来。 
Quote:


你所说的只是一种情况而已,不同的游戏处理的方式是不一样的。
比如,以早期的游戏为例,《暗黑破坏神II》就像你说的这样,有各种预判,最后纠正,这在网络状况不好的情况下最为明显。


但《传奇》如果碰到这种情况,貌似直接就卡死在那。
[解决办法]

引用:
虚心才能进步。这个世界上不可能有游戏只有两个人对砍的,而且这一点你肯定也明白。其实从这个帖子里了解到真的游戏是怎么控制速度的,不是挺有用的 ……

1.貌似最前面我就说过,我没有大型游戏开发经验,只是针对楼主的问题提出自己的想法而已,未必正确。这只是一个讨论而已,和“虚心”与否,有啥关系?俺不太明白。
2.KOF算不算只有两个人对砍的游戏?俺还是不太明白。
3.关于帧和速度的关系,我就更不明白了。原则上,速度只是规则衍生出来的东西,如果帧是时间单位,那么也应该是由规则衍生出来的。但时间只是速度的一个要素而已,怎么能够通过一个要素,控制整个东西?你能保证其它要素是恒定的?当然,我再申明一次,这只是我个人的想法,我自己并不知道是否正确,但肯定与“虚心”无关。
[解决办法]
引用:
引用:虚心才能进步。这个世界上不可能有游戏只有两个人对砍的,而且这一点你肯定也明白。其实从这个帖子里了解到真的游戏是怎么控制速度的,不是挺有用的 ……
1.貌似最前面我就说过,我没有大型游戏开发经验,只是针对楼主的问题提出自己的想法而已,未必正确。这只是一个讨论而已,和“虚心”与否,有啥关系?俺不太明白。
2.KOF算不算只……


你希望游戏逻辑 1秒处理n次 那么1帧=(1000/n)ms 单位是时间
而速度 游戏中有很多速度 移动速度 攻击速度 等等

比如 希望人的移动速度是 1m/s 逻辑是1s处理60次 那么人的速度就是 16.67cm/帧
它代表的意思是 游戏逻辑每run一次 人的位移应该变动16.67cm
而不是等实际时间过了1s 人的位移一次性变动1m
[解决办法]
1.667cm/帧 算错了 不好意思
[解决办法]
我说说我的看法:
1.个人认为,任何一个独立的东西,都可以称为事物。事物分为事和物,物比较好定义,一个原子,一个宇宙,都可以称之为一物。但事不是很好定义,比如,我揍你一拳,这是一个事?还是A揍B算一个事?或者这样描述:一个物体穿过三维空间与另一个物体接触,并带着该物体继续在三维空间中移动,这才是一个事?老实说,我自己都很糊涂。但这里,我的观点显然更偏重物。
一个团队,一个人,一件装备,都算一个事物---仅仅是我的理解。但是,什么才是“活动”的?装备能活动吗?我认为,不能。如果装备有变化,也是别的事物活动的结果。所以,我的理解是,通常,一个活动的人或者怪物什么的,应该对应一个线程。
2.所谓2-3线程,主要包含了对应A的线程,对应B的线程,以及规则判定线程。这只是从逻辑角度考虑,实际中的界面线程,控制线程什么的,没有放进来,所以,并不违背我自己说的“一个活动的事物,对应一个线程”。
3.我所说的“从头到尾都不变”,是针对于战斗中的主体而言的。比如,现实世界中,你打着打着,可能就累了,速度下降,准确率下降什么的。另外,我不觉得用一个线程处理所有战斗是一个好办法,因为这让我无法想象你之前所说的国战。
4.“事务”的概念,你理解得比我深刻,我这里或许只能说借用这个概念吧。我所认为的事务,是“战斗”,或者说,只是指一场具体的战斗,而不是特指“A和B的战斗”,所以,如果有C加入,我并不觉得破坏了事务的隔离性。

引用:
好吧 事物
 
请问你又是怎么定义事物的
 是人算一个事物 装备算一个事物 还是人穿上装备算一个事物
 是一个人算一个事物 还是人跟人组队了 队伍算一个事物队伍中的人不算事物了
 又或者你想说 一个细胞算一个事物 一个原子算一个事物 一个点算一个事物
 

既然 你也说对于这个游戏“使用1台机器,2-3个线程足够”,那请问你干嘛又建议要一个事物一个线程,你又因为什么原因,不再遵守“一个活动的事物对应一个线程”这个原则了
 

“难道你和别人打架,从头到尾都是一成不变?”请问为什么我把整个游戏中的所有战斗都由一个线程来处理的话,这个战斗就变成“一成不变”的了?为什么我放在一个线程,我就不可以考虑撞击、摩擦了?
 

恕我对“事务”的理解依然是停留在数据库中提出的“事务”的概念上,我所理解的事务就是具有ACID性质的,首先我不认为AB战斗是一个事务,因为它不具有原子性,其次你如果认为AB战斗是一个“事务”了,在么在这个事务结束之前,C加入战斗就是破坏了事务的隔离性。
……

[解决办法]
引用:
1.667cm/帧 算错了 不好意思




引用:
引用:
引用:引用:
引用:引用:
引用:引用:
引用 11 楼 zil……


你应该就是做网游的吧。今天了解到不少,谢了
[解决办法]
引用:
我说说我的看法:
1.个人认为,任何一个独立的东西,都可以称为事物。事物分为事和物,物比较好定义,一个原子,一个宇宙,都可以称之为一物。但事不是很好定义,比如,我揍你一拳,这是一个事?还是A揍B算一个事?或者这样描述:一个物体穿过三维空间与另一个物体接触,并带着该物体继续在三维空间中移动,这才是一个事?老实说,我自己都很糊涂。但这里,我的观点显然更偏重物。
一个团队,……



一个人一个线程  那万人国战才是我无法想象的 
为了一个万人国战 我得准备一组电信级业务规模的服务器集群

万人国战这种情况 我在#17楼其实已经回复过  
多个任务并行处理(也就说一个线程实际上是处理不了1W个人的战斗的,需要多线程来处理),这个时候就是会开多个线程并行的进行战斗计算,但是不会开1W个
[解决办法]
1.一人一线程,只是设计原则上的要求,但如果对比人的操作速度和电脑的处理速度,必然在某时间段会有大量线程空闲,所以可以进行优化,实际则未必真的需要一万线程;
2.即使是一万线程,也用不着所谓的电信级服务器集群,不是传说64位服务器每核心支持线程池内最大线程数可以到三万多吗?这里才一万而已。


3.事实上,对于战斗的计算和处理,我觉得,理想状态下,仍然是每个战斗对应一个线程,而实际情况,与1类似。

引用:
一个人一个线程  那万人国战才是我无法想象的 
 为了一个万人国战 我得准备一组电信级业务规模的服务器集群
 
万人国战这种情况 我在#17楼其实已经回复过  
 多个任务并行处理(也就说一个线程实际上是处理不了1W个人的战斗的,需要多线程来处理),这个时候就是会开多个线程并行的进行战斗计算,但是不会开1W个 ……

[解决办法]
有这么复杂?线程?帧?
这不就是一个时间问题吗,开始攻击的时候记录时间,然后每次执行逻辑的时候就检查AB是否到下一次攻击时间不就完了?
[解决办法]
引用:
1.一人一线程,只是设计原则上的要求,但如果对比人的操作速度和电脑的处理速度,必然在某时间段会有大量线程空闲,所以可以进行优化,实际则未必真的需要一万线程;
2.即使是一万线程,也用不着所谓的电信级服务器集群,不是传说64位服务器每核心支持线程池内最大线程数可以到三万多吗?这里才一万而已。
3.事实上,对于战斗的计算和处理,我觉得,理想状态下,仍然是每个战斗对应一个线……


那我想你优化到最后 每个核心一个线程 就是最优解了
既不浪费cpu 战斗线程之间也不产生线程竞争 和谐了 参考#32

而至于开1W个线程,把每个线程栈空间设置成64K,一个32位的机器就可以开起来了,不需要64位机器,而我所说的无法想象,是因为:16核的服务器可以算是大众的服务器了,而有1W个线程竞争这16个核,均摊一下600个线程竞争1个cpu,这才是恐怖的地方,所以才需要大量的机器。所以反过来说,开多少个线程,不是由你的事物或者事务的个数来决定,而是由cpu核心数决定的。

最后,我们也可以来分析一下,是否一个战斗一个线程真的就是理想的情况

我们大胆假设一下,会出现以下几种情况

1、A放了一个范围技能,于是10几个人一下全进了A的这个线程,然后进了A这个线程的有一个人B,比较NB一点,他是军团长,释放了一个战场范围的群疗,于是几千个人全进了A这个战斗线程。初衷是希望一个线程处理少数几个人的战斗,结果因为一个范围技能,这一个线程要处理这几千个人的战斗数据了。于是最终效果依然还是变成了实际上只跑起来了几个线程,每个线程处理千人左右的战斗数据。

2、假设这种逆天级的技能结束以后,大家又回到了两两捉对厮杀的情况下,此时两个人一个战斗线程,很和谐。但是有个问题出来了,国战有战斗奖励,最先杀死100敌人的奖励一把神器,但是由于你每个战斗是一个线程,大家就要拼RP了,纷纷祈祷自己所在的这个战斗线程被CPU优先调用到进行战斗结算,有些人明明是先杀足100敌人,但是他的这个战斗线程迟迟没有竞争到CPU,神器没有了。

3、还是两两捉对厮杀的情况下,A在线程1中,B在线程2中,CD在线程3中,然后A对C放了个闪电链,打到C再链接到D,与是CD都要放到线程1里面来;B同是放了一个嘲讽,嘲讽到CD,于是CD都要放到线程2里面来。此时跨线程的数据操作,要加锁。线程1先锁了C再锁的D,线程2是先锁的D再锁的C,好,死锁就这样产生了。




[解决办法]
引用:
引用:引用:
1.一人一线程,只是设计原则上的要求,但如果对比人的操作速度和电脑的处理速度,必然在某时间段会有大量线程空闲,所以可以进行优化,实际则未必真的需要一万线程;
2.即使是一万线程,也用不着所谓的电信级服务器集群,不是传说64位服务器每核心支持线程池内最大线程数可以到三万……


现在 一般游戏引擎 是指客户端的图像引擎 物理引擎

很少有逻辑引擎

各个游戏的逻辑 都是要自己实现的
[解决办法]
这个很简单,用模运算 %n==0 刷一次.控制好n就行了。
[解决办法]
我以前是做游戏的,各位跑题太严重了。我们讲的帧速是全屏刷新的速度。怎么可能一个对象开一个线程呢。。
[解决办法]
除了内核支持定时器, 一般做应用都是靠轮询+时间差检测来实现定时器的,需要用到堆数据结构以及其变形进行性能优化。

没那么复杂。
[解决办法]
引用:
引用:这个很简单,用模运算 %n==0 刷一次.控制好n就行了。

引用:我以前是做游戏的,各位跑题太严重了。我们讲的帧速是全屏刷新的速度。怎么可能一个对象开一个线程呢。。

关键是游戏的驱动怎么搞?放在线程中的while(1)?关键就在这个打斗或者移动等等这些东西是靠什么来驱动执行的?


给一段伪代码吧

while (true)
{
    取当前毫秒数//参照标准是游戏启动时时间为0
    gamerun(当前毫秒数);
    sleep(0);
}

gamerun(当前毫秒数)
{
    static 逻辑执行次数 //逻辑执行次数实际上就是游戏当前跑到第几帧了
    if (当前毫秒数 > 逻辑执行次数 * 帧时间)
    {
         character_run()
         skill_run()
         script_run();
         //others...
         逻辑执行次数++;
    }
}
character_run()
{
    for(int i = 0; i < character数量; i++)


    {
        character[i].move()
        //others...
    }
}
character::move()
{
    if (该角色处于移动状态 && 目标点没有到达)
    {
         计算新位置,计算碰撞,更新坐标,有需要的话还要通知客户端
    }
}
[解决办法]
一般游戏的客户端中,主循环都是单线程的。
while(true)
{
    处理输入();
    更新逻辑();
    更新显示();
    sleep(适当的时间以保证帧速);
}
一般是这样。
如果继续优化的话,可以吧更新显示,也就是渲染的部分单独提成一个线程。


对于游戏服务器,单线程、多线程的架构都有,但是绝对不可以一个单位一个线程。

[解决办法]

引用:
除了内核支持定时器, 一般做应用都是靠轮询+时间差检测来实现定时器的,需要用到堆数据结构以及其变形进行性能优化。

没那么复杂。
这哥们说的怎么这么像我们的项目的机制呢?
[解决办法]
引用:
一般游戏的客户端中,主循环都是单线程的。
while(true)
{
    处理输入();
    更新逻辑();
    更新显示();
    sleep(适当的时间以保证帧速);
}
一般是这样。
如果继续优化的话,可以吧更新显示,也就是渲染的部分单独提成一个线程。


对于游戏服务器,单线程、多线程的架构都有,但是绝对不可以一个单位一个线……

正解。
[解决办法]
引用:
引用:我说说我的看法:
1.个人认为,任何一个独立的东西,都可以称为事物。事物分为事和物,物比较好定义,一个原子,一个宇宙,都可以称之为一物。但事不是很好定义,比如,我揍你一拳,这是一个事?还是A揍B算一个事?或者这样描述:一个物体穿过三维空间与另一个物体接触,并带着该物体继续在三维空间中移动,这才是一个事?老实说,我自己都很糊涂……

erlang破之,
spawn()

热点排行