我开始考虑为我的游戏进行多线程处理,最好的起点是将游戏的三个主要组成部分:逻辑,gfx,sfx分成3个单独的线程。问题是他们都需要访问相同的hashmap
实体,因为逻辑,gfx和sfx彼此完全分开。
private Map<String, Entity> entities;
private Map<String, GameSound> sounds;
private Map<String, ArrayList<BufferedImage>> images;
相同的散列映射会传递给不同的类,并且对象损坏很可能是多个线程。目前SoundsEngine
是一个线程(否则音乐在Thread.sleep()
之间暂停,这很好,因为它不会改变,它只是读取。
实现线程安全HashMap
是否有一种简单(而不是强硬的性能)方法,而不是在我的代码中添加同步(并且可能以这种方式引入更多错误)?我考虑每60帧拍一张浅色副本,因为这是我游戏中任何东西都会改变的最大速率,并将游戏环境中的副本传递给不同的引擎,但这似乎是一个遗憾&#34; hacky&#34;。
并发问题由工厂中的构造函数显示:
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);
}
}
编辑:Singletons不是一个选项,已经在之前的游戏中做过,我想学习更多&#34;松散&#34;我可以独立开发发动机而不会破坏某些东西的设计,因为我的状态是错误的。
答案 0 :(得分:4)
如果您想获得Hashmap的同步版本,那么您可以使用java.util.Collections
类的以下内置方法:
Map m = Collections.synchronizedMap(new HashMap(...));
除此之外java.util.concurrent.ConcurrentHashMap
对你来说是更好的选择。
答案 1 :(得分:1)
使用ConcurrentHashMap更好,因为它不使用synchronized块。它更有效,更快捷。 Collections.synchronizedMap是一个代理,其中将同步块添加到每个方法调用。