Articles of 游戏圈

在游戏循环中,在循环开始之前应用dt,还是在完成之后?

说我有一个游戏类与更新循环接收时间增量dt的参数。 我想知道在循环开始之前或循环结束之后应用此dt是更好还是习惯。 class Game { void Update(float dt); float m_time; } dt是上次更新循环的增量时间。 m_time是游戏开始运行以来累积的总时间。 选项1: void Game::Update(float dt) { m_time += dt; /* do stuff */ } 优点:我认为这更清楚。 缺点:没有更新循环在m_time = 0 。 第一个更新循环已经有了m_time = dt 。 选项2: void Game::Update(float dt) { /* do stuff */ m_time += dt; } 优点:更新循环从m_time = 0开始。 缺点:我发现在所有处理完成后更新时间有点奇怪。 任何建议哪个选项比另一个更好或更喜欢?

单独的绘制和物理循环

我有一个点在更新物理的速度不同于绘制/摄取input? 这只是利用并行吗? 我听说很多引擎在15FPS下更新物理,但是在60FPS下渲染。 在不改变stream动性的情况下,四次渲染相同的图像会有什么意义呢?

我怎样才能避免这个游戏循环实现中的忙碌等待?

我一直在为一些研究目的开发一个OpenGL和WinApi的小框架。 我现在最大的问题是游戏循环。 简化我做了这样的事情:主线程: HANDLE hUpdate = (HANDLE)_beginthreadex(0, 0, updateThread, 0, 0, 0); while (!done) { if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) { done = TRUE; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } else { Draw(); } } 更新线程: unsigned int __stdcall updateThread(void *params) { QueryPerformanceCounter(&nextTick); QueryPerformanceCounter(&lastUpdate); while (!done) { LARGE_INTEGER […]

长三角时间和碰撞检测

当玩家的计算机停顿时,他会停止requestAnimationFrame调用,与delta时间绑定的移动系统会产生巨大的飞跃,绕过可能的冲突。 这使得玩家可以作弊,例如通过剔除和回退来避免投射物。除了在德尔塔时间太高时暂停游戏,解决这个问题的方法是什么? 附加的简单的系统遭受这个问题 – 运行的代码,标签出来,等一会儿,然后回到 – 你不应该看到控制台中的“PEW”。 function Box(x, y, w, h, moving) { this.x = x; this.y = y; this.w = w; this.h = h; this.moving = !!moving; this.colliding = false; } Box.prototype.move = function(dx, dy) { this.x += dx; this.y += dy; }; Box.prototype.testCollision = function(target) { return (Math.abs(this.x – target.x) * 2 […]

如何精确限制fps

我在制作游戏的主循环时遇到了麻烦,只能以N fps运行。 比方说,我想让游戏以60 fps的速度运行。 这是我的代码的一部分: int ticksPerSecond = 60; int skipTicks = 1000 / ticksPerSecond; int maxFrameskip = 10; // … while(true) { loops = 0; while (Environment.TickCount > nextGameTick && loops < maxFrameskip) { OnUpdate(); nextGameTick += skipTicks; loops++; } Render(); } 结果我得到64 fps,而不是60.为什么是这样,我在这里做错了什么?

用健康计数器触发状态变化

我正在开发一个游戏,玩家在健康状况下降时改变状态。 在50以下,它应该触发animation1。 低于30,应该触发animation2。 问题是,我只想触发一次animation1。 但是我的游戏计时器正在检查每一个“帧”,所以它每触发一次50以下的animation。我只希望它触发一次,然后不要再超过50,然后自然减less到50以下。 是否有任何尝试和真正的策略触发状态变化作为一个计时器倒计时(没有过度触发问题)? 我想我可以说: if (health == 50) animation1.play(); 但有时候,健康永远不会等于50,所以它会跳过正确的说法。

先渲染/绘制还是input?

在创建主游戏循环时,通常会发生什么样的顺序? IE浏览器,我应该得到input,做逻辑,然后渲染,还是别的? 这甚至很重要吗? 当我用python和pygame编码的时候,我正在使用的教程指出了上述方法。 然而,LWJGL2的教程( http://thecodinguniverse.com/lwjgl-window/ )是这样的: while (!Display.isCloseRequested()) { // While no attempt to close the display is made.. // Put render code here. // Put input handling code here. Display.update(); // Refresh the display and poll input. Display.sync(60); // Wait until 16.67 milliseconds have passed. (Maintain 60 frames-per-second) 和(到目前为止)似乎没有暗示逻辑(虽然我认为它会稍后,看起来可能会把它放在最后) 所以我应该使用哪个? 这一切是否重要? 我正在使用LWJGL2。

游戏循环的游戏开发被抽象出来

大多数游戏开发都是在主游戏循环中进行的。 有没有好的文章/博客文章/关于没有游戏循环游戏的讨论? 我想他们主要是网页游戏,但我会有兴趣听到别的。 (作为一个侧面说明,我认为这个概念几乎完全用于游戏,据我所知,这也许是另外一个问题。 编辑:我意识到可能有一个重绘循环的地方。 我想我真正的意思是一个隐藏给你的循环。 框架是开发人员不关心的事情,因为您正在进行更高层次的抽象。 例如someLootItem.moveTo(inventory, someAnimatationType) ,并且将使用指定的animationtypes从收集箱移动到您的广告资源,而游戏开发者不必担心该animation的实现细节。 也许这就是“真正的”游戏最终如何运作的结果,但是从阅读大多数教程来看,他们似乎暗示使用了更细化的控制级别,但这可能只是作为教程的一个人为因素。 编辑2:我想大多数人都误解了我想问的问题,可能是因为我无法准确描述我想问的问题。 经过一番思考,或许我所指的更多的是我认为被称为“脚本”的方面,在那里你在一个很高的层次上工作,并且有一些游戏引擎负责低层次的细节。 例如,在“星际争霸II”或“魔兽争霸III”中拍摄自定义地图。 许多“地图”的游戏玩法与主游戏相差太远,以至于他们可能被认为是在同一个引擎上编写的独立游戏。 我所指的就是这些。 我可能是错的,因为我只是在魔兽争霸III编辑器中进行search,但据我所知,在地图编辑器中没有任何地方可以控制游戏循环,但是你可以创建许多不同的游戏。 在我看来,这些都是游戏本身。 如果你正在玩DotA,你不会说你正在玩魔兽争霸III,你说你在玩DotA,因为那是你正在玩的实际游戏。 这样的系统可能会带来一些限制,如果你是从头开始创建一个游戏,这个限制是不存在的,但是这大大减less了开发时间,因为大部分的“硬”工作已经为你完成了。 希望澄清我所要求的。 我的意思是另一个例子,当你写一个Web应用程序,当然它通过套接字和TCP通信。 但是普通的web开发人员没有明确地编写连接套接字的代码。 他们只需要知道接收请求和发送回复。 有一些独特的场景偶尔需要使用原始套接字,但在网页开发中通常很less见。 以类似的方式,即使在幕后使用游戏循环,也可以不直接使用游戏循环来编写游戏。 也许不是一个AAA的标题,但必须有数百个规模较小的游戏,可以这样写。 写这些“更简单”的游戏是否有很好的资源?

非固定间隔更新循环有什么优点和缺点?

我正在研究实现游戏循环的各种方法,并且我find了这篇文章 。 在文章中,作者实现了一个循环,如果处理落后于时间,跳过帧渲染,并在一个循环中更新游戏(最后一个variables称为“恒定游戏速度独立于variablesFPS”)。 我不明白为什么可以在一个循环中调用update_game()而不确定更新函数是否以特定的时间间隔被调用。 我没有看到这样做的任何价值。 我认为,在我的比赛中,我想确保游戏定期更新一个已知的时期。 也许值得拥有两个线程,一个定期调用update函数,另一个线程定期重绘游戏。 当然,我需要同步线程。 这是否是一个好的和实用的方法?

有关游戏循环的问题

我一直在阅读如何devise一个游戏循环,在最好但不是很好的条件下都可以达到最佳效果,但是我想我已经把一些技巧混淆在一起了…所以我有一些问题… 固定物理步骤:如果我确定我的物理步骤,因为决定论在我的游戏中很重要,并且在某些时候游戏落后,需要赶上,我是否需要更新多次或者是否有更新物理的安全方法或三步? 如果我正在滚动我自己的物理,我应该以特定的方式写出来促进这一点? input:如果在下一帧之前我需要更新多次,那么我应该在每次更新之前检查input,或者检查一次,然后在下一个打勾之后留下input以处理? 更新:我真的需要多久更新一次游戏,以免玩家感受到延迟? 看起来你可以在60吨/秒以下的时候脱身,但是玩家在什么时候感觉到了延迟? 更新比渲染更频繁有什么缺点? 联网:如果游戏通过授权服务器联网,那么所有的机器都必须以与服务器相同的速率更新其客户端预测移动代码,以避免持续的可见重定位,或者如果我解决潜在的抖动平稳的位置修正? 插值:在更新之间插入绘制对象的位置是我只需要做的事情,如果我的游戏更新速度比我的fps慢得多,或者插入是好的吗? 什么内插涉及? 在提前或更新下一个位置之前运行另一个部分位置更新,并使用部分步进百分比(时间过去的正弦上次更新)来提前计算当前和下一个步骤之间的百分比。 渲染时间:在屏幕刷新之前的最后一刻是否有方法(或需要)绘制框架? 睡觉:抽完之后,我还没有更新我应该把线程交给操作系统,是吗? 如果我正在制作一个跨平台的游戏,并且一些操作系统可能比我指定的早或晚唤醒我的线程,那么如果我的物理是固定的,是否有机会影响游戏呢?