Learn · frameworks

Mixin とは何か? バイトコード注入の解説

Mixin は、mods が Minecraft のコンパイルされたクラスをロード時にパッチできるバイトコード注入ライブラリです。次に、この注入がどのように機能し、なぜ現代のすべての mod に必要とされるのかを説明します.

TRtrolPublished 1 min read

マインクラフトにおけるMixinとは?

Mixinは、バイトコードへの挿入を可能にするライブラリで、modがMinecraftのコンパイルされたクラスをロード時にパッチ適用できます。元のソースコードに触れることなく。modは、「このゲームメソッドのこのポイントにこのコードを挿入する」という小さなクラスを記述し、MixinはJVMがターゲットをロードした瞬間に、そのコードをバイトコードに織り込みます。FabricはこのMixinを利用して、コアとなるmoddingメカニズムとしています。

簡単に言うと、MinecraftはコンパイルされたJavaとして提供されます。Mixinは、それらのコンパイルされたクラスを構築する基盤として扱い、ゲームが1フレームも実行される前にメモリ内で編集します。

Mixinのバイトコード挿入はどのように機能するのか?

Mixinは、コンパイルと実行の間の隙間を埋めるように機能します。ゲームクラスはすでにコンパイルされていますが、JVMはまだロードしていません。Mixinが利用するのは、その瞬間です。modは、実際のゲームクラスをターゲットとするように注釈付けされたMixinクラスをローダーに渡し、そのゲームクラスがロードされると、Mixinはmodのコードを折り込むために、その場でバイトコードを書き換えます。

注釈がトリックの全てです。これらは、ゲームファイルがどのように見えるかを一行ずつ記述するものではありません。これらは、どこに着陸したいかを記述します。メソッドの先頭、リターン、その内部の特定の呼び出し、ローカル変数などです。Mixinは、そのスポットをバイトコード内で探し出し、あなたの指示をその周りに縫い付けます.

マインクラフトは拡張されることを前提に作られていないため、これは必要です。ほとんどのMODが変更したいことに対応する公式プラグインAPIは存在しません。Mixinはその答えです。ゲームがフックを提供しない場合、コンパイルされたコードに自分で切り込みます。

なぜMODはゲームを直接編集する代わりにMixinを使うのですか?

議論全体を支える理由は2つあります。互換性とアップデートへの対応です。

ゲームのソースコードを直接編集すると、Minecraftの完全な修正コピーを配布する必要があります。誰もあなたのフォークの上に構築できず、ゲームがアップデートされるとすぐに崩壊します。Mixinパッチは小さく、外科的であるため、誰も完全なクローンを配布することなく、数十のMODが一度に同じゲームをパッチすることができます。

アプローチ他のMODと共存できるゲームアップデートを乗り越えられるとして配布される
コンパイルされたゲームを手動で編集いいえ、一つのフォークが勝ついいえ、どんな変更でも壊れる完全な修正jarファイル
Mixinの注入はい、パッチが積み重なる多くの場合、メソッドが生き残っていればほんの少しの小さなクラス

その2番目の列が静かな超能力です。Mixinは「ここに注入してください」と言うだけで、「ファイルは正確にこうです」と言うのではなく、多くのMixinがバージョン間で変更なしに動作し続けます。これは、目的地を説明することと、地図を暗記することの違いです。

MixinはFabricにどのように適合するのですか??

Fabric mixin に基づいています。ピリオド。ローダーは各モッドの Mixin 設定を読み込み、その設定にリストされている Mixin クラスを収集し、クラスのロード時に適用されるように Mixin に渡します。この処理を手動で設定する必要はありません。設定ファイルに Mixin を宣言するだけで、完全に統合されます。

典型的な Fabric mod は、主に通常のクラスで構成されており、ゲームを変更するために実際に必要な数少ないメソッドにフックする、小さなミキシングセットが追加されています。mod の実際のロジックは、通常のコードに存在します。ミキシンは、適切なタイミングで制御を引き継ぐ、薄い層に過ぎません.

共通のMixin注入ポイントは何ですか?

選択する注入タイプは、パッチの攻撃性と他のModとの相性を決定します。軽い変更は安全でアップデートに強いです。重い変更はより多くの制御を提供しますが、脆さにつながります。

アノテーション動作使うべきタイミング
@Injectターゲットメソッド内の特定のポイントでコードを実行デフォルト;最も侵襲性が低く、アップデートに強い
@Redirectターゲット内の特定のメソッド呼び出しを置き換え単一の呼び出しを書き換えずに置き換える
@ModifyArgターゲット内の呼び出しに渡される引数を変更呼び出しに入る値をわずかに変更する
@ModifyVariableメソッド内のローカル変数を書き換えメソッドがすでに計算した状態を調整する
@Overwriteメソッド全体を置き換え最終手段;他のModとの競合が発生する

@Inject は、狭く丁寧であるため、主力となります。正確な場所に挿入され、メソッドの残りを変更しないため、アップデートに耐え、他のModと衝突しにくいという理由です。一方、@Overwrite は、メソッド全体を消去するため、同じメソッドを必要とする他のModとの競合が発生します。優れたMixinは、意図的に小さな影響範囲を保ちます.

注射部位を清潔に保つことが、modの削除が即座に完了する理由でもあります。ファイルに何も書き込まれていないため、modを取り除くことで、すべての変更も一緒に取り除かれます.

真剣なクライアントにとって、Mixin が重要な理由

これは Terminus が構築されている基盤です。プレミアムユーティリティクライアントの存続は、ゲームにどれだけクリーンに統合されるかにかかっています。Mixin は、Minecraft の粗雑なコピーを配布することなく、それを可能にするものです。絞り込まれた注入ポイントにより、クライアントはすでに動作している MOD との互換性を維持し、ゲームのアップデート時にも破損することなく対応します。Mixin を理解することで、なぜ堅牢に構築されたクライアントが、まるでゲームの一部であるかのように感じられるのかがすぐにわかります。

よくある質問

Terminus を手に入れろ

Built on clean Mixin hooks, not a hacked-up jar.