我一直在尝试了解如何为 Java 中的多人游戏实现客户端-服务器系统。我现在处于“和解”部分,并认为使用 aConcurrentSkipListMap
可能是最好的数据结构,但我从来没有搞砸过。
我正在努力理解如何有效地使用该类:什么是Big-O
操作,哪些操作对于线程访问来说是最快或更安全的,等等。
例如,这里有一段摘录:
public class StateRecords {
/**
* The {@link Long} is the Timestamp of the server's generated GameStateDto (Objects here, for simplicity's sake).
*/
private ConcurrentNavigableMap<Long, Object> localRecord = new ConcurrentSkipListMap<>();
public StateRecords() {
}
public void discardUpTo(Long timestamp) {
/* 1) One possible way to do it. */
Long lowerKey = localRecord.lowerKey(timestamp);
while(lowerKey != null) {
localRecord.remove(lowerKey);
lowerKey = localRecord.lowerKey(timestamp);
}
/* 2) Another possible way to do it. */
localRecord.headMap(timestamp).forEach((k,v) -> localRecord.remove(k));
/* 3) Yet some other solution. */
localRecord.headMap(timestamp).clear();
/* 4) I believe that one is wrong. */
localRecord = localRecord.tailMap(timestamp, true);
}
}
我试图找出删除所有键低于方法输入的条目的最佳方法。客户端的网络线程和 ui 渲染线程都可以同时访问这个结构(或者至少,这是我目前所想的)。
任何见解都会有所帮助。