Learn · concepts
LWJGL 是什么?Java 图形库详解
LWJGL 允许 Java 访问原生图形、音频和输入 API。以下是它所能做到的以及 Minecraft 为什么依赖它.
LWJGL 是什么?
LWJGL 是轻量级 Java 游戏库。它是连接 Java 代码与图形、音频和输入原生 API 的桥梁。Minecraft 是一个 Java 游戏,因此它使用 LWJGL 与你的 GPU 和音频硬件进行通信。绘制自定义界面或播放声音的模组也通过它访问相同的原生层。 “轻量级” 的含义是它尽可能贴近原生 C API,而不是用更重的包装层包裹它们,从而让你以最小的开销获得直接访问。
LWJGL 实际上做什么
LWJGL 为 Java 提供了对 C 库的精简、直接的包装器。Java 本身无法调用 OpenGL、OpenAL 或其他图形 API;这些 API 用 C 编写,并存在于操作系统或驱动程序中。LWJGL 提供了绑定代码和原生二进制文件,因此 Java 方法调用几乎可以与底层的 C 函数一一对应。
这个包装器是经过精心设计的,力求精简。LWJGL 不会在场景图或游戏引擎框架之后隐藏 OpenGL。你编写的图形代码会紧贴 API,这正是它在希望获得控制和可预测性能的项目中如此受欢迎的原因。
它绑定了什么
LWJGL 实际上是一组绑定,而不是单个库。与 Minecraft 相关的组件包括:
| 绑定 | 功能 |
|---|---|
| OpenGL | 绘制到屏幕;Minecraft的渲染 API |
| OpenAL | 3D 音位音频,用于声音系统 |
| GLFW | 窗口创建、游戏循环以及键盘/鼠标输入 |
| stb | 图像和字体加载辅助工具 |
| NanoVG | 用于 UI 覆盖的抗锯齿 2D 矢量绘图 |
一个项目仅引入其需要的模块。Minecraft使用所有模块;一个更简单的工具可能仅使用 OpenGL
为什么 Minecraft 取决于它
Minecraft 的整个窗口、渲染和输入栈都依赖于 LWJGL。当游戏打开一个窗口、读取鼠标或向 GPU 绘制三角形时,这些调用都会通过 LWJGL 传递到原生层。模组会继承这种依赖关系。一个绘制游戏内叠加层的模组,正在使用游戏通过 LWJGL 设置好的 OpenGL 上下文。一些模组也使用 NanoVG(LWJGL 的一个绑定)来绘制自定义界面。这种共享的基础是单个模组能够与游戏一起渲染,而无需建立自己的图形系统的一部分原因
LWJGL 是模组吗??
LWJGL 并非模组或模组加载器,而是一个库。您无需像安装模组一样安装它。Minecraft 已经捆绑了所需版本,启动器会下载与您的操作系统匹配的本地二进制文件。模组开发者通常针对 LWJGL 编译,但很少包含自己的副本
LWJGL 与其他图形解决方案
对于 Java 游戏,LWJGL 的轻量级方法与更重量级的框架相比,提供不同的权衡:
| 方法 | 开销 | 控制力 | 学习曲线 |
|---|---|---|---|
| LWJGL (精简绑定) | 最小 | 直接 | 陡峭 |
| 游戏引擎 (如 LibGDX) | 中等 | 受限 | 平缓 |
| 高级框架 | 沉重 | 非常受限 | 简单 |
当您追求接近底层的性能并且不介意编写更多底层代码时,LWJGL 是您的选择.
常见问题
No. Minecraft 根据所需版本安装程序,启动器将自动获取适用于您操作系统的原生文件.
这意味着该库更贴近原生 API,而不是将其封装在臃肿的引擎中。您可以直接访问,代码与硬件之间几乎没有额外的开销.
LWJGL 编号是一个通用的 Java 游戏库,被许多 Java 游戏和工具所使用. Minecraft 但并非唯一一个例子.
任何在 Java 虚拟机上运行的语言,包括 Java 和 Kotlin,因为绑定对外暴露为 Java API.