Articles of 固定时间步

带有multithreading的Timestep

有几个问题和文章涉及时间步 – 例如: 游戏逻辑应该更新每秒或每帧? https://gafferongames.com/post/fix_your_timestep/ 考虑蜱之间的漂移 (这是我以前的问题) 虽然最后一个在评论中开始讨论 – 但我仍然有一个关于如何构建一个multithreading系统的未解决的问题。 给定两个线程: 状态工作者:简单地对数据进行纯粹的转换。 IO渲染器:处理input,并呈现最新的可用状态对象 比方说,状态工作线程只是连续循环地更新游戏状态,而渲染器以固定的时间步长(例如60fps)更新屏幕。 现在让我们忽略input。 渲染器通过获取最新的数据来完成工作,每当数据完成时(可能在渲染之间发生了几十次),数据就从国有工作人员传入。 在我看来,这将是最stream畅的解决scheme,并且非常简单(除了读取状态更新之间的增量时间(不考虑渲染更新)之外,没有插值)。 虽然非常小 – 我说我们可以忽略input,它也给了一点点快乐,因为它轮询input并与游戏状态更新同步,在这种情况下发生得更为频繁,而基于渲染滴答至less对于简单的游戏)。 这个想法有什么缺陷? 或者是固体?

实施“修复你的时间步骤”

到目前为止,我已经实施了“FYTS” 。 但是我面临几个问题。 final int TICKS_PER_S = 60; double accumulator = 0.0; //The timestep final double dt = 1/(double)TICKS_PER_S; long previousTime = System.currentTimeMillis(); //State previous; //State current; while(running){ long currentTime = System.currentTimeMillis(); double frameTime = (currentTime – previousTime)/1000; if(frameTime > 0.25){ frameTime = 0.25; } previousTime = currentTime; accumulator += frameTime; while(accumulator >= dt){ //previousState […]

以差异更新间隔运行子系统

我想更新在60fps的渲染,但逻辑在一些较低的速度,比如15Hz。 但是如果一个对象只在游戏逻辑更新的时候才会移动,那么对于较低的频率来说,这个对象看起来会很糟糕。 我想渲染系统可以插入一个实体的向量,并绘制在较低的dt移动的模型,但如果游戏逻辑导致实体改变方向,它将显示传回,等等。 我可以想象更多的问题。 这通常在游戏中如何解决? 当然,大多数引擎都希望将渲染与游戏逻辑分离,所以一定会有一些引入。 还是每个人都只是以相同的速度更新所有具有graphics效果的系统呢?

XNA的GameTime是用来做什么的?

我正在开发一个使用固定时间步长的游戏,到目前为止,我还没有在我的代码中使用XNA的GameTime类。 class上有什么用途,我应该在游戏中使用它,还是我可以忽略它?

根据经过的时间产生敌人的严重游戏问题

编辑:我已经改变了标题,因为我认为这是一个普遍的游戏开发问题,但在技术说明上,我正在使用Cocos2d v2.0 前一段时间,我曾经问过一个问题 ,那就是产生敌人的最有效的方法/方法。 我select在主GameScene的“更新”周期中产生我的敌人。 简而言之:在每次更新调用时,敌方arrays中的每一个敌人都会被检查,如果敌人没有产卵并且总的经过时间大于当前时间,那么敌方就会产生。 我现在才意识到,把总产时间放在总时间上有以下缺点。 例如,在垂直滚动射击游戏中,如果帧频非常低(例如20fps),那么派生位置将会彼此大不相同。 我已经“计划”和“devise”了60fps左右的游戏玩法 ,所以如果有任何机会存在framedrop,那么用户在敌方生成位置方面也会有不同的用户体验(通常,在那些“糟糕”应该只受较低的帧率影响,但这里实际上获得了不同的游戏 – 在某些情况下更容易在其他情况下更困难)。 在光明的一面,我一直在使用Cocos2d 2.0,它将游戏限制在更强大的设备上,而且我优化了游戏的安静性(使用spritebatch节点和pvr.ccz压缩图像),这意味着在平均游戏运行时快速。 仍然是我们正在谈论“平均fps”的缺点, 因此不同的iPhone用户将有不同的敌人产卵位置 。 任何建议来限制这个缺点? 我是唯一一个经历/注意到这一点的人吗?

具有固定时间步长的游戏循环给出了奇怪的结果

所以我已经阅读了http://www.koonsolo.com/news/dewitters-gameloop/comment-page-2/#comments上的着名文章,其中描述了实现游戏循环的不同方法。 我试图实现在Javascript中的文章中描述的最终方法(暂时忽略插值): var Timer = { pastTime : 0, currentTime : 0, started : false, //starts the timer start: function(){ if(!this.started){ this.started = true; this.pastTime = new Date().getTime(); } }, //gets the time in MILLSECONDS getTime: function(){ return new Date().getTime() – this.pastTime; }, //stops the timer but does not reset it (ie getTime() can still […]

变物理步骤,坏主意?

目前,当我更新实体时,我计算自上次更新以来的时间,然后将其传递给它们的更新函数。 他们将依次将这个持续时间传递给所有的组件。 currentTime = clock.getTime() timePassed = currentTime – lastUpdate 这意味着物理组件也会得到一个可变的时间步长,但是这看起来很糟糕,并且会导致不一致的模拟。 这里有一些细节: > 什么时候应该使用固定或可变的时间步? 答案表明,物理模拟时间步长应该是恒定的,并且高于渲染时间步长。 但是由于我无法确保游戏的效果如何,这可能是相当困难的。 一个答案表明 : 使用Gaffer的“修复你的时间步骤”的方法。 按照选项1以固定的步骤更新游戏,但是每帧渲染多次 – 基于经过了多less时间 – 以便游戏逻辑保持实时,并保持离散的步骤。 这对我来说似乎是一个很好的方法,但我并不真正了解我应该如何去做。 而不是做: physics.step(timePassed) 我应该做以下? while timePassed > 0: physics.step(1) # millisecond timePassed -= 1

计算距离使用寿命,速度和蜱之间的时间

我试图从玩家那里划出一条线,直到他所面对的地方,这条线就是火箭队的行进距离。 我有ShipMissile.Speed,它是每个tick的移动像素数,LastTick,每次调用Update()和ShipMissile.Lifetime之间的毫秒数,ShipMissile.Lifetime是导弹应该存活的10毫秒刻度的数量对于。 我目前的代码如下: Distance = (int)((ShipMissile.Speed * ((ShipMissile.Lifetime * 10) / LastTick)) * scale); LastTick一般是16.6667(我从来没有看到它在testing期间与这个值有所不同),对于这个特殊的导弹types, Lifetime = 200 ,这是2000毫秒, Speed = 7 ,和scale = 1 (“本地”的游戏分辨率)。 导弹利用其旋转运动产生一个归一化的vector,然后乘以Speed并scale每个游戏节拍。 编辑 :像这样: Missile.Position += direction * speed * scale; 我发现这行太短了,想知道我的代码中的缺陷在哪里(请不要提及我不应该那么依赖帧速率,或者不更新Update之外的Lifetime)? 我的目前(非最佳)设置甚至可能吗? 谢谢! 编辑 :我知道这是晚了,但这里是我的意思(忽略其他东西,如敌人和比分等)的图片:

Android游戏循环(渲染&逻辑删除,但仍然'跳帧')

概观 伙计们真的希望在这里得到一些帮助。 我的游戏循环是基于Fix Your Timestep的代码! 。 我已经阅读了这篇文章不止几次了,但是我无法弄清楚循环中究竟应该发生什么。 我在Nexus 10平板电脑上运行我的代码,其中VSync设置为60fps。 打起来了 当我运行我的代码时,我经常在while循环中被捕获,也就是说它不止一次地运行我的逻辑 – 所以在渲染之前在逻辑运行逻辑两次)。 随着我对循环的理解,这应该发生时,需要太长时间才能适应时间片(这是16.66666666666667ms)。 所以,也许在“正常情况下”,我希望偶尔会发生这种情况)。 不过,我已经尝试删除所有的渲染和逻辑更新 ,只是运行一个框架循环,我仍然经常在“while循环”内被捕获。 因此,当我运行我的游戏(使用渲染和逻辑)时,我得到了很多的口吃,因为我知道循环将跳过帧。 然而,逻辑更新是封顶在60,这正是我想要的 。 很明显,不管我的渲染或物理更新是否更有效率,在这里不是问题,这是另一个问题,因为我已经从等式中删除了这个问题。 我可以通过插值的方式来平滑一些事情,但是它确实有所作为,但是它并不像从Play商店下载的一些游戏那样stream畅,我真的需要把它变得更好。 那么,我错过了什么或没有理解? 我认为它应该(当然没有渲染或逻辑更新来创建瓶颈): inputwhile循环 退出while循环 等待下一个VSync 并重复 这是我正在testing的循环: @Override public void onDrawFrame(GL10 gl) { newTime = System.currentTimeMillis()*0.001; frameTime = newTime – currentTime; //Amount of time this entire frame took if ( frameTime > (0.25)) […]

客户端和服务器环路不匹配

我正在尝试使用WebGL和NodeJS来构建一个小型的networking游戏。 我有一个基本的客户端和服务器设置,我正在尝试实施航位推算以模拟客户端上发生的事情。 我有一个奇怪的问题,我不确定如何解决,游戏循环对于我的客户端和服务器似乎不匹配,而客户端总是似乎更快。 我现在将我的服务器托管在与我的客户端相同的系统上,而且我正在为这两者logging每个帧。 如果我logging的时间超过5秒,服务器开始落后10-20帧,随着时间的推移,差距会越来越大。 目前,服务器上的处理已经不再是客户端了,因为我现在正在处理一个非常基本的示例。 我现在的循环看起来像这样: var loopDelay = 16.666666666666666666666666666667; function loop() { setTimeout(function() { update(); loop(); }, loopDelay); } 在客户端,我有这样的事情: function loop() { setTimeout(function() { update(); requestAnimationFrame(loop); draw(); }, loopDelay); } 但是当我开始遇到这个问题时,我暂时删除了它并复制了服务器,以确保它不是这样。 我能做些什么来使两者完美同步? 谢谢