Я читал, Руководство для начинающих по разработке Android-игр - Джеймс Чо, и он использует синхронизированный метод для класса анимации (компиляция фреймов). Эта анимация будет запущена внутри игрового цикла, потока. Мой вопрос в том, почему необходимо, чтобы эти методы 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);
}
}
Я вижу, что может быть возможность, однако, основной поток не вызывает этот метод, так как это может помешать ему? – reddead
Если есть только один поток, который вызывает метод, и нет другого способа одновременного вызова второго метода, вам не нужно будет беспокоиться о синхронизации, и вам не нужно, как вы предложили. Это ваш код, поэтому вы тот, кому нужно позвонить. Если вы просто скопировали/вставили его из другого места, возможно, в их случае понадобилось многопоточность (или была закодирована для будущей проверки). – Kaamel
Проблема заключается не в том, что несколько потоков выполняются одним и тем же * методом *, это с несколькими чтениями потоков и написав те же * поля *. Все эти методы получают доступ к определенным полям (например, 'currentFrameIndex'). Если какой-либо метод может быть вызван из другого потока, требуется некоторая форма синхронизации. – fadden