我开始考虑我的游戏的多线程,最好的起点是将游戏的三个主要组件分离:逻辑,gfx,sfx,分成三个独立的线程。问题是它们都需要访问相同的实体hashmap,因为逻辑上,gfx和sfx是完全分离的。
private Map<String, Entity> entities;
private Map<String, GameSound> sounds;
private Map<String, ArrayList<BufferedImage>> images;相同的hashmap被传递给不同的类,多线程很可能会导致对象损坏。目前SoundsEngine是一个线程的(否则音乐暂停在Thread.sleep()之间,这是好的,因为它不会改变,它只是读。
有没有一种简单的方法(不会对性能造成严重影响)来实现线程安全的HashMap,而不需要在我的代码中添加synchronized (这样可能会引入更多的bug)?我想过每隔60帧进行一次浅拷贝,因为这是我的游戏中任何东西都会改变的最大速率,并在gameloop中将拷贝传递给不同的引擎,但这似乎有些“老生常谈”。
工厂中的构造函数显示了并发问题:
public class Factory {
private Map<String, Entity> entities;
private Map<String, GameSound> sounds;
private Map<String, ArrayList<BufferedImage>> images;
private GameEventListener listener;
private GameFrame frame;
private ImageLoader Iloader;
private SoundLoader Sloader;
public Factory() {
this.Iloader = new ImageLoader("imagelist.txt", images);
this.Sloader = new SoundLoader("soundlist.txt", sounds);
this.frame = new GameFrame(Color.black);
this.listener = new GameEventListener();
}
public GameEngine createGameEngine() {
return new GameEngine(entities, images, sounds);
}
public SoundEngine createSoundEngine() {
return new SoundEngine(entities, sounds);
}
public GraphicsEngine createGraphicsEngine() {
return new GraphicsEngine(entities, frame);
}
}编辑:单例不是一个选项,在以前的游戏中已经这样做了,我想学习一种更“松散”的设计,在这种设计中,我可以独立开发引擎,而不会因为我的状态错误而破坏一些东西。
发布于 2013-04-09 02:10:38
如果您想要获得Hashmap的同步版本,那么您可以使用java.util.Collections类的以下内置方法:
Map m = Collections.synchronizedMap(new HashMap(...));除此之外,java.util.concurrent.ConcurrentHashMap对你来说是一个更好的选择。
发布于 2013-04-09 03:49:35
使用ConcurrentHashMap更好,因为它不使用同步块。它是如此的高效和快速。Collections.synchronizedMap是一个代理,其中将在每个方法调用中添加一个同步块。
https://stackoverflow.com/questions/15885891
复制相似问题