Learn · concepts
LWJGLとは?Javaグラフィックスライブラリ解説
LWJGLは、Javaがネイティブなグラフィックス、オーディオ、および入力APIにアクセスできるようにするライブラリです。それが何をするのか、そしてMinecraftがなぜそれを利用しているのかを以下に示します.
LWJGLとは?
LWJGLはLightweight Java Game Libraryの略称です。Javaコードがグラフィックス、オーディオ、入力のためのネイティブAPIを呼び出すための橋渡しをするものです。MinecraftはJavaで書かれたゲームなので、LWJGLを使ってGPUやサウンドハードウェアと通信しています。カスタムインターフェースを描画したり、サウンドを再生するMODも、このネイティブ層を経由してアクセスします。「軽量」とは、ネイティブの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を介してネイティブ層に渡されます。Modはこの依存関係を継承します。ゲーム内でオーバーレイを描画するModは、LWJGLによってセットアップされたOpenGLコンテキストを同じものを使用しています。いくつかのModは、LWJGLのバインディングの一つであるNanoVGを使用してカスタムインターフェースを描画します。この共有基盤が、単一のModが独自のグラフィックスシステムを構築することなく、ゲームと並行してレンダリングできる理由の一部です。
LWJGLはModですか?
いいえ。LWJGLはModやModローダーではなく、ライブラリです。Modをインストールするのとは異なり、LWJGLをインストールすることはありません。Minecraftは必要なバージョンをバンドルしており、ランチャーはオペレーティングシステム用の対応するネイティブバイナリをダウンロードします。Mod開発者はLWJGLに対してコンパイルしますが、自分のコピーを配布することはめったにありません。
LWJGLと他のグラフィックスソリューション
Javaゲームの場合、LWJGLの軽量なアプローチは、より大規模なフレームワークとは異なるトレードオフを提供します。
| アプローチ | オーバーヘッド | 制御 | 学習曲線 |
|---|---|---|---|
| LWJGL (薄いバインディング) | 最小限 | 直接的 | steep |
| ゲームエンジン (LibGDXなど) | ほどほど | 制限付き | gentle |
| 高レベルフレームワーク | 重い | 非常に制限付き | easy |
LWJGLは、メタルに近いパフォーマンスを追求し、より多くの低レベルコードを書くことに抵抗がない場合に適した選択肢です.
よくある質問
いいえ。Minecraftは必要なバージョンが同梱されており、ランチャーはあなたのオペレーティングシステムに合ったネイティブファイルを自動的に取得します.
ライブラリは、重いエンジンでラップするのではなく、ネイティブAPIに近接したままです。コードとハードウェアの間に最小限のオーバーヘッドで直接アクセスできます.
いいえ、LWJGLは多くのJavaゲームやツールで使用されている一般的なJavaゲームライブラリです。Minecraftが最も有名な例ですが、それだけではありません.
Java仮想マシン上で動作する言語であれば、JavaやKotlinを含む、バインディングがJava APIとして公開されているため.