【发布时间】:2020-03-11 19:28:40
【问题描述】:
我目前正在开发一个使用 LWJGL 的 2D 游戏,但我偶然发现了一些严重的性能问题。 当我渲染超过 100 个精灵时,窗口会冻结很短的时间。我做了一些测试,我发现了以下内容:
- 启用或禁用 Vsync 都会出现问题
- 即使我将帧设置为 60 也会出现问题
- 程序不只是在短时间内渲染较少的帧,渲染似乎实际上暂停了
- 没有其他操作(如矩阵计算)会减慢程序速度
- 我已经实现了批量渲染,但似乎并没有提高性能
- 冻结的频率随着 Sprite 的数量而增加
- 我的显卡驱动程序是最新的
我使用一个非常基本的着色器,转换矩阵通过统一变量传递给着色器每次渲染调用(每帧每个精灵一次)。 CPU/GPU 总线的大小应该不是问题。
我发现了一个非常相似的问题here,但建议的解决方案都不适合我。
这是我在这里的第一个问题,如果我遗漏了一些重要信息,请告诉我。
【问题讨论】:
-
这可能是由于垃圾回收周期造成的。使用
-verbose:gc启动 JVM 或使用内存分析器获取有关垃圾收集发生及其暂停时间的信息。 -
@httpdigest 谢谢你的回答,垃圾收集实际上是问题所在。当我每次更新都运行 System.gc() 时,不再发生冻结,但帧率明显降低,因为 gc 每次更新需要 0.005 秒。这里可能是什么问题?如何找出哪些对象不断填满堆?
-
使用内存分析器来识别热路径中过多的对象分配(“热路径” = 每帧调用频率最高的调用树)。
标签: java performance graphics game-engine lwjgl