java - 一个简单的 Java2D 应用程序的可怕性能

标签 java performance java-2d

我刚刚完成 my entry为了昨天第 14 届 Ludum Dare 48 小时游戏制作比赛,并决定在 java 中使用 java2d 进行图形制作。

我不太熟悉 API,也没有做过很多图形编程,但我的游戏很小(只有十几个非常小的移动物体)所以我认为我可以天真地编写它并且仍然没有遇到任何性能问题。

不用说,我错了。游戏大部分时间都运行良好,但一旦屏幕上移动的“敌人”太多或分辨率调得太高,游戏就会开始明显变慢。

我确定性能瓶颈是屏幕绘制功能,当这些功能被注释掉时,游戏速度非常快。

有人可以提醒我这里可能做错了什么吗? (非常短的)源代码位于 here其中大部分Main类,通常的嫌疑人是 draw()inner game loop 中调用的函数.

我已经使用了 BufferStrategy更新屏幕,所以这应该不是问题,除非我做错了。

提前致谢, 伊多。

最佳答案

一些观察,尽管我认为它们中的任何一个都不会有太大帮助。

最主要的是您正在绘制 AWT 线程。覆盖 paintComponent() 并改为在对象上调用 repaint() 。否则这可能会导致各种问题。

您每帧都重新创建颜色。这可能是也可能不是您想要缓存的内容之一。我不认为为你的颜色设置常量可能会搞砸 GC,并且当你以后想重用颜色时会让事情更容易保持直线。

你每帧重绘整个窗口。您只需重新绘制更改的部分。

您不需要绘制背景。设置背景颜色,让家长来处理一切。

作为一种设计, body 应该负责自己绘制。它们的主人应该通知它们需要被绘制而不是绘制它们。

body 每次都会重建它们的状态。考虑让他们在不同时间存储它并根据需要改变它们。您可能会花费大量时间在 drawCircleBody() 中进行三角计算

需要考虑的是设置计时器而不是在 while 循环中使用 sleep 。这将使您获得更一致的帧速率,但您需要确保您确实能够履行您的义务(或者如果您错过了最后期限,则将多个帧合并为一个帧),否则您最终会创建太多线程。

考虑使用 SwingWorker进行计算,然后在 done() 方法中更新状态,通过调用 repaint() 完成。

这些只是一些事情。您应该尝试看看哪些有效,哪些无效。好久没做过Java图形绘制了。

关于java - 一个简单的 Java2D 应用程序的可怕性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/768871/

相关文章:

Java——继承、带有方法的类

Java 绘图形状 "*"

asp.net - 您如何分析生产 ASP.NET 应用程序?

java - 如何使渐变背景颜色更平滑

java - Spring Data 方法名称中的关键字优先级

java - 按每个数字与其索引的乘积对整数数组进行排序?‽

performance - 如何避免循环中的条件

java - rxJava 中的开销

java - 在Java中沿着曲线写入文本

java - 二维数组java中的最小值和最大值