java - Java Swing 图形口吃
问题描述
我对 Swing 还很陌生,我正在尝试制作一个简单的游戏,在当前阶段,你用 wasd 移动一个盒子,它面向鼠标光标。就这些功能而言,我没有任何问题。不幸的是,我遇到的问题是应用程序在执行很少的操作时会卡顿。
例如,如果我正在移动框,但光标仍然不动,则游戏开始严重卡顿。但是,如果我摆动光标,游戏运行良好。经过一番研究,该问题似乎与 Swing 的Component.repaint()
. 但是,在实现了我对此的理解之后,口吃问题并没有改变。
我实现它的方式是让我的抽象基础 GameObject 类扩展 Component,游戏中显示的所有对象都是该类的后代。
在应用程序的主类 Game 类中,run 函数负责更新游戏中的对象。
long lastTime = System.nanoTime();
double amountOfTicks = 60.0;
double ns = 1000000000 / amountOfTicks;
double delta = 0;
long timer = System.currentTimeMillis();
int frames = 0;
while (running) {
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
while (delta >= 1) {
tick();
delta--;
}
if (running) {
render();
}
frames++;
if (System.currentTimeMillis() - timer > 1000) {
timer += 1000;
System.out.println("FPS: " + frames);
frames = 0;
}
}
stop();
}
tick()
andrender()
函数调用处理程序,该处理程序处理所有对象。
private void tick() {
handler.tick();
}
Handler 类,完成了我添加的重绘对象。我在调用对象的刻度和渲染函数后添加了重绘,但都没有任何重大影响。
public class Handler {
LinkedList<GameObject> objects = new LinkedList<GameObject>();
public void tick() {
for (int i = 0; i < objects.size(); i++) {
GameObject object = objects.get(i);
object.tick();
object.repaint();
}
}
public void render(Graphics g) {
for (int i = 0; i < objects.size(); i++) {
GameObject object = objects.get(i);
object.render(g);
object.repaint();
}
}
}
因此,虽然这些更改似乎对我的程序中的口吃没有帮助,但其他一些事情却起到了作用——run 函数中的 print 语句,打印了一个简单的字符串。我无法终生思考这可能会如何影响任何事情,而且这当然不是永久解决方案,因此将不胜感激任何有关这种情况的建议
解决方案
推荐阅读
- java - 无法对 Spring RedirectView 进行单元测试引发断言错误
- glsl - GLSL Color XY 不是第一个时不起作用
- html - 为什么我看不到我的前伪元素和 idk 为什么后元素延伸过元素
- python - Asyncio.run 给出 RuntimeError 循环关闭
- java - 如何将 --headless 选项从使用 TestNG 运行 Selenium 测试的 Java 命令传递给 chrome?
- azure-devops - 如何从 Azure Devops Yaml Pipelines 的参数化 stepList 中引用参数?
- css - 更改 reactstrap 输入组件的边框颜色
- html - HTML里面的文本长度
标签与代码编辑器不同
- html - Google 字体不适用于 SCSS - 字体系列在 main.css 文件中编译,但在站点加载时不包含在内
- entity-framework - EF Core 等效于 ObjectContext.MetadataWorkspace