[英]Java Canvas repaint() is flickering
所以我終於讓 Canvas 以我想要的方式工作,但它不斷閃爍,repaint() 每秒運行 20 次,當我讓它每秒運行 10 次時,閃爍確實減少了。
package pd.data;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import pd.areas.MainMenu;
@SuppressWarnings("serial")
public class Main extends JFrame implements Runnable {
private JPanel contentPane = new JPanel();
private Thread gameThread = new Thread(this);
public boolean running = false;
@SuppressWarnings("unused")
private int current = PDU.PD_MAIN_MENU;
private MainMenu mainmenu;
public Main() {main.setTitle("PD");
main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
main.setLocation(SPU.screenWidth / 2 - SPU.windowSize.width / 2,
SPU.screenHeight / 2 - SPU.windowSize.height / 2);
main.setResizable(false);
main.setVisible(true);
contentPane.setLayout(new BorderLayout(0, 0));
contentPane.setPreferredSize(SPU.windowSize);
main.setContentPane(contentPane);
main.pack();
mainmenu = new MainMenu();
contentPane.add(mainmenu, BorderLayout.CENTER);
this.gameThread.start();
}
@Override
public void run() {
running = true;
while (running) {
{
mainmenu.repaint();
}
try {
Thread.sleep(SPU.TSU);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Main();
}
}
下面是我的 MainMenu 類:
package pd.areas;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
@SuppressWarnings("serial")
public class MainMenu extends Canvas{
BufferedImage img = null;
public MainMenu() {
this.setBackground(Color.BLACK);
}
public void paint(Graphics graphics){
try {
img = ImageIO.read(this.getClass().getResource(
"/image.png"));
} catch (IOException e1) {
e1.printStackTrace();
}
graphics.drawImage(img, this.getWidth() / 2 - img.getWidth()/2, 50, null);
}
}
雖然閃爍實際上是一個不錯的效果,但它會影響整個畫布,而不僅僅是我猜測的圖像,我該如何修復閃爍?
paintComponent
將是super.paintComponent(graphics)
盡管這個帖子是 5 年前開放的,但對於 Java SE 的新手來說,它仍然是一個問題。
我自己在 Canvas 上也遇到了同樣的問題,但我沒有足夠的信心切換到 javax 組件,因為我想起了一個名為 JVLC 的 VLC 項目,它使用 Canvas 完美呈現視頻(授予 jvlc 使用一些本機代碼)。
提示 1:也許最好試試 JPanel。
提示2:在游戲系統中,最好使用游戲引擎(它會為您節省大量時間)。
提示 3:在游戲系統中,實現 fps 機制而不是在每次更改時調用 repaint()。
技巧 4:如果你必須在你的paint() 實現中調用超過10 行的代碼,你會減慢它的速度。 最好為您需要對應用程序進行的每個圖形更改繪制到 BufferedImage,然后讓paint() 實現本身僅繪制圖像本身。 這應該可以很好地與 fps 機制配合使用,並將減少任何閃爍的機會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.