FPS Cap все еще вызывает мерцание - PullRequest
1 голос
/ 29 января 2012

Я использую ограничение FPS, которое нужно установить на 60 кадров в секунду.Я проверил это, и это работает.Проблема в том, что он все еще вызывает мерцание экрана.Мой монитор настроен на 60 кадров в секунду.Я не знаю, как это все еще вызывает мерцание.Вот мой код:

package com.bgp.chucknorris;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.net.URL;

public class ChuckNorrisApplet extends Applet implements Runnable {
    private static final long serialVersionUID = 1L;
    Thread thread = null;
    Image title;
    URL base;
    MediaTracker mt;
    String fps = "";

    public void init() {
        thread = new Thread(this);
        thread.start();

        mt = new MediaTracker(this);
        base = getDocumentBase();
        title = getImage(base, "title.png");
        mt.addImage(title, 1);
        try {
            mt.waitForAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    public void paint(Graphics g) {
        g.drawImage(title, 0, 0, null);
    }

    public void start() {
        if (thread == null) {
            thread = new Thread(this);
            thread.start();
        }
    }

    public void stop() {
        thread = null;
    }

    public void run() {
        int frames = 0;

        double unprocessedSeconds = 0;
        long lastTime = System.nanoTime();
        double secondsPerTick = 1 / 60.0;
        int tickCount = 0;

        requestFocus();

        while (true) {
            long now = System.nanoTime();
            long passedTime = now - lastTime;
            lastTime = now;
            if (passedTime < 0)
                passedTime = 0;
            if (passedTime > 100000000)
                passedTime = 100000000;

            unprocessedSeconds += passedTime / 1000000000.0;

            boolean ticked = false;
            while (unprocessedSeconds > secondsPerTick) {
                unprocessedSeconds -= secondsPerTick;
                ticked = true;

                tickCount++;
                if (tickCount % 60 == 0) {
                    System.out.println(frames + " fps");
                    fps = Integer.toString(frames);
                    lastTime += 1000;
                    frames = 0;
                }
            }

            if (ticked) {
                repaint();
                frames++;
            } else {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }

}

1 Ответ

0 голосов
/ 29 января 2012

Почему Applet (в отличие от JApplet)?Обратите внимание, что компоненты Swing имеют двойную буферизацию.

...