Я перенес свое приложение LWJGL из LWJGL 2 в LWJGL 3, и вызов glfwSwapBuffers()
очень медленный (до 20 мс на вызов), даже если в игровом цикле не было ни одного вызова рендеринга.У меня уже была эта проблема, когда я пытался использовать Display.update()
с LWJGL 2, этот метод тоже был медленным.Я измерил время выполнения с JETM .Моя операционная система - Mac OS X 10.13.3 с графическим адаптером Intel HD Graphics 500
Соответствующий код
public static void main(String[] args) {
new MainLoop_I();
}
private static final int START_WIDTH = 500;
private static final int START_HEIGHT = 300;
private long window;
private GLFWErrorCallback errorCallback;
private static GLCapabilities capabilities;
public MainLoop_I() {
init();
// configure time execution measurement library (JETM)
BasicEtmConfigurator.configure();
final EtmMonitor monitor = EtmManager.getEtmMonitor();
monitor.start();
loop();
// print out results of JETM
monitor.render(new SimpleTextRenderer());
monitor.stop();
glfwFreeCallbacks(window);
glfwDestroyWindow(window);
glfwTerminate();
glfwSetErrorCallback(null).free();
System.exit(0);
}
private void init() {
glfwSetErrorCallback(errorCallback = GLFWErrorCallback.createPrint(System.err));
System.out.println(glfwGetVersionString());
if ( !glfwInit() ) throw new IllegalStateException("Unable to initialize GLFW");
glfwDefaultWindowHints();
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
glfwWindowHint(GLFW_DEPTH_BITS, 24);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
window = glfwCreateWindow(START_WIDTH, START_HEIGHT, "Game", NULL, NULL);
if ( window == NULL ) throw new RuntimeException("Failed to create the GLFW window");
glfwMakeContextCurrent(window);
glfwShowWindow(window);
glfwFocusWindow(window);
capabilities = GL.createCapabilities();
}
private void loop() {
long lastFrameTime = System.currentTimeMillis();
glClearColor(0, 0, 0, 1);
while(! glfwWindowShouldClose(window)) {
glfwPollEvents();
long thisFrameTime = System.currentTimeMillis();
float deltaSeconds = (thisFrameTime - lastFrameTime) / 1000f;
lastFrameTime = thisFrameTime;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
EtmPoint point = EtmManager.getEtmMonitor().createPoint("MainLoop_I:loop");
glfwSwapBuffers(window);
point.collect();
}
}
Какие могут быть возможные причины этого очень долгого исполнениявремя