我正在创建一个游戏,你可以选择一个国家,并且必须管理它,但由于大量计算(缺乏性能),我无法找到一种加载 map 而不会使程序崩溃的方法。
我做了一个算法,循环遍历包含 map 省份(游戏中的空间单位)的图像的每个像素,每个像素都有自己的颜色,这样,当我遇到像素中尚未看到的颜色时,我知道这是一个新省份,因此我可以使用文件中的信息加载 new Province() 实例。
上面所说的一切都很好,几乎不需要时间,但是要在不同国家互相攻击时编辑 map ,我需要一种方法来单独渲染每个省份,并使用着色器为其赋予其国家颜色。
我添加了这段代码,用于获取当前像素位置并将其缩小到 openGL 坐标,将其保存在 arrayList (currVertices
) 中,然后将其放入另一个 ArrayList 中一旦发现新省份,float[]
的 (provinceVertices
) 。
(我知道代码并不漂亮,而且我也不是专业程序员(而且我才 14 岁),所以请尽量友善地告诉我我做错了什么, 我尝试过每 4 个像素存储一个顶点以使列表更小,但它仍然崩溃)
List<Float> currVertices = new ArrayList<Float>(); // the vertices of the current province
for (int y = 0; y < worldImage.getHeight(); y++) {
for (int x = 0; x < worldImage.getWidth(); x++) {
if (!currColors.contains(worldImage.getRGB(x, y))) {
if (!currVertices.isEmpty())
provinceVertices.add(Utils.toFloatArray(currVertices)); // store the current province's vertices into the total database
currVertices.clear();
}
if (x % 4 == 0)
currVertices.add((float) (x) / EngineManager.getWindowWidth());
if (y % 4 == 0)
currVertices.add((float) (y) / EngineManager.getWindowHeight());
}
}
我只包含了代表顶点加载的代码
public static float[] toFloatArray(List<Float> list) {
float[] array = new float[list.size()];
ListIterator<Float> iterator = list.listIterator();
while (iterator.hasNext()) {
array[iterator.nextIndex()] = list.get(iterator.nextIndex());
}
return array;
}
目标是让第二个ArrayList
按正确的顺序排列所有顶点,但是当我尝试将currVertices
添加到provinceVertices
游戏只是崩溃,没有错误消息,这就是为什么我猜测问题与性能相关。
(顶点可以很好地加载到 currVertices
列表中)
最佳答案
使用 nextIndex() 不会增加索引。尝试改用:
while (iterator.hasNext()) {
array[iterator.nextIndex()] = iterator.next();
}
关于java - 策略游戏 map 加载算法中的性能相关问题(Java,lwjgl),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57594085/