问题标签 [game-loop]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
481 浏览

c# - 避免 XNA 4.0 中的游戏循环

我在 XNA 4.0 上开发了一个简单的 3D 模型查看器。有没有办法使用 Draw 和 Update 函数来避免游戏无限循环?我需要渲染 3D 图形,但没有无限渲染场景。我的意思是我需要重绘场景,然后它才真正改变了。

0 投票
1 回答
298 浏览

java - 在创建 2D OpenGL-ES 2.0 游戏的基本、简单的方法中寻求帮助

我制作了许多使用 Java 代码和 XML 布局的 Android 应用程序,但是我对 OpenGL ES 非常陌生。我用 Swing Java 编写过游戏,包括 pong 和中级 2d 平台游戏(也有地图编辑器!)。我对 Java 有广泛的了解,但是,OpenGL 是我希望打开的新大门。

使用在线指南,我在 OpenGL ES 中做了一些简单的事情,包括我手动映射坐标的立方体(这是一个非常有趣的体验),以及在屏幕上绘制一个三角形。

我的问题是,如何使用 OpenGL ES 制作 2d 游戏?现在,我尝试过的效果不太好,因为我绘制的图像不能按比例缩放,而且无论我使用什么指南,图像总是不稳定,而且我正在调试的 Nexus S 上的尺寸不合适.

我需要学习的是,能够使用 OpenGL ES 将图像和对象绘制到屏幕上,并学习如何执行游戏循环。我还没有研究过 Android 中的游戏循环,但很快就会。我首先要掌握的是在屏幕上绘制清晰的高清图像,这对我来说是行不通的。

如果您要求我发布我过去所做的示例,我当然会。但我希望你能帮助我重新开始。谢谢你。

TL;DR:如何使用 OpenGL ES 在屏幕上绘制清晰的高清 2D 图像,以及如何在 Android 中进行游戏循环?

0 投票
1 回答
6983 浏览

android - 使用 OpengGLSurface 为 Android 制作游戏循环的最佳方法

从我所见,如果我想制作一个非 opengl 游戏循环,我可以做的是有一个游戏线程,在循环期间将更新游戏状态(或游戏物理),并通过锁定 aCanvas来更新图形(normal) SurfaceView,通过 Canvas.drawXXX(...) 方法进行绘图,然后解锁它,此时图形会为循环更新。

GLSurfaceView使用and时我真的不知道该怎么做Renderer。据我了解,我不能再像使用常规表面那样按需绘制手工制作的 gameThread 了Canvas,因为现在有一个渲染线程将调用Renderer.onDrawFrame()(在我传递给GLSurfaceView)。

那么我的问题是,用 GLSurfaceView 和 Renderer 制作游戏循环的好方法是什么?我是否仍然应该制作单独的游戏线程,但只处理其中的游戏状态(物理)更新,然后在我的 Renderer.onDrawFrame() 实现中使用该游戏状态来实际绘制基于当前状态的图形?我应该只使用 Rendere 的线程来进行状态更新吗?

0 投票
3 回答
1484 浏览

c# - Rx 中的游戏更新渲染循环:如何确保一致的状态?

我是 Reactive Extensions for .NET 的新手,在使用它时,我认为如果它可以用于游戏而不是传统的更新渲染范式,那就太棒了。与其尝试在所有游戏对象上调用 Update(),对象本身只需订阅他们感兴趣的属性和事件并处理任何更改,从而减少更新、更好的可测试性和更简洁的查询。

但是,例如,一旦属性的值发生变化,所有订阅的查询也将希望立即更新它们的值。依赖关系可能非常复杂,一旦要渲染所有内容,我不知道是否所有对象都已完成下一帧的自我更新。依赖关系甚至可能使得某些对象基于彼此的更改而不断更新。因此,游戏在渲染时可能处于不一致的状态。例如,移动的复杂网格,其中一些部分已更新其位置,而其他部分尚未在渲染开始后。这对于传统的更新-渲染循环来说不是问题,因为更新阶段将在渲染开始之前完全完成。

那么我的问题是:是否可以在渲染所有内容之前确保游戏处于一致状态(所有对象都完成了更新)?

0 投票
4 回答
5666 浏览

qt - Qt & OpenGL:如何尽可能频繁地渲染?

我正在将 OpenGL 应用程序从 win32 项目移植到 Qt 项目。

在 win32 项目中,我只是有一个主循环,只要前一帧完成,它就会继续执行下一帧。

在我找到的关于 Qt 和 OpenGL 的教程中,他们使用计时器来控制场景的更新。但是,我想尽可能频繁地渲染尽可能多的帧 - 怎么做?

0 投票
1 回答
290 浏览

in-app-purchase - 应用内购买保持游戏循环

在我的 iPhone/iPad 游戏应用上,当用户点击购买/购买按钮时,会弹出一个应用内购买对话框,整个游戏循环都卡住了。我希望在处理应用内购买时游戏循环仍在更新。

请有人指点我的解决方案,谢谢

0 投票
1 回答
388 浏览

c++ - SDL - C++ 中 LoopTimer 的 FPS 问题

我们正在为我们的 c++ 类制作游戏引擎,除了 FPS 有一些小问题外,我们几乎完成了所有工作。它的运行速度总是比我们设置的慢 10-20%,我们想知道这是由于错误/蹩脚的代码还是它就是这样?如果我们将其设置为 500+,它的上限为 350,但这主要是由于计算机无法处理更多。如果我们将其设置为 50,我们会得到大约 40-44。

这是处理计时器的 LoopTimer 类的一些片段

标题:

文件

更新基本上是在我们的 GameManager 中的 run 方法中调用的:

如果需要,我可以提供更多代码,或者我很乐意将代码提供给任何可能需要它的人。包括 sdl_net 函数和诸如此类的东西在内发生了很多事情,所以没有必要将它们全部倾倒在这里。

无论如何,我希望有人对帧率有一个聪明的提示,无论是如何改进它,一个不同的循环定时器功能,或者只是告诉我在 fps 中有一点损失是正常的 :)

0 投票
2 回答
928 浏览

winapi - 不会使 CPU 达到峰值的 Win32 游戏循环

Windows 中有很多应用程序以相当高且稳定的帧速率触发代码而不会占用 CPU 的示例。

例如,WPF/Silverlight/WinRT 应用程序可以做到这一点。浏览器和媒体播放器也可以。他们究竟是如何做到这一点的,我将进行哪些 API 调用以从 Win32 应用程序中实现相同的效果?

当然,时钟轮询不起作用,因为这会使 CPU 达到峰值。也不是Sleep(),因为您最多只能获得大约 50 毫秒的粒度。

0 投票
2 回答
1242 浏览

android - 如何在opengl游戏循环中使用双核?

我的问题是关于 opengl 中的游戏循环设计。

我相信可以通过 3 个主要步骤来消除游戏循环

  1. 接受输入 - 它可能来自用户点击屏幕或系统警报,或其他任何内容。
  2. 做逻辑
  3. 更新视图

为了简单起见,让我们只关注第 2 步和第 3 步。

我认为以并行顺序运行它们或将它们混合到一个步骤中是错误的。我给你一个例子。

lats说你在做一个战争游戏,你需要在屏幕上画100个战斗的士兵,逻辑是更新他们的位置,更新背景区域,然后你需要绘制结果。在更新另一名士兵的位置之前,您不能开始绘制一名士兵。

所以根据这个简单的步骤,很明显第 2 步和第 3 步需要以某种方式同步,并且第 2 步必须在第 3 步之前完成。

现在告诉我如何在多个线程和多个进程上运行游戏循环?opnegl 是否使用多核?如何?

编辑:使用多线程的一种方法是预先计算游戏逻辑,或者换句话说,使用向量。但是向量有两个很大的缺点,使得它们几乎不被推荐使用。

  1. 有时你不想改变你的向量,所以你做了很多计算,你不会使用它们
  2. 在大多数情况下,您试图达到 60+ FPS,这意味着游戏循环需要 16 毫秒,切换线程需要某种同步,任何同步都对性能不利,据我所见,即使是简单的 Handler.post()在 android 中(只是将任务添加到队列以在其他线程上运行)可能需要 3 毫秒(帧速率时间的 18%),所以除非你的计算需要更长的时间,否则不要这样做!现在我没有发现任何需要花费这么多时间的东西。
0 投票
1 回答
867 浏览

android - 来自 lockCanvas 方法的游戏循环中的偶尔卡顿/滞后

我以给定的速度平滑滚动位图。我正在使用游戏循环来执行此操作。它滚动非常流畅,大约 60 fps,除了偶尔的口吃/跳跃。这些跳跃发生在任何地方,从每秒一次到每秒几次。通常它们在运行几秒钟后开始或变得更加频繁,但我不确定这是否是一个大线索。

跳跃的原因是偶尔运行循环的迭代会花费大约两倍的时间,因此位图会在一个地方停留一段时间,然后进一步跳跃以赶上并保持其恒定速度。我使用插值根据经过的时间计算每次更新时位图的新位置。当经过比平时更长的时间时,我尝试进行几次小型更新,而不是一次移动整个距离,但暂停的位图仍然非常明显。

我运行了 traceview,额外的时间花在了 lockCanvas 中。大多数情况下,此方法大约需要 10 毫秒,但在这些较长的情况下,大约需要 24 毫秒。当我追踪四秒钟时,这种情况发生了 7 次。

在下面的代码中,如果它运行得很快,我会让它睡一会儿,但这实际上并没有什么区别。如果我摆脱那部分代码,我的问题就没有解决。不需要恒定的帧速率,因为我只是根据经过的时间来计算位置。

updatePhysics() 和 doDraw() 的代码做了一些数学运算,我试图让它尽可能高效。基本上他们只是根据时间和速度计算位图的新位置。我只有一个位图,并且不会每次都重新分配它或类似的东西。

另外,我很肯定我的surfaceHolder 已经准备好了,所以我从谷歌搜索中找到的常见答案不是重复调用未准备好的surfaceHolder 已被限制。

有什么想法可能导致这种情况吗?我的表面支架使用 PixelFormat.RGB_565 并且我的位图被编码为 Bitmap.Config.RGB_565 如果这有所不同。我最初是从我制作的相对布局中获得位图的。