Я написал простое, в основном работающее приложение OpenGL на Java (версия 21), используя LWJGL на своем MacBook. Сама программа работает нормально, но были многочисленные сбои, связанные с Metal или управлением памятью. Похоже, что Apple эмулирует OpenGL с помощью Metal, что объясняет, почему LWJGL, являющийся привязкой для OpenGL, Vulkan и связанных с ними библиотек, вызывает ошибки, связанные с Metal. Вот несколько примеров того, что я видел:
-[IOGPUMetalCommandBuffer validate]:214: failed assertion 'commit command buffer with uncommitted encoder'
Эта ошибка произошла, когда я впервые добился корректной работы текстур изображения с настраиваемыми параметрами. Текстура загружается, отображается и применяет любую конфигурацию, предоставленную объекту Текстура. Однако если программа будет оставаться открытой слишком долго, это утверждение не будет выполнено.
-[AGXG13XFamilyCommandBuffer renderCommandEncoderWithDescriptor:]:964: failed assertion 'A command encoder is already encoding to this command buffer'
После повторного запуска программы с минимальными изменениями (я даже не уверен, что я вообще что-то изменил) она снова вылетела, на этот раз с вышеуказанным сообщением об ошибке. Каким-то образом код без изменений или с очень небольшим количеством изменений, работающий с теми же доступными ему ресурсами, что и раньше, вызвал другое утверждение.
/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home/bin/java -XstartOnFirstThread -javaagent:[idea runtime and lwjgl stuff from my .m2 dir] net.bunsoft.bunworks.examples.Main
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x0000000133f158d8, pid=21546, tid=51971
#
# JRE version: Java(TM) SE Runtime Environment (21.0.2+13) (build 21.0.2+13-LTS-58)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (21.0.2+13-LTS-58, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, bsd-aarch64)
# Problematic frame:
# C [AppleMetalOpenGLRenderer+0x158d8] std::__1::pair std::__1::__hash_table::__emplace_unique_key_args(GLRResource* const&, GLRResource*&)+0x5c
#
# No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /Users/audrey/Documents/Code/jBunworks/hs_err_pid21546.log
#
# If you would like to submit a bug report, please visit:
# https://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
Process finished with exit code 134 (interrupted by signal 6:SIGABRT)
Этот вопрос мучил меня с тех пор, как я впервые открыл окно с GLFW. Это происходит каждый раз, когда я изменяю размер окна. Не знаю почему, тем более, что развертывание окна в полноэкранном режиме не приводит к вылету. Иногда после того, как произошел этот сбой, перезапуск программы приводит к ее немедленному сбою.
Это метод, который я использую для создания текстуры OpenGL:
Идентификатор генерируется при создании объекта текстуры. Он создается заново каждый раз, когда загружается новое изображение, изменяется режим переноса или режим фильтра.
Это все соответствующие классы (
Я написал простое, в основном работающее приложение OpenGL на Java (версия 21), используя LWJGL на своем MacBook. Сама программа работает нормально, но были многочисленные сбои, связанные с Metal или управлением памятью. Похоже, что Apple эмулирует OpenGL с помощью Metal, что объясняет, почему LWJGL, являющийся привязкой для OpenGL, Vulkan и связанных с ними библиотек, вызывает ошибки, связанные с Metal. Вот несколько примеров того, что я видел: [code]-[IOGPUMetalCommandBuffer validate]:214: failed assertion 'commit command buffer with uncommitted encoder'[/code] Эта ошибка произошла, когда я впервые добился корректной работы текстур изображения с настраиваемыми параметрами. Текстура загружается, отображается и применяет любую конфигурацию, предоставленную объекту Текстура. Однако если программа будет оставаться открытой слишком долго, это утверждение не будет выполнено. [code]-[AGXG13XFamilyCommandBuffer renderCommandEncoderWithDescriptor:]:964: failed assertion 'A command encoder is already encoding to this command buffer'[/code] После повторного запуска программы с минимальными изменениями (я даже не уверен, что я вообще что-то изменил) она снова вылетела, на этот раз с вышеуказанным сообщением об ошибке. Каким-то образом код без изменений или с очень небольшим количеством изменений, работающий с теми же доступными ему ресурсами, что и раньше, вызвал другое утверждение. [code]/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home/bin/java -XstartOnFirstThread -javaagent:[idea runtime and lwjgl stuff from my .m2 dir] net.bunsoft.bunworks.examples.Main # # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0x0000000133f158d8, pid=21546, tid=51971 # # JRE version: Java(TM) SE Runtime Environment (21.0.2+13) (build 21.0.2+13-LTS-58) # Java VM: Java HotSpot(TM) 64-Bit Server VM (21.0.2+13-LTS-58, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, bsd-aarch64) # Problematic frame: # C [AppleMetalOpenGLRenderer+0x158d8] std::__1::pair std::__1::__hash_table::__emplace_unique_key_args(GLRResource* const&, GLRResource*&)+0x5c # # No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again # # An error report file with more information is saved as: # /Users/audrey/Documents/Code/jBunworks/hs_err_pid21546.log # # If you would like to submit a bug report, please visit: # https://bugreport.java.com/bugreport/crash.jsp # The crash happened outside the Java Virtual Machine in native code. # See problematic frame for where to report the bug. #
Process finished with exit code 134 (interrupted by signal 6:SIGABRT) [/code] Этот вопрос мучил меня с тех пор, как я впервые открыл окно с GLFW. Это происходит каждый раз, когда я изменяю размер окна. Не знаю почему, тем более, что развертывание окна в полноэкранном режиме не приводит к вылету. Иногда после того, как произошел этот сбой, перезапуск программы приводит к ее немедленному сбою. Это метод, который я использую для создания текстуры OpenGL: [code] protected void generate() { glBindTexture(GL_TEXTURE_2D, id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glGenerateMipmap(GL_TEXTURE_2D); } [/code] Идентификатор генерируется при создании объекта текстуры. Он создается заново каждый раз, когда загружается новое изображение, изменяется режим переноса или режим фильтра. Это все соответствующие классы ([code]GraphicsDeviceКод [/code] и RenderTarget удален для краткости): [code]package net.bunsoft.bunworks.render;