You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

旧版Mac(Sierra系统)下LWJGL运行Objective-C断言失败求助

解决Sierra系统下LWJGL主线程断言失败问题

嘿,我刚好在旧Mac Sierra上踩过这个坑!你遇到的+[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread错误,本质是某个LWJGL的库/插件在非主线程调用了macOS的UI相关API,而Sierra系统对线程安全的检查比新版本更严格。既然你不想升级系统,咱们可以通过精简依赖来解决:

第一步:砍掉不必要的LWJGL组件

你之前选了全部库和插件,很多是示例代码根本用不上的,先把这些高风险组件删掉:

只保留核心运行依赖(OpenGL示例必备)

在你的pom.xml里,只保留这些条目,其他全部移除:

  • org.lwjgl:lwjgl(LWJGL核心库)
  • org.lwjgl:lwjgl-opengl(OpenGL绑定)
  • org.lwjgl:lwjgl-glfw(窗口管理,官方示例必须)
  • 对应的macOS原生依赖(记得把scope设为runtime):
    • org.lwjgl:lwjgl-natives:macos
    • org.lwjgl:lwjgl-opengl-natives:macos
    • org.lwjgl:lwjgl-glfw-natives:macos

必须移除的风险组件

这些组件大概率是触发错误的元凶,直接删掉:

  • lwjgl-nfd:原生文件对话框组件,会调用macOS的UI框架
  • lwjgl-imgui:ImGui GUI库,默认初始化逻辑可能在非主线程操作UI
  • lwjgl-openal:音频库,如果你的示例不需要音频可以直接移除
  • 所有调试/分析插件:比如lwjgl-debug、lwjgl-profiler,这些插件会在后台线程触发系统调用

第二步:确保GLFW在主线程初始化

即使保留了GLFW,也要确认你的示例代码把窗口初始化、GLFW配置逻辑放在主线程执行。可以给main方法加个简单的检查:

public static void main(String[] args) {
    // 强制GLFW逻辑在主线程运行
    if (!Thread.currentThread().getName().equals("main")) {
        SwingUtilities.invokeLater(YourMainClass::runExample);
        return;
    }
    runExample();
}

private static void runExample() {
    // 把原来的GLFW初始化、窗口创建、渲染逻辑都移到这里
}

第三步:验证修复

做完上面两步后,执行mvn clean install重新构建项目,然后运行示例代码。如果断言错误消失,说明就是某个被移除的组件导致的;如果还有问题,可以再尝试暂时移除lwjgl-glfw(改用纯OpenGL窗口创建,但官方示例依赖它,大概率不会是它的问题)。


内容的提问来源于stack exchange,提问作者Rotartsi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:09:29