问题标签 [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 投票
2 回答
9203 浏览

c++ - C++ QueryPerformanceCounter 和 QueryPerformanceFrequency

我一直在尝试为我的游戏创建一个计时器,我听说了 QueryPerformanceCounter 和 QueryPerformanceFrequency。有人可以解释一下如何使用这些来计算游戏循环中的时间/fps/ticks吗?

0 投票
1 回答
4674 浏览

xna - Windows 中的自定义 XNA 游戏循环

我试图弄清楚如何在 Windows 游戏中手动管理整个游戏循环,而不使用常规 Game Microsoft.Xna.Framework.Game 类。

这样做的原因是使用常规 Game 类会导致我的游戏出现一些卡顿。不多,但由于游戏的特殊性,它仍然很明显。

在尝试了一堆不同的设置(vsync、fixedtimestep、各种帧率等)之后,我决定尝试编写自己的 Game 类来完全控制时间。我不确定这会解决它,但至少这样我可以完全控制。

基本上我需要:

  1. 设置游戏窗口
  2. 在一个循环中:像往常一样进行所有渲染,然后将结果刷新到屏幕上,管理后台缓冲区等。

任何人都知道如何做到这一点?事实上,这听起来很容易,但找不到任何关于如何做到这一点的文档。


不知道我做错了什么,但我有以下代码(仅用于测试,时间处理方式不同),循环将运行一段时间然后停止。一旦我将鼠标指针传递到窗口上,循环将再次运行一段时间。

如果启用“while PeekMessage”,循环将连续运行,但忽略睡眠并在鼠标移到窗口上时停止。不知道这里发生了什么......

我认为最理想的情况是我只想在主渲染循环中做这样简单的事情:

但在这种情况下,窗口仍然是空白的,因为看起来窗口实际上并没有用新内容重绘。我尝试了一个form.Refresh(),但仍然不行......有什么想法吗?

0 投票
1 回答
748 浏览

android - GameLoop 检查输入 (Android/GlSurfaceView)

如果我在线程中有一些基本的游戏循环,如下所示:

我想知道如何实际检查输入(即触摸屏)。我知道我可以在我的视图类中使用 onTouchEvent(),但我想从我的游戏循环中检查它。这是怎么做的?

ps:我正在使用带有 GlSurfaceView 的 android。

0 投票
1 回答
1614 浏览

android - 带有计时器和触摸事件(移动)处理的 Android 游戏方法

我正在做一个带有游戏循环和主动渲染的游戏(使用 SurfaceView 和 SurfaceHolder.Callback)。

我想知道如何使它与定时事件和触摸事件管理一起工作。定时事件就像每个 xx ms 发生一些事情,每个 yy ms 发生一些不同的事情。触摸管理是在向下、向上和移动时更新游戏和屏幕。

我已经尝试了几次,但它看起来有点尴尬,游戏表现不佳..

一方面,我有一个经典的游戏循环(在单独的线程中):在运行更新、渲染、绘制、睡眠时

现在我不太清楚如何使用计时器循环来完成这项工作。我使用了处理程序方法 - 创建扩展处理程序的类,在 handleMessage 中执行它们必须执行的操作,然后使用 sendMessageDelayed 调用它们自己。

他们只是更新游戏状态。生成的更改的渲染将在游戏循环中完成。

这种方法需要同步更新游戏循环而不干扰计时器的更新。

而且——除此之外,我还需要处理触摸事件——向下、向上和移动!我的方法是,就像在计时器中一样,只需更新游戏状态,然后将其留给循环来正确处理和显示。

我不知道我是否可能走在完全错误的道路上,对 Androd 来说是新手,并让它就像我认为的“可行”。

例如,我不确定是否有必要在单独的线程中制作游戏循环。我以为是,按照一定的帧率显示触摸处理(移动)的结果。

另一方面,我可以离开循环并在每次计时器更新后以及每次触摸处理后告诉绘制,但这也不能很好地工作。

问题是这种游戏的一般方法是什么?(必须连续呈现到屏幕的定时循环/触摸事件(移动))。

提前致谢。

0 投票
0 回答
125 浏览

graphics - 主游戏循环中可供程序员使用的选项

你们中的哪一位能否给我一些关于这四个主题的见解,我只是对它的要求有点困惑。

我对什么是被动渲染和主动渲染有一个很好的了解,并且主动渲染的使用更适合游戏编程。

我只是不确定其余的。


主游戏循环的时间是任何计算机游戏的重要组成部分,因为它会影响帧速率和使游戏以真实(或至少可玩)速率运行所需的实时物理计算。您需要阅读影响此时序的编程问题,并编写一份涵盖程序员可用选项范围的报告。您的报告应考虑以下标题:

  1. 主动和被动渲染之间的区别,以及游戏程序首选模式的说明。

  2. 物理(或游戏模型)更新和图形更新阶段之间的时间划分,以及对这些在涉及实时物理计算的游戏中的相对重要性的解释和分析。

  3. 在实时物理中实现准确性的技术,以及为此可能需要进行权衡的解释。

  4. 可用于尝试将图形更新的帧速率保持在某个所需速率的编程技术。


0 投票
2 回答
1472 浏览

multithreading - 关于游戏循环、滴答声和实时编程的一些问题

首先,我想为我的近似英语道歉,因为我是法国人。我目前正在使用 LWJGL 用 Ja​​va 制作实时游戏。我有一些关于游戏循环的问题:

  • 我正在一个线程中运行渲染例程。这是个好主意吗?通常,渲染例程相当慢,不应该减慢世界更新(tick)例程,这更重要。所以我想在这里使用线程似乎是个好主意(减去使用线程的复杂性)。
  • 在世界更新例程中,我正在用当前时间更新实体列表。然后,每个实体都可以计算自己的 deltaTime,对应于它们上次更新的时间。这与通常的更新循环不同,后者使用相同的 deltaTime 更新列表中的每个实体。由于线程渲染,这似乎很合适。这是个好主意吗?我应该改用第二种方法吗?如果是这样,是否仍然需要线程渲染?如果是这样,我是否必须添加最大 deltaTime?
  • 一般来说,设置最大 deltaTime 是个好主意吗?

谢谢你的时间!

0 投票
2 回答
3130 浏览

android - 为什么我的 SurfaceView 的游戏循环不能运行像样的 FPS?

我拼凑了一个简单的游戏循环,主要使用似乎很流行的技术,特别是在 Java 中的杀手游戏编程一书和我刚刚发现的本教程中:这里 只是一个简单的带后台缓冲区的定时游戏循环。

问题是它不会以良好的 FPS 重绘屏幕。我能从我的摩托罗拉 Xoom 中得到的最好结果是 15FPS,目标是 24。

如果我将后台缓冲区的大小减半,速度会大大提高,所以我猜这个问题可能与使用 Xoom 上的屏幕有关(我的 SurfaceView 的大小为 1280x727)......还有其他游戏看到在相同的尺寸下运行得很好。

我没有任何其他设备可以测试,所以我现在有点不知道该怎么做。

我在做什么错/错过/不知道?

0 投票
3 回答
2093 浏览

android - 创建游戏循环(睡眠时间帮助)

我一直在使用本教程来创建游戏循环。

在标记为“FPS 依赖于恒定游戏速度”的部分中,有一些示例代码包含睡眠命令

我用谷歌搜索了java中的等价物,发现它是

但它在eclipse中返回错误

这到底是什么意思。

我也想知道是什么

方法可能包含在 opengl-es 游戏中(即:渲染器在哪里更新以及在 display_game() 中发生了哪些事情;

我目前正在使用使用 GLSurfaceView 和 GLSurfaceRenderer 功能的系统

这是我对教程中代码的改编

这在我的 GLSurfaceView 中被调用,尽管我不确定这是否是实现它的正确位置。

0 投票
1 回答
1349 浏览

javascript - 用于游戏的 HTML 5 在画布上高效绘图

我正在尝试使用画布元素开发游戏。现在,我正在绘制瓷砖(彩色方块)作为背景,并且英雄由基于此演示的箭头键控制:http ://www.lostdecadegames.com/demos/simple_canvas_game/

但是,调用 showDungeon() 来绘制我的背景会使英雄的移动不像演示中那样平滑。我认为问题在于我将每个图块绘制为 32x32,这使得 Chrome 中的移动速度变慢。我可以做任何建议或代码优化吗?当瓷砖是 16x16 时,运动很好,但我想要瓷砖 32x32。我有点不想使用 CSS 将画布的大小加倍,因为这会破坏抗锯齿的图形。http://www.html5rocks.com/en/tutorials/casestudies/onslaught.html#toc-pixelated

不相关的问题:由于某种原因,我无法在 render() 中绘制一个绿色方块作为英雄,所以我使用了图像。 http://jsfiddle.net/4M5Xz/4/

0 投票
1 回答
6711 浏览

android - Opengl-es 手动调用 onDrawFrame

我正在创建一个游戏循环,如果我发现我落后于进程,我需要能够调用 onDrawFrame(从渲染器内部手动)以便“跳过帧”。

目前我有一个 GLSurfaceView 类调用

有了这个设置,我明白 onDrawFrame 会在每个刻度上被调用。

我尝试将上述调用放在一个方法中,以便我可以从我的游戏循环中调用它,但是在游戏循环的第二次运行中,我崩溃并显示消息说

有没有办法在每一帧手动调用渲染器

只会打电话给

方法正常工作。或者在使用openGL时以这种方式控制渲染器不是一个好习惯