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

game-loop - Single threaded game and rendering

I'm writing single threaded game engine for 2D games. Right now my game loop looks rougly like this:

  1. Update game logic
  2. Update physics
  3. Handle collisions
  4. Render scene

I'm using OpenGL for rendering. I'm wondering about 'Render scene' step position in game loop. There is a SwapBuffers() call on the end of the 'Render scene' step, so CPU is blocked until all rendering is finished. What do you think about this game loop:

  1. Render scene (previous frame)
  2. Logic, physics, collisions
  3. Swap buffers

This approach will bring better parallelism between CPU and GPU. Am I right?

0 投票
3 回答
1837 浏览

java - 游戏循环帧独立

是否可以让游戏循环尽可能快地运行?目前我可以设置我想要的 fps,因此在我的游戏将发送到的所有设备上都有一个恒定的 fps。然而,在速度更快的移动设备上,拥有更流畅的图形会更好。我看了看框架独立更新。使用独立于帧的更新时,不需要暂停一段时间(以达到所需的fps),如果更新和渲染在游戏线程中花费很长时间,是否不需要只更新而不渲染?请把我清理干净。

0 投票
1 回答
2642 浏览

loops - Cocos2D 游戏循环说明

注意:我不是以英语为母语的人。请原谅任何语法错误。

我开发了一个简单的游戏,左边有一个射手,右边有敌人。非常简单。

该项目即将完成,它运行良好,但现在我对游戏循环管理有些疑问。

我安排了从右侧出现的敌人,给了调度程序一个间隔,这没关系,但是我通过一个简单的 ccMoveTo 动作管理了敌人从右到左的移动,我重复一遍:它工作得很好。问题是我读了一些关于“在每一帧中渲染精灵”的东西,将这个操作委托给每帧运行一次的预定方法。

更好:我读到不使用动作来移动精灵,而是逐帧重新渲染它们,以以 1/60 频率(fps 频率)调用的计划方法中模拟运动,我读到这种实现可以防止不同硬件系统稳定性的一些差异..

我要问的是:

  • 这是正确的方法吗?
  • 那是 Cocos2D 过时的旧“设计模式”吗?(这意味着使用 ccMoveTo 动作是完全完美的)
  • 还是两个实现在同一级别上都是正确的?

编辑:

- 动画也应该使用相同的技术吗?

0 投票
1 回答
211 浏览

javascript - 仅在帧速率允许时才在 html5 画布中渲染特殊效果

我设置我的游戏循环如下:

现在我想要做的是,如果这个effectsOn变量被设置为良好的帧率,那么我将在我的游戏中渲染一些特殊效果。如果没有,我将直接跳过渲染那些特殊效果。

但我明显的问题是 ifdt>1/60和 effectsOn 设置为 true。我将渲染特殊效果,这将导致渲染时间增加,因此有可能dt < 1/60使 effectsOn 变为 false。

有没有什么好的替代方法来实现我想要做的事情?

在最坏的情况下,我可以在我的主菜单中放置一个复选框之类的东西,让用户决定是否渲染特殊效果......

0 投票
1 回答
1246 浏览

c++ - 游戏循环帧率控制问题

无论如何,这让我发疯了,通常的故事,试图保证在我的非常简单的游戏中在任何运行它的 Windows 机器上都具有相同的速度。我通过指定 1/60 值来做到这一点,然后确保框架无法运行,直到该值自上次调用以来及时通过。由于某种原因,我遇到的问题是 1/60 等于 30hz,我必须将其设置为 1/120 才能获得 60hz。它也不会在 60hz 上爆炸,它会快一点。

如果我把它贴在这里,有人可以告诉我他们是否发现任何问题?或者更精确的方式来做到这一点?

0 投票
1 回答
1807 浏览

android - 我是否需要每帧重绘画布上的所有对象?

我正在设置一个游戏循环。循环设置为以 50 FPS 更新。目前,该应用程序所做的唯一操作是在响应触摸事件时绘制屏幕坐标。最初我将绘图功能设置为仅绘制新的触摸事件。这导致文本闪烁。多个触摸事件在不同时间闪烁,这让我认为 Canvas 在幕后使用了多个页面。为了解决这个问题,我列出了发生的每个触摸事件,并在每次绘制调用时重绘整个列表。

如果我错了,请纠正我,lockCanvas()/unlockCanvasAndPost() 调用本质上是一个后缓冲交换。阅读有关锁定和解锁的文档听起来好像有必要在调用之间重绘整个场景,除非您使用 lockCanvas(Rect dirty)。在这种情况下,需要重绘脏矩形区域,同时保留外部区域。

在 unlockCanvas() 和 lockCanvas() 之间永远不会保留 Surface 的内容,因此,必须写入 Surface 区域内的每个像素。此规则的唯一例外是指定脏矩形时,在这种情况下,将保留非脏像素。

我知道这听起来像是我已经回答了我自己的问题,但根据文档,Surface 在调用之间永远不会保留。然而,这并不能解释我的第一个实现的行为,即我会点击屏幕并且文本会开始闪烁。由于我只绘制了一次文本,这意味着闪烁是从交换到没有得到 drawText() 调用的“backbuffer”,以及没有被破坏但可能需要考虑的原始 Surface不可靠。

所以,问题是:我是否需要在每次绘制调用时重绘所有对象?如果是这样,我是否需要“清除”画布,或者至少也重绘背景图像?

0 投票
1 回答
571 浏览

iphone - NSTimer 和 CADisplayLink 冲突

我有一个 CADisplayLink 作为游戏的主要游戏循环,还有一个 NSTimer,它每十秒产生一次敌人。我用...

...暂停游戏循环,但是即使在游戏暂停后,产生敌人的计时器仍将继续运行,如果我破坏计时器然后再制作另一个计时器,则无法仅利用暂停按钮并在10 秒后导致敌人永远不会生成?有一个简单的解决方案吗?

0 投票
2 回答
2393 浏览

java - Android Gameloop:结束游戏并开始活动

我的 Android 项目(我的第一个 Android 项目)中的 GameLoop 有问题:

我有一个 GameView (SurfaceView) 启动的 Activity。

GameView (SurfaceView) 启动 GameThread。

现在我可以玩了。至此,一切正常。

如果玩家丢失了一个新的 Activity (GameOver) 启动并且 GameThread 停止。他在这里崩溃了!

gameLoop.join();它冻结之后。

我已经尝试了很多,但没有任何效果。之前谢谢你的帮助

0 投票
2 回答
808 浏览

c++ - 2D游戏地图移动

我有一个 2d 随机生成的地图,用于由存储在 30 个数组中的块(正方形 40 乘 40)组成的平台游戏,我有一个推送功能来移动块,推送更改 xpos 以及我在数组上的位置仅在阵列上绘制 5-25 位置。

当我移动时,我只会在屏幕的前半部分移动角色。所以中间部分和屏幕的 0xpos 之间存在碰撞,现在我遇到的问题是移动块。

我想不出一种方法来移动它们,让它看起来很自然。关于如何做的任何想法?到目前为止,我拥有它,因此每次角色与屏幕的一侧碰撞时,它相当于 40 像素的速度,它会推动一个块并随机生成另一个块。

0 投票
1 回答
2612 浏览

java - 带有游戏循环的 Java 和 Swing

(不是这样)这里的简短问题。我正在使用 Swing 作为 UI 而不是控制台(这使得在 Eclipse 中更容易使用,等等),但我似乎遇到了障碍。

我遇到的问题是,当我进入游戏循环时,UI 将无法正常显示。我得到了一个丑陋的窗框,它在整个过程中给了我“纸牌”的效果,并且在运行时它的 RAM 使用量迅速增长。

我在这里错过了关于 Swing 的一些重要内容吗?我必须使用 Swing 的并发设置来执行此操作吗?如果是这样,最好的方法是什么?

完整代码如下: