Как отображать кадры в секунду в апплете Java в Eclipse? - PullRequest
2 голосов
/ 31 июля 2011

Это простой прыгающий мяч и я мог бы отображать FPS во время работы программы

import java.awt.*;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;

public class BallApplet extends Applet implements Runnable {
   private int ballX, ballY;
   private final int radius = 50;

   public void start1() {
      Thread th = new Thread(this);
      th.start();
   }

   @Override
   public void run() {
      int dx = 2;
      int dy = 2;
      int speed = 2;
      // This will reduce the load the applet has on the runtime
      // system..

      Thread.currentThread().setPriority(…
      while (true) {
         ballX += dx;
         ballY += dy;
         repaint();
         if (ballX + radius > getWidth())
            dx = -speed;
         else if (ballX < 0)
            dx = speed;
         if (ballY + radius > getHeight())
            dy = -speed;
         else if (ballY < 0)
            dy = speed;
         try {
            Thread.sleep(20);
         } catch (InterruptedException ie) {
         }
      }
   }

   // set up BallApplet object
   public void init() {
      ballX = 0;
      ballY = getHeight() / 2;
   }

   // Drawing instructions…
   public void paint(Graphics g) {
      super.paint(g);
      g.setColor(Color.red);
      g.fillOval(ballX - radius, ballY - radius, 2 * radius, 2 * radius);
   }

   // The standard Applet “GO” function…
   public void start() {
      Thread th = new Thread(this);
      th.start();
   }
}

Спасибо, Лохи

Ответы [ 2 ]

1 голос
/ 01 августа 2011
long nextSecond = System.currentTimeMillis() + 1000;
int frameInLastSecond = 0;
int framesInCurrentSecond = 0;


public void paint() {
    // ... other drawing code goes here

    long currentTime = System.currentTimeMillis();
    if (currentTime > nextSecond) {
        nextSecond += 1000;
        frameInLastSecond = framesInCurrentSecond;
        framesInCurrentSecond = 0;
    }
    framesInCurrentSecond++;

    g.drawString(framesInLastSecond + " fps", 20, 20);
}

Кстати, ваш код не является потокобезопасным: поскольку paint() вызывается из потока диспетчеризации событий, а run() в запущенном вами потоке, методы должны синхронизировать доступ к общему состоянию (поляBallApplet).

Также обратите внимание, что paint() будет вызываться, если часть окна, которая ранее была закрыта другим окном, должна быть перекрашена.Приведенный выше код будет считать это как "кадр".Если вы этого не хотите, вы не должны запускать рисование, используя repaint().

0 голосов
/ 31 июля 2011

У вас один кадр появляется каждые 20 миллисекунд или 50 кадров в секунду. Однако из-за характера Thread.sleep() он может быть короче или длиннее 20 миллисекунд между каждым кадром.

Если вы хотите отобразить 50 кадров в секунду, посмотрите на JLabel.

/ e1
Почему у вас есть два метода (start() и start1()), которые делают одно и то же?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...