Я немного разочарован в fps моей игры. Я все еще нахожусь в начале разработки игры. Когда я начал свою игру сначала, я получил около 350 кадров в секунду. После того, как я добавил в программу высоту и еще какой-то код, логично ли это, что падение fps. Теперь я получил 39 кадров в секунду. Я все еще в начале, и fps уже низок. Интересно, что происходит, когда я заканчиваю проект, я думаю, что fps будет настолько низким, что это раздражает. Я знаю, что я прошу очень много о программе, highmap - большая проблема. Карта имеет площадь 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)) {
}
}
}
}
}
У кого-нибудь есть опыт? Есть ли какие-либо идеи или улучшения, и как я это делаю правильно? Заранее спасибо.
Прежде всего, вы должны иметь фиксированный массив вместо списка. Это даст небольшой импульс уже. Я не вижу функцию изменения размера карты высот, поэтому, вероятно, это фиксированный размер. Вы можете инициализировать статический массив таким образом:
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, я думаю, что это не будет иметь никакого значения. Если вы будете следовать приведенным выше предложениям, возможно, вы получите 1000 1000 карт высот с 200 FPS. (Это то, что я сейчас имею в одном проекте).