标签: game-loop

游戏循环性能和组件方法

我有一个组织游戏循环的想法.我对性能有些怀疑.可能有更好的做事方式.

考虑一下你有一系列游戏组件.他们都被称为在每次游戏循环迭代中做一些事情.例如:

GameData data; // shared
app.registerComponent("AI", ComponentAI(data) );
app.registerComponent("Logic", ComponentGameLogic(data) );
app.registerComponent("2d", Component2d(data) );
app.registerComponent("Menu", ComponentMenu(data) )->setActive(false);
//...
while (ok)
{
//...
app.runAllComponents();
//...
}
Run Code Online (Sandbox Code Playgroud)

优点:

  1. 良好的基于​​组件的应用程序,没有依赖性,良好的模块化
  2. 我们可以动态激活/停用,注册/取消注册组件
  3. 一些组件可以透明地删除或替换,系统仍然可以正常工作(更改2d到3d)(团队合作:每个程序员创建他/她自己的组件,不需要其他组件来编译代码)

释疑:

  1. 游戏循环中的内部循环,对Component :: run()进行虚拟调用
  2. 我希望Component :: run()返回bool值并检查此值.如果返回false,则必须停用组件.因此内循环变得更加昂贵.

嗯,这个解决方案有多好?你是否在实际项目中使用过它?

architecture performance components game-loop

3
推荐指数
1
解决办法
892
查看次数

平滑 Android 游戏循环

我使用下面的代码作为一个简单 Android 游戏的游戏循环。它运行得很好,但游戏中时不时会出现一些小问题。一切都冻结了一秒钟,然后向前跳得比应有的更远。我对游戏循环进行了大量阅读,但在实现平滑循环方面仍然遇到了一些麻烦。插值可以解决这个问题吗?我怎样才能使运动变得平滑?

private final static int MAX_FPS = 30;
private final static int MAX_FRAME_SKIPS = 5;
private final static int FRAME_PERIOD = 1000 / MAX_FPS;

protected Void doInBackground(Void... params) {
    Log.d("MainTask", "starting game task");
    Canvas canvas;

    long begin;     // the time when the cycle began
    long delta;     // the time it took for the cycle to execute
    int sleep;      // ms to sleep if ahead
    int skipped;    // number of frames being skipped

    sleep = 0;

    while (running) { …
Run Code Online (Sandbox Code Playgroud)

java multithreading android game-loop

3
推荐指数
1
解决办法
3145
查看次数

Javascript游戏循环

我有一些关于JavaScript循环的问题.

问题:

  • 为什么JavaScript循环会冻结浏览器
  • 为什么绘图速度慢,即使每1毫秒绘制一次,也是最简单的事情!
  • 解决方案是什么?闪光灯即将消亡,我们现在做什么?

这是自己尝试的画布代码:

<!doctype html>
<html>
<head>
</head>
<body>
    <canvas id="c" width="400" height="400"></canvas>
    <script type="text/javascript">

        var c = document.getElementById( 'c' );

        ctx = c.getContext( '2d' );

        var x = 100;

        ctx.fillStyle= '#f00';

        function loop()
        {
            ctx.fillRect( x, 100, 20, 20 );

            ++x;
        }

        setInterval( loop, 1 );
    </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

javascript html5 canvas game-loop

2
推荐指数
1
解决办法
4477
查看次数

Qt和OpenGL:如何尽可能频繁地渲染?

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

在win32项目中,我只需要一个mainloop,一旦前一个帧完成就继续执行下一帧.

在我找到关于Qt和OpenGL的教程中,他们使用计时器来控制场景的更新.但是,我想尽可能频繁地渲染帧数 - 如何做到这一点?

opengl qt timer game-loop

2
推荐指数
1
解决办法
5374
查看次数

Java和Swing与游戏循环

(不是这样)这里的简短问题.我正在制作一个简单的roguelike,使用Swing作为UI而不是控制台(这使得它更容易在Eclipse中工作,除其他外)但我似乎遇到了障碍.

我遇到的麻烦是,当我进入游戏循环时,UI将无法正常显示.我得到一个丑陋的窗框,在整个过程中给我"单人纸牌"的效果,而在运行它时,它的RAM使用量会迅速增长.

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

完整代码如下:

package roguelike;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.LinkedList;

import javax.swing.*;
import javax.swing.text.*;

public class roguelike {
    Color c_black = new Color(0x000000);
    Color c_white = new Color(0xffffff);
    Color c_red = new Color(0xff0000);
    Color c_blue = new Color(0x0000ff);
    Color c_green = new Color(0x00ff00);

    UI ui = null;
    Player me = null;
    Map gamemap = null;
    LinkedList<Character> keyqueue = new LinkedList<Character>();

    int charheight = 20;
    int charwidth = 80;

    public static …
Run Code Online (Sandbox Code Playgroud)

java swing game-loop roguelike

2
推荐指数
1
解决办法
2183
查看次数

如何让我的圈子在pygame中飞出屏幕?

我是python的初学者,我正在尝试制作一个圆形游戏.到目前为止,当您单击时,它会在您的鼠标上绘制一个带有随机颜色和半径的圆圈.

接下来,我希望圆圈随机向屏幕飞出.我该怎么做呢?到目前为止,这是我的代码的主要部分:

check1 = None
check2 = None

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit

        if event.type == MOUSEBUTTONDOWN:
            last_mouse_pos = pygame.mouse.get_pos()



    if last_mouse_pos:

        global check

        color1 = random.randint(0,255)
        color2 = random.randint(0,255)
        color3 = random.randint(0,255)
        color = (color1,color2,color3)

        radius = random.randint (5,40)
        posx,posy = last_mouse_pos

        if posx != check1 and posy != check2:
            global check1, check2
            screen.lock()
            pygame.draw.circle(screen, color, (posx,posy), radius)
            screen.unlock()
            check1,check2 = posx,posy


    pygame.display.update()
Run Code Online (Sandbox Code Playgroud)

同样,我希望圆圈以随机方向飞离屏幕.我做了几次尝试,但还没有成功.还有,感谢帮助我的jdi

python random animation pygame game-loop

2
推荐指数
2
解决办法
1668
查看次数

XNA - 更新方法与Draw方法

我非常有兴趣知道,如果我将所有精灵动画/移动逻辑放在Draw方法而不是Update方法中,并且更新方法只是管理触摸和其他事件.1)游戏动画/逻辑表现的任何问题?
2)游戏画面不会按预期运行吗?

c# xna game-loop windows-phone-7 xna-4.0

2
推荐指数
1
解决办法
3392
查看次数

如何在Erlang中实现"游戏循环"?

我想在Erlang中实现一个游戏循环(它充当服务器),但我不知道如何处理缺少增量变量.

我想做什么,在Java代码中描述:

class Game {
    int posX, posY;
    int wall = 10;
    int roof = 20;

    public void newPos(x,y) {

        if(!collision(x,y)) {
            posX = x;
            posY = y;
        }
    }

    public boolean collision(x,y) {
        if(x == wall || y == roof) {
            // The player hit the wall.
            return true;         
        }
        return false;
    }

    public sendStateToClient() {
        // Send posX and posY back to client
    }


    public static void main(String[] args) {    

        // The game loop
        while(true) {

            // Send …
Run Code Online (Sandbox Code Playgroud)

erlang game-loop

2
推荐指数
1
解决办法
434
查看次数

Rust - 将事件侦听器添加到 WebAssembly 游戏中

我正在尝试在网络程序集中创建一个游戏。我选择用 Rust 来准备它并使用 Cargo-Web 进行编译。我设法获得了一个有效的游戏循环,但由于 Rust 借用机制,我在添加 MouseDownEvent 侦听器时遇到了问题。我非常喜欢编写“安全”代码(不使用“不安全”关键字)

此时,游戏只需将红色框从 (0,0) 移动到 (700,500),速度取决于距离。我希望下一步使用用户单击更新目的地。

这是游戏的简化且有效的代码。

静态/index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <title>The Game!</title>
</head>

<body>
    <canvas id="canvas" width="600" height="600">
    <script src="game.js"></script>
</body>

</html>
Run Code Online (Sandbox Code Playgroud)

src/main.rs

mod game;

use game::Game;

use stdweb::console;
use stdweb::traits::*;
use stdweb::unstable::TryInto;
use stdweb::web::document;
use stdweb::web::CanvasRenderingContext2d;
use stdweb::web::html_element::CanvasElement;

use stdweb::web::event::MouseDownEvent;

fn main()
{
    let canvas: CanvasElement = document()
        .query_selector("#canvas")
        .unwrap()
        .unwrap()
        .try_into()
        .unwrap();

    canvas.set_width(800u32);
    canvas.set_height(600u32);


    let context = canvas.get_context().unwrap();

    let game: Game = Game::new();

    // canvas.add_event_listener(|event: MouseDownEvent|
    // { …
Run Code Online (Sandbox Code Playgroud)

events game-loop rust webassembly

2
推荐指数
1
解决办法
3620
查看次数

LWJGL Display.update()自动将FPS限制为60

我试图让我的游戏的FPS转到例如100,即使我正确地打电话

Display.sync(100);
Run Code Online (Sandbox Code Playgroud)

FPS是60 ..

主循环看起来像这样:

int delta = this.getDelta();
this.update(delta);
this.drawGL();

this.updateFPS();

Display.update(); // Automatically caps FPS to 60--unwanted
Display.sync(100); // And yet FPS is 60
Run Code Online (Sandbox Code Playgroud)

我应该补充一点,完全删除Display.sync(100);对FPS没有任何影响.

java frame-rate lwjgl game-loop

1
推荐指数
1
解决办法
1689
查看次数