我在java中创建了一个2D游戏,并试图将其分辨率提高到60 fps,分辨率为1920x1080像素。我的游戏逻辑在不到1毫秒的时间内表现良好。但是绘图需要超过10毫秒。在我相当强大的台式机(英特尔i5-4670K@3.40Ghz)上这可能就足够了,但是在我的笔记本电脑(英特尔i5-6300HQ@2.30Ghz)上,游戏已经慢了很多。绘图分为两个主要步骤:
>
将游戏的每个部分绘制到BuffereImage上
在扩展的JPanel类中绘制BuffereImage
相应的代码如下:
@Override
public void run() {
init();
long startTime;
long elapsedTime;
long waitTime;
while(running) {
startTime = System.nanoTime();
update();
long updateTime = (System.nanoTime() - startTime) / 1000000;
draw();
long drawTime = (System.nanoTime() - startTime) / 1000000;
drawToScreen();
long drawscreenTime = (System.nanoTime() - startTime) / 1000000;
elapsedTime = System.nanoTime() - startTime;
waitTime = targetTime - elapsedTime / 1000000;
if(waitTime < 0) {
waitTime = 0;
}
try {
Thread.sleep(waitTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void init() {
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice device = env.getDefaultScreenDevice();
GraphicsConfiguration config = device.getDefaultConfiguration();
image = config.createCompatibleImage(1920, 1080, Transparency.TRANSLUCENT);
g2d = (Graphics2D) image.getGraphics();
running = true;
gsm = new GameStateManager(this);
}
public void update() {
gsm.update();
Keys.update();
}
public void draw() {
gsm.draw(g2d);
}
public void drawToScreen() {
Graphics g = getGraphics();
g.drawImage(image, 0, startDrawY, scaledWidth, scaledHeight, null);
g.dispose();
}
draw和drawToScreen方法都需要5毫秒。在draw方法中,最慢的部分是绘制背景图像(1920x1080图像)和绘制关卡(由几个135x135图像组成),两者都需要几毫秒的时间。
现在我有两个问题:对于这样的大图像,这种绘制速度正常吗?如果不是的话,我可能做错了什么,或者如何提高绘图性能?
Java的核心库不是用于高效的图形渲染,而是用于用户界面。JavaFX支持硬件加速。如果需要对图形进行微调,请参阅LWJGL或LibGDX。LibGDX具有更高级别的抽象,而LWJGL直接绑定到OpenGL、OpenGLES和Vulkan API。
如果不想使用这些库,Java可以启用硬件加速。据我所知,它不是默认启用的。您需要向JVM添加以下参数:
-Dsun。java2d。opengl=true
如果您只是渲染一个图像,继续使用BufferedImage是可以的。但是,如果您经常编辑图像,请考虑使用VolatileImage
来代替。
这是关于我对加速Java2D游戏的了解程度。我建议大家看看这个问题。回答者似乎非常博学,在同一个话题上比我更深入。
我正在开发一个基于2D图块的游戏,其中所有图块旋转45度。 我想这样做: 原因是为了在2D游戏中创建不同的视角。 有相当多的基于瓷砖的游戏教程,但我不知道有像这样的旋转瓷砖。 所以我的问题是:如何创建旋转45度的瓷砖?我会感谢任何代码或链接。 编辑:忘了说我用的是Java Graphics2D,不是OpenGL
我正在做一个2D平台,只是增加了重力 然而,如果空格键在玩家完成跳跃后仍然被按住,玩家就会在半空中继续跳跃。 我知道我需要检查球员是否真的在地面上,但当我这样做时,它总是返回“false”,如我的跳跃方法所述:
问题内容: 我在Java2D方面表现有些古怪。我知道sun.java2d.opengl VM参数可以为2D启用3D加速,但是即使使用该参数也有一些奇怪的问题。 这是我运行的测试结果: 在JComponent上绘制具有32x32像素图块的25x18地图, 图像1 = .bmp格式,图像2 = .png格式 没有-Dsun.java2d.opengl = true 使用.BMP图像1的120 FPS使
我正在克隆一只松鸡。我表现得很好:每秒60帧。当时它只有一根柱子/障碍物。我一加上3个,fps就降到了30及以下。那么游戏现在就不能玩了。我知道这与一直在做有关。 以下是代码: 完整的项目来源 还要记住这是真正的未抛光版本,所以代码很难看。我正在寻找提升性能的解决方案。 主类: 框架类别: 支柱/支柱类: Ptica/Brid等级: Util类:
我们都知道MMO游戏的流行趋势。玩家面对面直播。 我关心的领域是玩家移动和游戏结果的存储。 通过NPGSQL适配器使用Csharp和PostgreSql v9.0 游戏客户端是基于浏览器的ASP.NET并调用所有与数据库相关的处理 为了理解我的查询,请考虑以下场景 我们将游戏进度存储在postgres表中。 例如,锦标赛从四名玩家开始,并遵循以下活动 < li >每个玩家从100点生命值开始 <
我的问题是,我需要制作一个不断更新的GUI,因为我得到的值可以从数据库中更改,并且我在图形区域中遇到了一些问题。 我使用Graphics2D中的Drawline和Drawstring打印数据库中的值,这些字符串和线条移动并更改值,所以我需要调用repaint();使用计时器使它们出现在jpanel中,问题是repaint();不是在绘制之前移除背景中的旧绘画,而是当我完全调整所有更新的大小时。 我