2015-11-20 4 views
0

Я читал, Руководство для начинающих по разработке 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);  
    } 
} 

ответ

0

Если есть более чем один поток (например, основной/поток пользовательского интерфейса, а другой фоновый поток), то есть шанс, что в какой-то момент различные потоки могут попытаться выполнить тот же самый метод, в то же время с неожиданные и (иногда/часто) нежелательные последствия.

Kaamel

+0

Я вижу, что может быть возможность, однако, основной поток не вызывает этот метод, так как это может помешать ему? – reddead

+0

Если есть только один поток, который вызывает метод, и нет другого способа одновременного вызова второго метода, вам не нужно будет беспокоиться о синхронизации, и вам не нужно, как вы предложили. Это ваш код, поэтому вы тот, кому нужно позвонить. Если вы просто скопировали/вставили его из другого места, возможно, в их случае понадобилось многопоточность (или была закодирована для будущей проверки). – Kaamel

+0

Проблема заключается не в том, что несколько потоков выполняются одним и тем же * методом *, это с несколькими чтениями потоков и написав те же * поля *. Все эти методы получают доступ к определенным полям (например, 'currentFrameIndex'). Если какой-либо метод может быть вызван из другого потока, требуется некоторая форма синхронизации. – fadden

Смежные вопросы