低计算量java组件中的低fps

低计算量java组件中的低fps,java,performance,graphics2d,paintcomponent,Java,Performance,Graphics2d,Paintcomponent,我正在制作一个游戏,为了回答这个问题,我有一个扩展JFrame的类,它添加了一个扩展JPanel(GamePanel)的类。在GamePanel中,我有一个run方法,它有两个函数update();并重新绘制();然后是一根线。睡眠(20)。更新功能大约需要1-2毫秒。我在paintComponent(Graphics g)中有我所有的绘图工具,当我使用repaint()时,它似乎正确地被调用,因为这些工具显示在屏幕上 我的问题是它越来越滞后。当我没有Thread.sleep(20)时,它无法使

我正在制作一个游戏,为了回答这个问题,我有一个扩展JFrame的类,它添加了一个扩展JPanel(GamePanel)的类。在GamePanel中,我有一个run方法,它有两个函数update();并重新绘制();然后是一根线。睡眠(20)。更新功能大约需要1-2毫秒。我在paintComponent(Graphics g)中有我所有的绘图工具,当我使用repaint()时,它似乎正确地被调用,因为这些工具显示在屏幕上

我的问题是它越来越滞后。当我没有Thread.sleep(20)时,它无法使用2fps。我读到这是因为repaint()没有足够的时间来完成或做其他事情,所以我在下一个循环之前添加了一个延迟。任何高于或低于20毫秒的东西似乎都会使它更滞后

我尝试过使用图形配置、双缓冲等功能,但仍然很落后。我的家用电脑是英特尔i5四核3.2GHz,我的速度只有100fps左右,而在学校电脑上我的速度只有15fps左右(好的电脑,我相信像amd双核一样)。paintComponent循环超轻!只需根据玩家位置绘制带有偏移量的地图,然后在屏幕中间绘制玩家!我使用的地图是2000x2000,0.8mb。尝试切换到1000x1000 0.4mb,无差异

代码如下:

@Override
public void paintComponent(Graphics g) {
    //Rendering settings and stuff
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

    //Draw map     gameMap.gameMap is a bufferedImage
    g2d.drawImage(gameMap.gameMap, gameMap.x, gameMap.y, null);
    //Draw health bar
    g2d.setColor(healthBarColor);
    g2d.setComposite(alphaHealthBarBackground);
    g2d.fillRect(100, 19, 200, 23);
    g2d.setFont(font);
    g2d.setComposite(alphaNormal);
    g2d.setColor(healthBarColor);
    g2d.drawString("HP: ", 20, 40);
    g2d.fillRect(100, 19, player.health * 2, 23);

    //Draw player      player.playerImage is a BufferedImage
    rotatePlayer.setToRotation(rotation, rotationAnchor.x, rotationAnchor.y);
    rotatePlayer.translate(xResolution / 2, yResolution / 2);
    g2d.drawImage(player.playerImage, rotatePlayer, this);
    g2d.setColor(Color.white);
}

这导致在相对可怕的计算机上每秒100帧,在下降计算机上每秒15帧

嗯,对于游戏开发,我不认为在Swing paintComponent中绘制一个巨大的图像会赢得任何速度记录。100 FPS仍然令人惊讶(比大多数LCD显示器的刷新率高出40 FPS左右)

为了提高速度,必须加速正在使用的图形基本体。在你的学校电脑上,他们可能只是缺少一个像样的图形卡来提供所需的2D加速(这些电脑在浏览器和绘画程序中进行正常的2D操作感觉如何?)


您可能希望研究一个使用OpenGL的框架,比如JOGL。另一个选择是试用JavaFX2——它可能有更好的渲染管道。

好吧,对于游戏开发来说,我不认为在Swing paintComponent中绘制巨大的图像会赢得任何速度记录。100 FPS仍然令人惊讶(比大多数LCD显示器的刷新率高出40 FPS左右)

为了提高速度,必须加速正在使用的图形基本体。在你的学校电脑上,他们可能只是缺少一个像样的图形卡来提供所需的2D加速(这些电脑在浏览器和绘画程序中进行正常的2D操作感觉如何?)


您可能希望研究一个使用OpenGL的框架,比如JOGL。另一个选择是试用JavaFX2——它可能有更好的渲染管道。

不要假装是最终的解决方案,只是一些提示:

  • 确保缓冲图像的颜色模型与它们所绘制的
    图形设备的默认颜色模型相同。该方法可以创建这样的图像

  • 如果可能的话,试着将整个巨大的地图分割成平铺,并跳过屏幕外(游戏视图外)部分的渲染

  • 您似乎使用了被动渲染,正如您提到的调用
    repaint()
    。事件调度线程用于Swing和AWT中的许多事情,它不能保证主动渲染游戏的可接受时间。也许重新设计游戏的渲染部分以使用活动渲染是值得的。可以找到教程和示例


  • 不是假装是终极解决方案,只是一些提示:

  • 确保缓冲图像的颜色模型与它们所绘制的
    图形设备的默认颜色模型相同。该方法可以创建这样的图像

  • 如果可能的话,试着将整个巨大的地图分割成平铺,并跳过屏幕外(游戏视图外)部分的渲染

  • 您似乎使用了被动渲染,正如您提到的调用
    repaint()
    。事件调度线程用于Swing和AWT中的许多事情,它不能保证主动渲染游戏的可接受时间。也许重新设计游戏的渲染部分以使用活动渲染是值得的。可以找到教程和示例


  • 我还在开发一个Java游戏,做了许多与您相同的事情(扩展JPanel并调用repaint()。一个区别是,我使用javax.swing.Timer调用ActionPerformed(ActionEvent e)方法,每5毫秒更新一次游戏。在方法的末尾,它调用repaint()进行渲染

    另外,如果您使用Graphics2D进行渲染,您可以使用渲染提示来指导计算机如何渲染游戏(例如,速度或质量等)

    我没有精确测量FPS,但我在Ubuntu 12.10系统上没有延迟,在Windows 8上只是稍微慢了一点


    如果我的回答不完全符合您的要求,我深表歉意,但到目前为止,这对我来说毫无问题。

    我还在开发一款Java游戏,并且做了许多与您相同的事情(扩展JPanel并调用repaint())。一个区别是,我使用javax.swing.Timer调用ActionPerformed(ActionEvent e)方法,每5毫秒更新一次游戏。在方法的末尾,它调用repaint()进行渲染

    另外,如果您使用Graphics2D进行渲染,您可以使用渲染提示来指导计算机如何渲染游戏(例如,速度或质量等)

    我没有精确测量FPS,但我在Ubuntu 12.10系统上没有延迟,在Windows 8上只是稍微慢了一点


    如果我的回答不完全符合您的要求,我深表歉意,但这是迄今为止对我有效的回答,没有任何问题。

    这幅
    画的究竟有多大?“在下降计算机上每秒15帧!”如果它下降到地狱,这是可以理解的,因为“它要下地狱了”。)好吧,如果我理解你的话,那么正在绘制的“这个”与屏幕大小一样大。