做java游戏时,为什么出现画面卡顿的问题?

最近小编在做 Java 小游戏时,遇到了一个问题,我让人物动起来时,画面卡到惨不忍睹。
这是为什么呢?

后来百度了一下,发现是需要用到双缓冲

它主要是和线程的睡眠时间有关,睡眠时间越短,闪烁显现就越严重。是因为显示器的刷新频率高于程序。paint方法还没有来得及画完整幅画面,所以就出现了闪烁问题。

这里我们就需要使用双缓冲消除,先把所有东西画在虚拟屏幕上 , 前面什么都不画,然后一次性把画好的内容显示出来。
所谓双缓冲,就是在内存中开辟一片区域,作为后台图象,程序对它进行更新、修改,绘制完成后再显示到屏幕上。  
重载update(Graphics g)方法
  public void update(Graphics g)
       {
    	         GraphicsDemo.screenImage = this.createImage(15*30, 15*30);
   		 Graphics gps = GraphicsDemo.screenImage.getGraphics();
    	         Color c = gps.getColor();
   	   	 gps.setColor(Color.GRAY);
   		 gps.fillRect(0, 0,800,600);
   		 gps.setColor(c);
   	 	 paint(gps);
   		 g.drawImage(GraphicsDemo.screenImage, 0, 0, null);   
       }
	   
	   public void paint(Graphics g)
	   {
		  
		   super.paint(g); //调用super.paint(g)去清楚运动的痕迹
		   int i,j;
		   Image img = Toolkit.getDefaultToolkit().getImage("images\\metalWall.png");
	           Image img1 = Toolkit.getDefaultToolkit().getImage("images\\enemy_2.gif");
	           Image img2 = Toolkit.getDefaultToolkit().getImage("images\\dot.gif");
		   Image img3 = Toolkit.getDefaultToolkit().getImage("images\\eater_0_2.gif");
		   Font f = g.getFont();
		   g.setFont(new Font("TimesRoman" , Font.BOLD , 20));
		   g.drawString("剩余生命值: ", 500, 70);
		   String count1 = " " +GraphicsDemo.count;
		   g.drawString(count1 ,610, 70);
		   for( i = 0;i<15;i++)
		   {
			   for( j = 0; j<15;j++)
			   {
				   if(GraphicsDemo.map[i][j] == 1)     
				   {
					  // g.drawRect((j)*30, (i)*30, 30, 30);
					   //将围墙画上去
				       g.drawImage(img, (j)*30, (i)*30, 30, 30, Color.LIGHT_GRAY, this);
				   }
				   if(GraphicsDemo.map[i][j] == 2)
				   {
					    //先将一个敌人画上去
					    g.drawImage(img1, (j)*30, (i)*30, 20, 20, Color.LIGHT_GRAY, this);
				   }
				   if(GraphicsDemo.map[i][j] == 4)
				   {
					    //将点画上去
					    g.drawImage(img2, (j)*31, (i)*31, 6, 6, Color.LIGHT_GRAY, this);
				   }
				   if(GraphicsDemo.map[i][j] == 3)
				   {
					   
					   g.drawImage(img3, (j)*30, (i)*30, 20, 20, Color.LIGHT_GRAY, this);
				   }
				   
			   }
			 
		   }
		   repaint();
		   
		  try {
			   Thread.sleep(10);
	
		   }catch(InterruptedException e)
		   {
			   e.printStackTrace();
		   }
		   
	   }

第一次没有加super.paint(g)时,发现运行时还是会出现闪烁情况,后面运行后就可以了。小编特意把repaint() 和try块分别注释发现不会有影响,最关键的问题在与super.paint(g);


猜你喜欢

转载自blog.csdn.net/qq_41795427/article/details/80378680
今日推荐