问题标签 [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 回答
3517 浏览

c# - 是否有实现异步游戏引擎循环的最佳实践?

我已经实现了一个游戏引擎循环,如下所示:

我正在使用AsyncResultJeff Richter 在他的文章实现 CLR 异步编程模型中推荐的类。为了能够从 UI 中停止引擎,我使用的实现有点偏离标准的异步模式。此实现按预期工作,但是当我偏离标准实践时,我会回到 SO 社区以确保我以正确的方式做事。

此实现是否存在任何人都可以看到的问题?

0 投票
1 回答
753 浏览

android - 使用 SurfaceView 的 Android 游戏循环;快速改变相机“镜头”会导致黑色闪光等

我使用 SurfaceView 构建了一个简单的游戏引擎。

我使用 RectF 作为“相机”窗口,以表示 SurfaceView 画布的缩放像素宽度和高度,并找出屏幕上的内容。

我使用 canvas.translate 移动到相机“指向”的位置。这是绘制循环:

无论如何,如果我发射弹丸,游戏会流畅地渲染,并且我看不到黑色的视觉闪烁,这是我用来冲洗画布的颜色。

但是,如果我立即更改相机可以看到的内容,可能在 3 个或更多“屏幕”之外,经常会出现黑色闪烁,但并非总是如此。有时我会变得“幸运”,并且过渡是无缝的。

这些闪光通常在我的位图的位置,因为我使用一个或两个位图递归地绘制地面和背景。

在我看来,突然的变化是问题所在,所以我试图从本质上破坏 gameLoop 线程以停止一切,然后设置新的 Rect 坐标,然后用另一个线程重新启动,但这不起作用。

我想经过反思,我只是通过这样做来延迟系统的“冲击”,而不是对其进行处理。

在尝试通过淡出或其他视觉技巧将这个可能残暴的设计扫到地毯下之前,我想知道是否有人对这个问题有更深入的了解,并且可以引导我找到更优雅的解决方案。

0 投票
1 回答
177 浏览

game-loop - 如何做一个循环模拟的游戏

如何编写一个由循环模拟的游戏,在该循环中人们必须重复进行,只要它需要到达或通过 80 格?我正在做一个蛇和梯子游戏,需要编写一个允许这种情况发生的代码

0 投票
4 回答
1115 浏览

events - 最大的牛肉与游戏循环

你最讨厌现代游戏循环的什么?游戏循环是否可以改进,或者是否有更好的替代方案,例如事件驱动架构?

0 投票
1 回答
279 浏览

ruby-on-rails - 应用程序控制器中的 Rails 游戏循环?

因为我正在用 RoR 编写游戏,所以我需要一个游戏循环来负责在每次页面刷新发生时检查不同的事情。我的问题是,最好的实施方式是什么?

我目前在我的应用程序控制器中包含了 game_loop。这是最佳做法吗?

0 投票
3 回答
8863 浏览

c - 与 GLUT 中的可变 FPS 无关的恒定游戏速度?

我一直在阅读 Koen Witters关于不同游戏循环解决方案的详细文章,但我在使用 GLUT 实现最后一篇时遇到了一些问题,这是推荐的一篇。

在阅读了其他人关于如何实现恒定游戏速度的几篇文章、教程和代码之后,我认为我目前已经实现的(我将在下面发布代码)是 Koen Witters 所说的基于可变 FPS 的游戏速度,他的文章的第二个。

首先,通过我的搜索经验,有几个人可能有知识可以帮助解决这个问题,但不知道 GLUT 是什么,我将尝试解释(请随时纠正我)相关功能我对这个 OpenGL 工具包的问题。如果您知道 GLUT 是什么以及如何使用它,请跳过本节。

过剩工具包:

  • GLUT 是一个 OpenGL 工具包,可帮助完成 OpenGL 中的常见任务。
  • glutDisplayFunc(renderScene)接受一个指向函数回调的指针,该renderScene()回调将负责渲染所有内容。该renderScene()函数只会在回调注册后被调用一次。
  • glutTimerFunc(TIMER_MILLISECONDS, processAnimationTimer, 0)调用回调之前需要经过的毫秒数processAnimationTimer()。最后一个参数只是传递给计时器回调的值。processAnimationTimer()不会每次都调用,TIMER_MILLISECONDS只会调用一次。
  • glutPostRedisplay()函数请求 GLUT 渲染一个新的帧,因此我们需要在每次更改场景中的某些内容时调用它。
  • glutIdleFunc(renderScene)用于注册回调renderScene()(这并不glutDisplayFunc()无关紧要),但应避免使用此函数,因为当未接收到事件时会连续调用空闲回调,从而增加 CPU 负载。
  • 该函数返回自被调用(或第一次调用)glutGet(GLUT_ELAPSED_TIME)以来的毫秒数。这就是我们使用 GLUT 的计时器。我知道高分辨率计时器有更好的选择,但现在让我们继续使用这个。glutInitglutGet(GLUT_ELAPSED_TIME)

我认为这是关于 GLUT 如何渲染帧的足够信息,因此不了解它的人也可以提出这个问题,以便在他们喜欢它时尝试提供帮助。

当前实施:

现在,我不确定我是否正确实施了 Koen 提出的第二个解决方案,即Game Speed 取决于 Variable FPS。相关代码如下:

这个实现不正确。它的工作原理是帮助游戏速度保持恒定,取决于 FPS。因此,无论高/低帧速率如何,从 A 点移动到 B 点都需要相同的时间。但是,我相信我用这种方法限制了游戏帧率。[编辑:只有在调用时间回调时才会渲染每一帧,这意味着帧速率大约是TICKS_PER_SECOND每秒帧数。这感觉不对,你不应该限制你强大的硬件,这是错误的。我的理解是,我仍然需要计算elapsedTime. 仅仅因为我告诉 GLUT 调用计时器回调 every TIMER_MILLISECONDS,并不意味着它总是会准时这样做。]

我不确定如何解决这个问题,老实说,我不知道 GLUT 中的游戏循环是什么,你知道,while( game_is_running )Koen 文章中的循环。[编辑:我的理解是 GLUT 是事件驱动的,当我调用时游戏循环开始glutMainLoop()(它永远不会返回),是吗?]

我想我可以注册一个空闲回调glutIdleFunc()并将其用作替换glutTimerFunc(),仅在必要时渲染(而不是像往常一样)但是当我用一个空回调(如void gameLoop() {})测试它时,它基本上什么也没做,只有一个黑屏,CPU 飙升至 25% 并一直保持在那里,直到我杀死游戏并恢复正常。所以我不认为这是要走的路。

使用glutTimerFunc()绝对不是基于此执行所有动作/动画的好方法,因为我将我的游戏限制为恒定的 FPS,而不是酷。或者也许我用错了,我的实现不正确?

我如何才能在可变 FPS 的情况下获得恒定的游戏速度?更准确地说,我如何使用 GLUT 正确实现 Koen 的恒定游戏速度和最大 FPS解决方案(他的文章中的第四个)?也许这对 GLUT 来说根本不可能?如果没有,我的替代方案是什么?使用 GLUT 解决这个问题(恒定的游戏速度)的最佳方法是什么?

[编辑]另一种方法:

我一直在尝试,这就是我现在能够实现的目标。我现在不是在计时函数上计算经过的时间(这会限制我的游戏的帧速率),而是在renderScene(). 每当场景发生变化时,我都会调用glutPostRedisplay()(即:相机移动、某些对象动画等),这将调用renderScene(). 例如,我可以使用此功能中的经过时间来移动我的相机。

我的代码现在变成了这样:

结论,它正在工作,或者看起来如此。如果我不移动相机,CPU 使用率很低,什么都不会被渲染(出于测试目的,我只有一个网格扩展到 4000.0f,而 zFar 设置为 1000.0f)。当我开始移动相机时,场景开始重绘。如果我一直按移动键,CPU使用率会增加;这是正常行为。当我停止移动时它会回落。

除非我遗漏了什么,否则这似乎是一个不错的方法。我确实在 iDevGames 上找到了这篇有趣的文章,并且此实现可能受到该文章中描述的问题的影响。你对此有何看法?

请注意,我这样做只是为了好玩,我无意创建一些游戏来分发或类似的东西,至少在不久的将来不会。如果我这样做了,我可能会选择除了 GLUT 之外的其他东西。但是由于我使用的是 GLUT,除了 iDevGames 上描述的问题之外,你认为这个最新的实现对 GLUT 来说足够了吗?我现在唯一能想到的真正问题是,glutPostRedisplay()每次场景发生变化时我都需要继续调用它,并一直调用它,直到没有新的东西可以重绘。我认为,为了更好的原因,为代码添加了一点复杂性。

你怎么看?

0 投票
5 回答
20980 浏览

c++ - 如何为游戏循环制作计时器?

我想计时 fps 计数,并将其限制设置为 60,但是我一直在通过谷歌查看一些代码,我完全不明白。

0 投票
4 回答
1892 浏览

windows - 使用操作系统计时器处理游戏循环

一个简单的游戏循环运行有点像这样:

(取自这个问题

我在这里以 windows 作为示例,它可以是任何平台。如果我弄错了,请纠正我,但这样的循环将使用 100% 的 cpu/核心(在我的计算机上使用 50% 的一个核心),因为它总是检查running变量的状态。

我的问题是,使用操作系统(在示例 Windows 中)计时器函数来实现游戏循环会更好(在性能方面),根据每秒所需的游戏逻辑滴答数设置所需的间隔吗?我问这个是因为我假设定时器功能使用 CPU 的 RTC 中断。

0 投票
2 回答
10901 浏览

java - 用于游戏循环的 Java TimerTick 事件

我尝试使用 java.util.Timer 中的 Timer 在 Java 中制作游戏循环。我无法让我的游戏循环在计时器滴答期间执行。这是这个问题的一个例子。我试图在游戏循环期间移动按钮,但它没有在计时器滴答事件中移动。

0 投票
1 回答
90 浏览

animation - 实用的游戏动画?

我知道游戏开发涉及一个“游戏循环”,其中场景被绘制。此游戏循环要么尽可能快地运行(无计时器,帧动画),要么基于计时器调用(计时器动画)。我很好奇高级动画(不仅仅是简单的几何图形)实际上是如何完成的,考虑到一个角色行走时可能会发生多少帧。显然,程序员并没有在动画的每一帧对角色脚的位置进行硬编码,所以我想知道这实际上是如何完成的?

如果有必要对问题进行任何澄清,我很乐意填写更多信息。