当我试图将游戏的整个地图加载到内存中时,它比我想要的要大一些。我试图将地图分成几块。我的游戏地图以逗号分隔。地图字符串的示例部分:" 0,0,35,32,3,3,0,0,"。
目前我正在使用以下内容,但需要9秒钟(我的地图很大)。
String[] mapArr = map.split(", ");
short[] groundLayer = new short[chunkWidth * chunkHeight];
//code that fills in the groundLayer array
如果玩家在一个方向上行走太远,则在游戏中等待9秒将无效。
我的想法是做一些我从地图字符串'从逗号(int firstComma)到逗号(int lastComma)。
firstComma = characterX + (characterY * mapWidth);
lastComma = firstComma + (chunkWidth * chunkHeight);
然后我会分裂(",")只产生子串。这是一个表现明智的好主意吗?
做这样的事情最有效的方法是什么?子串,正则表达式,indexOf,有什么不同?任何帮助都会非常感激。
编辑 提供以下更多背景信息:
我的地图由多个图层组成,我使用了“Tiled'绘制/导出它们。以下是我从文件中读取并将其保存为短数组的方法。我没有拆分整个地图字符串,而是试图只从字符X拆分为字符Y。
try {
String map = readFile("res/images/tiles/MyFirstMap-building-p.json");
String[] strArr = map.split(", ");
buildingLayer = new short[chunkWidth * chunkHeight];
short arrayIndex = 0;
for(short y = 0; y < chunkHeight; y++) {
for(short x = 0; x < chunkWidth; x++) {
//get the absolute position of the cell
short cellX = (short) (characterX + x - chunkWidth / 2);
short cellY = (short) (characterY + y - chunkHeight / 2);
if(cellX >= 0 && cellX < mapWidth && cellY >= 0 && cellY < mapHeight) { //within bounds
buildingLayer[arrayIndex] = Short.parseShort(strArr[cellX + (cellY * mapWidth)]);
} else { //out of bounds, put down a placeholder
buildingLayer[arrayIndex] = 0;
}
arrayIndex++;
}
}
} catch (IOException e) {
logger.fatal("ReadMapFile(building)", e);
JOptionPane.showMessageDialog(theDesktop, getStringChecked("message_file_locks") + "\n\n" + e.getMessage(), getStringChecked("message_error"), JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
private static String readFile(String path) throws IOException {
FileInputStream stream = new FileInputStream(new File(path));
try {
FileChannel fc = stream.getChannel();
MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
return Charset.defaultCharset().decode(bb).toString();
}
finally {
stream.close();
}
}
答案 0 :(得分:0)
这是我使用的解决方案(为了简单起见,我删除了许多循环逻辑)。感谢@Elliott Frisch在评论中的帮助。
private static short[] scanMapFile(String path, int[] leftChunkSides, int[] rightChunkSides) throws FileNotFoundException {
Scanner scanner = new Scanner(new File(path));
scanner.useDelimiter(", ");
short[] tmpMap = new short[chunkWidth * chunkHeight];
int count = 0;
while(scanner.hasNext()){
tmpMap[count] = scanner.nextShort();
count++;
}
scanner.close();
return tmpMap;
}