Java LWJGL. Зависает система. Linux
При перемещение окна приложения зависает система. Система Linux ubuntu 22.04 LTS amd ryzen 5 3500 gtx 1650 16 gb озу
class HelloWorld {
// обработка окна
private long window;
public void run() {
System.out.println("Hello LWJGL " + Version.getVersion() + "!");
init();
loop();
// Открыть окно обратным вызовом и уничтожить окно
glfwFreeCallbacks(window);
glfwDestroyWindow(window);
// Завершить GLFW и высвободить ошибку обратного вызова
glfwTerminate();
glfwSetErrorCallback(null).free();
}
private void init() {
// Настройка ошибок обратного вызова. Реализация по умолчанию
// сообщение об ошибке в System.err.
GLFWErrorCallback.createPrint(System.err).set();
// Инициализировать GLFW. Большинство функций GLFW не будут работать, до того как это будет сделано.
if ( !glfwInit() )
throw new IllegalStateException("Unable to initialize GLFW");
// Конфигурируем GLFW
glfwDefaultWindowHints(); // необязательно, текущие подсказки окна уже по умолчанию
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); // окно останется скрытым после создания
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); // размеру окна будет изменяемым
// Создать окно
window = glfwCreateWindow(300, 300, "Hello World!", NULL, NULL);
if ( window == NULL )
throw new RuntimeException("Failed to create the GLFW window");
// Настроить клавишу обратного вызова. Он будет вызываться каждый раз, когда клавиша нажимается повторно или отпускается.
glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> {
if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE )
glfwSetWindowShouldClose(window, true); // Мы обнаружим это в цикле рендеринга
});
// Получить стек потока и передать новый кадр
try ( MemoryStack stack = stackPush() ) {
IntBuffer pWidth = stack.mallocInt(1); // int*
IntBuffer pHeight = stack.mallocInt(1); // int*
// Получить размер окна, переданного glfwCreateWindow
glfwGetWindowSize(window, pWidth, pHeight);
// Получить разрешение основного монитора
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
// Центрировать окно
glfwSetWindowPos(
window,
(vidmode.width() - pWidth.get(0)) / 2,
(vidmode.height() - pHeight.get(0)) / 2
);
} // кадр стека автоматически открывается
// Сделать контекст OpenGL текущим
glfwMakeContextCurrent(window);
// Включить v-sync
glfwSwapInterval(1);
// Сделать окно видимым
glfwShowWindow(window);
}
private void loop() {
// Эта строка имеет решающее значение для взаимодействия LWJGL с
// контекстом OpenGL GLFW или с любым контекстом, который управляется извне.
// LWJGL обнаруживает текущий контекст, в текущем потоке,
// создает экземпляр GLCapabilities и делает привязки OpenGL
// доступными для использования.
GL.createCapabilities();
// Установите прозрачный цвет
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
// Запустите цикл рендеринга, до тех пор пока пользователь не попытается закрыть
// окно или нажал клавишу ESCAPE.
while ( !glfwWindowShouldClose(window) ) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // очистить framebuffer
glfwSwapBuffers(window); // поменять цвет буферов
// Опрос событий окна. Клавиша обратного вызова выше, будет вызываться
// только во время этого вызова.
glfwPollEvents();
}
}
public static void main(String[] args) {
new HelloWorld().run();
}
}