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

Java Lwjgl如何简化高度图以获得更高的fps?,java,math,optimization,lwjgl,heightmap,Java,Math,Optimization,Lwjgl,Heightmap,我对我的游戏的fps有点失望。我还处于游戏开发的初期。当我第一次开始我的游戏时,我获得了大约350 fps。在我向程序中添加了一个高度图和一些代码之后,fps下降是否合乎逻辑。现在我有39帧。 我还处于起步阶段,fps已经很低了。我想知道当我完成这个项目时会发生什么,我想fps会很低,让人恼火。 我知道我对这个项目要求很高,高度图是个大问题。 地图有一个200*200个顶点的区域,每个顶点有一个高度。 200*200=40000个顶点,每个帧。 我想把地图简化一下。我的想法是创建一种简化整个高度

我对我的游戏的fps有点失望。我还处于游戏开发的初期。当我第一次开始我的游戏时,我获得了大约350 fps。在我向程序中添加了一个高度图和一些代码之后,fps下降是否合乎逻辑。现在我有39帧。 我还处于起步阶段,fps已经很低了。我想知道当我完成这个项目时会发生什么,我想fps会很低,让人恼火。 我知道我对这个项目要求很高,高度图是个大问题。 地图有一个200*200个顶点的区域,每个顶点有一个高度。 200*200=40000个顶点,每个帧。 我想把地图简化一下。我的想法是创建一种简化整个高度图的方法。每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)) {


                }
            }
        }
    }

}
包rgc.area;
导入java.awt.Dimension;
导入java.util.ArrayList;
导入java.util.List;
公共类高度图{
公共整型宽度;//顶点(宽度)
公共整数高度;//顶点(高度)
public List map=new ArrayList();
/**
* 
*@param width地图的宽度(x轴)
*@param height地图的高度(z轴,而非y轴);
*/
公共高度图(内部宽度、内部高度){
这个。宽度=宽度;
高度=高度;
对于(int i=0;i0){
指数+=(y-1)*宽度;
}
map.set(索引-1,h);
/*调试
对于(int i=0;i0){
指数+=(y-1)*宽度;
}
返回map.get(索引);
}
公共浮动高度(浮动x、浮动y){
返回这个.getHeight((int)x,(int)y);
}
/**
*此方法简化了高度贴图。
*它将合并具有相同顶点高度的独立四边形。
*这是为了节省内存并加快渲染速度。
* 
*仅当更改heightmap时才应调用此方法。
*因此,不应在每一帧调用此方法。
*/
公共空间简化(){
//我真的不知道怎么做。
对于(int i=0;i
有人有这方面的经验吗? 是否有任何想法或改进,我的方法是否正确?
提前谢谢。

首先,你应该给我们一个固定数组,而不是列表。这将给我们带来一个小小的提升。我看不到调整高度贴图大小的函数,所以它可能是固定大小的。可以通过以下方式初始化静态数组:

float[][] map;
public HeightMap(int width, int height) {
    this.map = new float[width][height];
    ...
}
使用二维数组还可以简化getHeight(x,y)和setHeihgt(x,y,height)方法。除此之外,它在很大程度上取决于渲染方法。我建议将顶点缓冲区对象与GL_TRIANGLE_STRIP一起用于高度贴图。
有关顶点缓冲区对象的详细信息,请选中
除此之外,请尝试使用cull facing。这可能会进一步提高您的性能。
此外,您可能希望为更大级别设置渲染距离以提高性能。

我知道,这可能不是您想要的答案,但我希望它会有所帮助。

编辑:

哦,看来你在用四头肌。我为heightmaps做的一件事是,我为每个像素指定了一个顶点,并使用GL_TRIANGLE_STRIP(如上所述)将它们连接起来。除此之外,你仍然可以使用四边形,我认为这不会有任何区别。如果你按照上面的建议,你可能会得到一个1000*1000高度的地图,以200 FPS的速度运行。(这就是我目前正在进行的一个项目)。

也许你可以得到更多的帮助。那是一张高度图。最重要的是:你是如何表现它的?在现代图形卡上,40k顶点应该很难被注意到。但是如果涉及到像
glVertex3f(x,y,map.getHeight(x,y))
这样的东西,那么我可以想象这是非常缓慢的。(BTW:通过简单的<代码>浮点[]/Cux>数组替换<代码>列表已经可以实现明显的改进,但是对于真正的高性能,您应该考虑顶点缓冲对象(VBO)和其他“现代”OpenGL的东西)使用VBO。那会有帮助的。