LWJGL Display.update() замедляющее приложение
Я использую LWJGL для Java-приложения, и у меня, похоже, проблема с Display.update()
, Если я удалю Display.update()
из цикла я получаю FPS около 7000000 - 9000000. С Display.update()
Я получаю только около 200 - 300 FPS. Это нормально?
Я использую Macbook Air 2013 с 1,7 ГГц i7, 8 ГБ оперативной памяти и Intel HD Graphics 5000.
Вот код, который у меня есть:
Main.java
class Main{
private static Time time;
public static void main(String[] args) {
initDisplay();
initGL();
time = new Time();
gameLoop();
cleanUp();
}
private static void gameLoop(){
while (!Display.isCloseRequested()) {
Display.update();
time.updateFPS();
}
}
private static void initDisplay(){
try{
Display.setDisplayMode(new DisplayMode(800, 600));
Display.setVSyncEnabled(false);
Display.create();
Display.setTitle("Application Title");
}catch(LWJGLException e){
System.exit(1);
}
}
private static void initGL(){
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, Display.getWidth(), Display.getHeight(), 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glDisable(GL_DEPTH_TEST);
glClearColor(0, 0, 0, 0);
}
private static void cleanUp(){
Display.destroy();
}
}
Time.java
public class Time {
long lastFrame;
long lastFPS;
int fps;
public Time(){
getDelta();
lastFPS = getTime();
}
public long getTime() {
return (Sys.getTime() * 1000) / Sys.getTimerResolution();
}
public int getDelta() {
long time = getTime();
int delta = (int) (time - lastFrame);
lastFrame = time;
return delta;
}
public void updateFPS() {
if (getTime() - lastFPS > 1000) {
Display.setTitle(Integer.toString(fps));
fps = 0;
lastFPS += 1000;
}
fps++;
}
public int getFPS(){ return fps;}
}
1 ответ
Да, это правильно. Вы должны получить огромный скачок FPS, не имея Display.update()
потому что приложение буквально не делает ничего, кроме итерации цикла и подсчета времени, которое требуется для выполнения этой итерации.
Сейчас это трудно увидеть, так как у вас нет компонентов, визуализируемых в Display
, но не звонит Display.update()
будет препятствовать тому, чтобы что-либо было визуализировано в окне дисплея.
Короче нужно Display.update()
на самом деле сделать что-нибудь в LWJGL.
Помимо этого, у вас есть хорошая основа для управления временем в вашем приложении. Я бы предложил добавить "газ" для ограничения FPS. Запуск игры на максимальной скорости лишает вас возможности стандартизировать время и наносит ущерб вашему процессору.