Мерцание изображения Java

По поиску в Google я вижу, что этот вопрос часто задают, но ни одно из найденных мной решений не помогает мне. Знаете, я делаю игру на Java с изображениями, потому что в играх обычно есть такие вещи. Но вся форма постоянно мерцает, и я не могу заставить ее остановиться. Да, я дважды буферизовал его и переопределил метод update (), и, хотя это определенно помогло, мерцание все еще сохраняется. Не знаю, делаю ли я что-то не так с двойной буферизацией или мне нужно что-то совсем другое.

Сначала я подумал, что, возможно, это как-то связано со строкой clearRect (), но после ее удаления игра все еще мерцала, но, конечно, не очищалась каждый раз. Так что это совсем не помогло. При замедлении таймера мерцание почти полностью исчезает, но мне нужно замедлить его до 100 мс, и даже тогда мерцание все равно немного. Кроме того, это слишком медленно для игры. Я пробовал, чтобы один таймер делал все с таймером 10 мс, а другой - на 100 мс для рисования, но тогда это выглядело неаккуратно. Я могу замедлить таймер рисования примерно до 30 мс, и он по-прежнему будет плавным, хотя мерцание по-прежнему остается проблемой.

Должен быть способ делать это каждые 10-30 мсек без мерцания. Есть ли другой метод, похожий на двойную буферизацию, но лучше в этом случае, или что-то, что я могу использовать? Заранее благодарю за любую помощь.

public class main extends JApplet implements ActionListener {
    //This Declares The Variables
    Graphics2D buffer;
    Image offscreen;
    Timer timGame = new Timer(10, this);
    //other variables

    public void init(){
        //This Creates The Offscreen Buffer Zone
        offscreen = createImage(getSize().width, getSize().height);
        buffer = (Graphics2D)offscreen.getGraphics();
        //other initialization stuff irrelevant to drawing
    }

    public void actionPerformed(ActionEvent evt){
        if (evt.getSource() == timGame)
            runGame();
    }

    private void runGame(){
        //Do stuff, move objects
        repaint();
    }

    public void paint(Graphics g){
        super.paint(g);

        buffer.clearRect(0, 0, getSize().width, getSize().height);
        //draw stuff to buffer
        g.drawImage(offscreen, 0, 0, this);
    }

    public void update(Graphics gr){
        paint(gr);
    }

person Doug    schedule 04.05.2012    source источник
comment
возможный дубликат JApplet - super.paint (); вызывает мерцание   -  person Hovercraft Full Of Eels    schedule 04.05.2012
comment
Вы видите разрыв синхронизации при попытке обновить экран слишком быстро? ? Частота обновления 60 Гц составляет около 17 мс на кадр ...   -  person sarnold    schedule 04.05.2012
comment
Очистка строки super.paint () устранила проблему. Я знал, что это такая глупость. Думаю, это то, что я получаю, когда рисую его нормально, а потом возвращаюсь, чтобы удвоить буфер. Я также посмотрю на PaintComponent, хотя сейчас я немного занят, чтобы посмотреть на него. Надеюсь, это тоже может помочь, хотя, по крайней мере, сейчас мерцание полностью прекратилось. Я даже могу увеличить таймер до 10 мс :) Большое спасибо.   -  person Doug    schedule 04.05.2012


Ответы (1)


Не рисуйте прямо в методе paint(...) окна верхнего уровня, такого как JApplet или JFrame, поскольку вы теряете всю двойную буферизацию и все «полезности» Swing. Вместо этого нарисуйте метод paintComponent(...) JPanel или другого компонента, производного от JComponent (включая сам JComponent), который вы добавляете в JApplet.

Если вы выполните поиск по этой теме здесь или в Google, вы увидите, что на этот и на других сайтах много раз задавали вопросы и отвечали на них, и ответ будет тем же.

e.g.

person Hovercraft Full Of Eels    schedule 04.05.2012