gpt4 book ai didi

java - Lwjgl如何简化高度图以获得更高的fps?

转载 作者:太空宇宙 更新时间:2023-11-04 06:58:58 25 4
gpt4 key购买 nike

我对游戏的 fps 有点失望。我仍处于游戏开发的初期。当我第一次开始游戏时,帧速率约为 350 fps。在我向程序中添加高度图和更多代码后,fps 下降是否符合逻辑?现在我的帧率为 39 fps。我还处于起步阶段,fps 已经很低了。我想知道当我完成这个项目时会发生什么,我认为 fps 会很低,令人恼火。我知道我对程序要求很高,高度图是个大问题。该 map 有 200 * 200 个顶点的面积,每个顶点都有一个高度。每帧 200 * 200 = 40000 个顶点。我正在考虑简化 map 。我的想法是创建一种简化整个高度图的方法。每 4 个顶点都属于一个四边形。当有两个或多个彼此相邻的四边形且每个顶点的高度相同时,可以将它们合并为一个四边形。关键是顶点应该更少。 (我认为)

我将展示我的高度图的一些示例代码。

package rgc.area;

import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;

public class HeightMap {

public int width; // Vertices (width)
public int height; // Vertices (height)

public List<Float> map = new ArrayList<Float>();

/**
*
* @param width The width of the map (x-axis)
* @param height The height of the map (z-axiz, NOT y-axis);
*/
public HeightMap(int width, int height) {

this.width = width;
this.height = height;

for(int i = 0; i < width * height; i++) {

map.add(1.0f);
}
}

public Dimension getSize() {

return new Dimension(this.width, this.height);
}

public int getWidth() {

return this.width;
}

public int getHeight() {

return this.height;
}

/**
* Set the height of a vertex of the map
*/
public void setHeight(int x, int y, float h) {

int index = x;

if(y > 0) {

index += (y - 1) * width;
}

map.set(index - 1, h);

/* DEBUG
for(int i = 0; i < map.size(); i++) {

System.out.println(i + " height: " + map.get(i));
}
*/
}

public float getHeight(int x, int y) {

int index = x;

if(y > 0) {

index += (y - 1) * width;
}

return map.get(index);
}

public float getHeight(float x, float y) {

return this.getHeight((int)x, (int)y);
}

/**
* This method simplifies the heightmap.
* It will merge seperate quads with the same vertex heights.
* This is to save memory and render faster.
*
* This method should only be called when the heightmap is changed.
* So this method should NOT be called every frame.
*/
public void simplify() {

// Don't really know how to do this.
for(int i = 0; i < width * height; i++) {

for(int w = 1; w < width - 1; w++) {

if(map.get(i) == map.get(i + w)) {


}
}
}
}

}

有人有这方面的经验吗?有什么想法或改进吗?我的做法是否正确?提前致谢。

最佳答案

首先,您应该使用固定数组而不是列表。这已经会带来小小的插入。我没有看到调整高度图大小的函数,因此它可能是固定大小的。您可以这样初始化静态数组:

float[][] map;
public HeightMap(int width, int height) {
this.map = new float[width][height];
...
}

使用二维数组还可以简化 getHeight(x, y) 和 setHeihgt(x, y, height) 方法。除此之外,它很大程度上取决于您的渲染方法。我建议将顶点缓冲区对象与 GL_TRIANGLE_STRIP 用于高度图。
有关顶点缓冲区对象的更多信息,请查看 http://lwjgl.org/wiki/index.php?title=Using_Vertex_Buffer_Objects_%28VBO%29
除此之外,尝试使用剔除面对。这可能会进一步提高您的性能。
此外,您可能希望为更大的级别设置渲染距离以提高性能。

我知道,这可能不是您正在寻找的答案,但我希望它会有所帮助。

编辑:
哦,看来你用的是四边形。我对高度图所做的一件事是,我为每个像素分配了一个顶点,并使用 GL_TRIANGLE_STRIP 连接它们(如上所述)。除此之外你仍然可以使用QUADS,我认为这根本没有任何区别。如果您遵循上面的建议,您可能会获得以 200 FPS 运行的 1000*1000 高度图。 (这就是我目前正在做的一个项目)。

关于java - Lwjgl如何简化高度图以获得更高的fps?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22364360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com