Java 具有可编辑帧上限的游戏循环

Java Game Loop With editable frame cap

我正在尝试在 java 中创建一个游戏循环,它有一个可以在游戏进行时设置的帧上限 运行。我遇到的问题是我有一个 render() 函数和一个 update() 函数。只需为 render() 和 update() 设置帧上限意味着当您更改帧上限时,游戏逻辑的速度将会改变。知道如何在不影响游戏逻辑(更新())速度的情况下在游戏中设置帧上限吗?

如评论所述:可以创建两个线程,一个负责更新,一个负责渲染。

尝试考虑适合您的需求和您的游戏的架构。您可以尝试类似的操作:

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Runner extends JPanel {

    private static final long serialVersionUID = -5029528072437981456L;

    private JFrame window;
    
    private Renderer renderer;

    public Runner() {
        setPreferredSize(new Dimension(WindowData.WIDTH, WindowData.HEIGHT));
        setFocusable(true);
        requestFocus();
        
        window = new JFrame(WindowData.TITLE);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.add(this);
        window.setResizable(false);
        window.pack();
        window.setLocationRelativeTo(null);
        window.setVisible(true);
        
        renderer = new Renderer(getGraphics());
        renderer.start();
    }
    
    public static void main(String[] args) {
        new Runner();
    }
}

import java.awt.Graphics;

public class Renderer implements Runnable {
    
    private Graphics context;

    private Thread thread;
    private boolean running;

    public Renderer(Graphics context) {
        this.context = context;

        thread = new Thread(this, "Renderer");
        running = false;
    }

    public void start() {
        if (running)
            return;
        running = true;
        thread.start();
    }

    public void render() {
        context.clearRect(0, 0, WindowData.WIDTH, WindowData.HEIGHT);
        context.fillRect(50, 50, 100, 100);
    }

    public void run() {
        while (running) {
            render();

            // ** DO YOUR TIME CONTROL HERE ** \
        }
    }
}

此代码实际上会导致严重的性能问题,因为您无法控制渲染 (repaint()) 时间。

但这只是一个向您展示如何使用不同线程的演示。做自己的架构。