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()
) 时间。
但这只是一个向您展示如何使用不同线程的演示。做自己的架构。
我正在尝试在 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()
) 时间。
但这只是一个向您展示如何使用不同线程的演示。做自己的架构。