为什么使用同步方法进行动画?

时间:2015-11-20 21:34:03

标签: java android multithreading animation

我一直在阅读,Android游戏开发初学者指南 - James Cho和他使用同步方法进行动画类(帧的汇编)。这个动画将在游戏循环中运行,一个线程。我的问题是,如果只有主要和游戏循环线程,为什么必须同步这些Animation方法?

package com.jamescho.framework.animation;

import java.awt.Graphics;

public class Animation {

    private Frame[] frames;
    private double[] frameEndTimes;
    private int currentFrameIndex = 0;
    private double totalDuration = 0;
    private double currentTime = 0;

    public Animation(Frame... frames) {

        this.frames = frames;
        frameEndTimes = new double[frames.length];

        for (int i = 0; i < frames.length; i++) {

            Frame f = frames[i];

            totalDuration += f.getDuration();

            frameEndTimes[i] = totalDuration;
        }
    }

    public synchronized void update(float increment) {

        currentTime += increment;

        if (currentTime > totalDuration) {

            wrapAnimation();
        }

        while (currentTime > frameEndTimes[currentFrameIndex]) {

            currentFrameIndex++;
        }

    }

    private synchronized void wrapAnimation() {

        currentFrameIndex = 0;
        currentTime %= totalDuration; // equal to cT = cT % tD      
    }


    public synchronized void render(Graphics g, int x, int y) {

        g.drawImage(frames[currentFrameIndex].getImage(), x, y, null);      
    }

    public synchronized void render(Graphics g, int x, int y, int width, int height){

        g.drawImage(frames[currentFrameIndex].getImage(), x, y, width, height, null);       
    }
}

1 个答案:

答案 0 :(得分:0)

如果有多个线程(例如主/ UI线程和另一个后台线程),则有可能在某些时候不同的线程可能会尝试同时运行相同的方法并出现意外情况(有时/经常)不良后果。

Kaamel