游戏中一般是如何控制攻击速度的?比如A和B互相攻击,各自都有不同的攻击速度,我现在是开两个线程,根据不同
游戏中一般是如何控制攻击速度的?
比如A和B互相攻击,各自都有不同的攻击速度,我现在是开两个线程,根据不同的攻击速度,计算出一个间隔时间,然后在while中Sleep(),while一次就是攻击一次,这样感觉比较粗糙。不知道一般的做法是如何处理这个东西?大牛指点,欢迎大家讨论!
[解决办法]
参考quake3源代码?
[解决办法]
游戏中最基本的单位是帧,现在有两个速度 假设快的是2帧一刷 慢的是4帧一刷
只要刷新帧的时候判断是否满足了2或者4的条件刷新就行
另外,两个线程控制两个物体的做法看起来不妥 不需要设计线程
[解决办法]
在while中Sleep()
用这个 会出现假死吧!
[解决办法]
我感觉都不要用线程的,在开始打的时候就算好每次的攻击时刻了可以
[解决办法]
首先,我没做过大型游戏,顶多写个棋牌什么的,我说说自己的看法,可能有误,仅供参考。
1.不同的物体,应该有自己独立的控制线程,否则在操控的时候,应该会很容易产生相互干涉;
2.应该有一个总控线程,如果某个物体的动作对外在有影响,应该提交给总控线程来判断(如果是复杂的游戏,存在多级线程,应该是提交给上一级线程评判);
3.帧涉及到显示问题,而速度是游戏逻辑问题,两者不能混合在一起。
[解决办法]不能用sleep,不然卡屏卡死你,用多线程控制它的速度,你可以采用物理应用的V来控制。
[解决办法]放线程中不会的,不过你要控制好线程哦!
[解决办法]可以参考物理引擎的做法,建议看看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 。
[解决办法]帧为什么就不可以在命令行下当作一个时间单位线,不必拘泥于显示这个概念
如果是个会移动的物体都独立个线程,那游戏就完全没法做了
[解决办法]一万个线程很多吗?你有没有考虑过电信和银行业务,一万个并发算不了什么的,但你一个线程去处理这一万个并发就很有事了。
[解决办法]一万个线程还不多... 系统能否允许你创建这么多个线程都是问题
电信和银行的后台绝对不是你想的这种架构
[解决办法]1、你可以自己google windows/linux系统下进程最大线程数
2、1W个线程,系统挨个进行线程切换都是一笔不小的消耗了
3、一个进程下线程的数目一般是设置成CPU核心数的2倍左右,多个任务并行处理,是会开多个线程,但是不会开1W个
[解决办法]既然你局限于PC机和单进程,那我也没话说。
[解决办法]理论上说,一个活动的事务对应一个线程,这是一个抽象的原则,但实际上,这样做确实有很大的开销,所以就需要优化。但你如果做简单的单机游戏,两个人对打,需要这个优化么?我觉得,连线程池都不需要。
[解决办法]大开眼界,"理论上说,一个活动的事务对应一个线程,这是一个抽象的原则"
混了这么多年,第一次听说这个理论和抽象原则
啥也不说了,本屌已吓尿
[解决办法]你说的这些都是均匀的射击模式吧
具体的游戏编程不太熟悉
要是我去设计,我会采用以下方式:
角色对应的是对象,将自己注册给游戏引擎,由游戏引擎来统一驱动这些对象运作。
比如
角色A 将自己的射击频率5秒一次注册给游戏引擎或框架,角色B注册另外一个时间间隔。游戏引擎在后台应该有一个线程做定时器,专门驱动这些对象工作。
换言之,所有的事件,都是由游戏引擎或框架来驱动的,由框架做时间片的管理。
[解决办法]那请问 对于lz这样的一个游戏程序
你准备推荐lz用多少台机器 多少个进程呢
那请问 在这个游戏当中
你认为是 A砍B一下 应该算成是一个事务
还是 A跟B的整个战斗流程 应该算成是一个事务
如果 A砍B一下算成一个事务 那简单的两个人对打 你都要开几十个线程了?
如果 整个战斗流程算成是一个事务 那岂不是说 A跟B战斗完之前 别人都不能加入战斗了?
[解决办法]同意。不能开过多线程。不同意“CPU核心数的2倍左右”。多几个应该没问题。如果系统有几个相互独立,而且又都耗时的操作,就应该都弄成单独线程。你这个2倍左右是从完成端口那看的吧?
[解决办法]我只想说一句
在游戏设计当中,帧是时间单位,跟时、分、秒是一样性质的东西
把帧定义为 游戏画面的刷新一次为一帧的
我想 你也许是跟flash、电影的帧的概念混淆了
[解决办法]纠正:“事务”纠正为“事物”。
[解决办法]首先,看我的纠正。其次,你第一次听说,那是你的事情。游戏本来就是使用代码来对现实世界进行模拟,所以,开发的时候,一切都应该尽可能贴近现实世界。“一个活动的事物对应一个线程”,这在现实世界中,是一个很平常的事情。
[解决办法]1.对于楼主的游戏程序,简单的来说,使用1台机器,2-3个线程足够,但你要从最复杂的角度去考虑这个问题,使用上万线程的线程池也未尝不可。从虚拟现实的角度来说,你要模拟重力系统,要模拟风,水,地面,考虑摩擦、撞击等等,这些是外在的。内在的,你要考虑战斗者的特性,难道你和别人打架,从头到尾都是一成不变?
2.即使是“事务”对应线程,也未必不可以。你所谓的“别人不能加入战斗”是不成立的,因为这个线程是相对A和B来说是独立的,级别比A和B要高,只要有新人加入战斗,把信息提交给该线程处理即可。
[解决办法]是呀,学习了!
[解决办法]好吧 事物
请问你又是怎么定义事物的
是人算一个事物 装备算一个事物 还是人穿上装备算一个事物
是一个人算一个事物 还是人跟人组队了 队伍算一个事物队伍中的人不算事物了
又或者你想说 一个细胞算一个事物 一个原子算一个事物 一个点算一个事物
既然 你也说对于这个游戏“使用1台机器,2-3个线程足够”,那请问你干嘛又建议要一个事物一个线程,你又因为什么原因,不再遵守“一个活动的事物对应一个线程”这个原则了
“难道你和别人打架,从头到尾都是一成不变?”请问为什么我把整个游戏中的所有战斗都由一个线程来处理的话,这个战斗就变成“一成不变”的了?为什么我放在一个线程,我就不可以考虑撞击、摩擦了?
恕我对“事务”的理解依然是停留在数据库中提出的“事务”的概念上,我所理解的事务就是具有ACID性质的,首先我不认为AB战斗是一个事务,因为它不具有原子性,其次你如果认为AB战斗是一个“事务”了,在么在这个事务结束之前,C加入战斗就是破坏了事务的隔离性。
[解决办法]虚心才能进步。这个世界上不可能有游戏只有两个人对砍的,而且这一点你肯定也明白。其实从这个帖子里了解到真的游戏是怎么控制速度的,不是挺有用的
[解决办法]不是 是因为之前都是这样做的
但是可能因为 我之前处理线程多跟IO相关
如果说是纯计算的线程 那么理论上应该等于cpu核心数 减少线程的竞争
[解决办法]从来没写过游戏,请教个问题,这个主循环一秒跑60次是通过什么来控制的?
有没有可能主循环内逻辑太多,导致一秒钟可劲跑也跑不了60次这种情况发生过呢
[解决办法]
很有可能 可劲跑也跑不了60次
有多重情况
一种是线程任务分配的不合理 这个是需要重新规划的
另一种是 均摊任务了 就是跑不了60帧 这个时候要么 新开进程 准备新机器进行扩展
要么 降帧 比如降到30帧 15帧 12帧
[解决办法]
额
汗 游戏逻辑基本计时单位也是一帧啊,或者说tick,至于1 tick等于现实世界多少秒,那是可以调节的。不过多人对战为了同步,有时候就得跳帧,并帧,其实就相当于改变时间流速。比如原来是1秒30帧,但是你机器慢,落后了,你就得抛下渲染,逻辑层直接猛跑40帧跟上别人
对于super_admi说的“一个活动的事物对应一个线程”,我觉得用“一个活动的事物对应一个协程”更好
[解决办法]我说的就是 游戏逻辑基本计时单位也是帧
我的意思是 “把帧狭隘的定义为 游戏画面的刷新一次才称为一帧的人 他是跟flash、电影的帧的概念混淆了”
[解决办法]攻击速度是传递参数给速度引擎,引擎再根据参数来画每一帧的时候才有体现的吧。
游戏除了在后台加载一些资源时候才会使用多线程,大部分情况下都是单线程画每一帧
[解决办法]就是tick,要么有精确的时间戳,要么直接一个u64的值不停加,引擎执行这些的时候是一个队列,fifo,自然就能区分开来了
[解决办法]都有关系,各种各样的条件,同步是做这些网游最坑爹的地方之一。渲染慢的话其实可以抛下渲染使劲跑物理和逻辑引擎的,只不过画面卡一些而已。传输慢的话得看情况。毕竟比如CS,谁也不可能同步传输子弹飞行的轨迹,所以服务器基本上是接到消息,然后做预测。客户端也是,发完不等回馈直接往前演算。直到错了被纠正回来。
[解决办法]就用帧率算
否则100个人岂不是用100个线程?
[解决办法]我没做过游戏。我觉得每个线程处理一类动作比较好。
[解决办法]这个60次是通过什么来控制的?是简单的usleep()吗。比如跑一次10个毫秒。一秒钟只想跑60次,那就每跑完一次就usleep几个毫秒?
还有就是电脑速度也不是均匀的,也许刚开始一秒钟可以跑60次,后来东西一多就只能跑10次了。这时候程序会自动降帧?攻击这种东西就合并起来算了?比如本来一秒钟攻击60次的。现在一秒钟只能跑10次,但是计算的时候就会算成每帧都攻击了6次?
[解决办法]你需要CD
[解决办法]不是单单靠 sleep来控制 因为sleep并不精准
一般是用QueryPerformanceCounter来取毫秒数
while (true)
{
取当前毫秒数
run(当前毫秒数);
sleep(0);
}
run(当前毫秒数)
{
static 逻辑执行次数
if (当前毫秒数 > 逻辑执行次数 * 帧时间)
{
执行逻辑
逻辑执行次数++;
}
}
这样如果 逻辑消耗时间比较小的情况下 逻辑会等到时间到了在执行下一次逻辑
如果逻辑消耗时间比较大 就会连续命中if跑逻辑 直到把多消耗的时间追上了为止
这个帧时间 是需要多次测试进行调整设置的 不是动态调整
因为对于一些同步要求比较严格的游戏来说,帧是做为客户端和服务器之间同步的一个标志的
[解决办法]
有 当然有时间 但是现实世界是连续的,计算机的世界是离散的。用离散模拟连续,意味着越接近运算越多,这是一对矛盾。
子弹飞行穿过的时候,会有物理碰撞检测。但是子弹太快了,就会导致穿透。所以迭代运算是否碰撞不现实,就得改变计算模型。
[解决办法]不要涉及线程,单线程完全可以应付来,计算攻防的值 一个就ok
[解决办法]有个问题啊,单从这个循环看,如果很快就跑完逻辑了,程序实际上就是while(true)。CPU占用率不就百分百了吗? 还有其他线程的话,会影响到其他线程执行速度吧,用户一般还要开其他程序,会不会很卡?虽说操作系统会在线程间做切换,但是根据我做其他程序的经验,任何时候有个百分百占用cpu的线程都挺碍事的
[解决办法]sleep(0);是会让出cpu的 这个你可以实际试一下就知道了
[解决办法]sleep(0)跟sched_yield的作用应该差不多吧,都是告诉操作系统当前线程让出时间片。但是实际执行起来效果没有那么好啊。有一个很忙的线程的时候,其他线程执行同样操作所需时间的波动就会比较大,不过这种波动是不是对于用户级别的应用,比如听歌,开qq,至少用户是看不出来影响的?
[解决办法]除非你这个很忙的线程 他优先权比其他等待执行的线程的优先权都高
才会导致sleep(0)失效 才会导致一直占用cpu
否则 在线程优先权相等的情况下 sleep都是会让出cpu的 sched_yield应该也一样
[解决办法]俺其实就是那个狭隘的人,在我的理解中,帧就是一屏(或者一组)数据,所谓的15FPS,30FPS,就是每秒出现多少屏(组)数据。既然你说帧是时间单位,能否给出一个定义,或者给出一个稳定的换算公式?
[解决办法]