- Minecraft 26.3 Snapshot 4では、ウィンドウ管理・入力・プラットフォーム統合バックエンドをGLFWからSDL3へ置き換え、キーボード入力にSDLのスキャンコードとキーコードを導入
- キーバインドはキーボード配列ごとのコードではなく物理キーの位置を使用し、Linuxでは可能な場合Waylandを優先、macOSではネイティブの入力候補ウィンドウをサポート
- カスタムかまど・醸造燃料用のデータコンポーネントが追加され、燃焼時間、使用回数、調理・醸造速度をnumber providerで設定可能
- データパック111.0とリソースパック92.0で、看板のクリックイベント、戦利品テーブル参照、進捗トリガー、Mobスポーン環境属性、地形生成設定とシェーダーが大幅に変更
- Windowsのマルチモニター環境とWaylandでは排他フルスクリーンでのクラッシュが既知の問題であり、テスト版はワールドを破損する可能性があるため、バックアップするか別フォルダーで実行する必要あり
SDL3ベースのウィンドウ・入力システム
- ウィンドウ管理、入力、プラットフォーム統合ライブラリをGLFWからSDL3へ移行
- キーボード入力は物理キーの位置にSDL scancodeを使用
- キーボード配列によって変わるテキスト編集ショートカットにはSDL keycodeを適用
- キーバインドはキーボード配列ごとのキーコードではなく、物理キーを基準に動作
- Raw Inputのマウス設定を削除し、ゲームプレイ中は常に相対マウスモードを使用
- ボーダーレスフルスクリーンがデフォルトのフルスクリーンモードとなり、再起動なしでボーダーレスと排他モードを切り替え可能
- macOSでは排他フルスクリーンを今後サポートしない
- 最小ウィンドウサイズは320×240ピクセル
- Linuxでは利用可能な場合、Waylandをネイティブに優先使用
- macOSでテキスト入力中にキーを長押しすると、ネイティブのアクセント・候補ポップアップを表示
既知のフルスクリーン問題
- Windowsの排他フルスクリーンは、特定の状況、とくにマルチモニター環境でゲームのクラッシュを引き起こす可能性あり
- Waylandでは排他フルスクリーンに入るとゲームがクラッシュ
プレイとインターフェースの変更
- 観戦者モードのプレイヤーがポータルと相互作用してテレポート可能
- アルマジロは液体に浸かったとき、丸まろうとしない
- デバッグオーバーレイに個別のGUIスケールを適用可能
F3 + F6のDebug Optionsで設定- デフォルト値
Autoは通常のGUIより高い解像度を維持し、Unchangedは通常のGUIスケールと一致 - プレイヤーのティックあたりのブロック移動速度を示す
player_speedと、ディスプレイのリフレッシュレート表示も追加
- クリエイティブインベントリの鉱物の順序を、非ティア素材、未精製ティア素材、精製ティア素材の順に再配置
- 建築ブロックは非ティア鉱物、精製ティア鉱物、Copper系の順で、項目数の多いCopperブロックは後方に配置
- Natural BlocksタブはOverworld → Nether → Endの順に整理
カスタム燃料とアイテムコンポーネント
minecraft:cooking_fuelはFurnace、Smoker、Blast Furnace用の燃料を定義burn_timeは燃焼ティック数、speed_multiplierは調理・製錬速度をそれぞれminecraft:number_providerで指定
minecraft:brewing_fuelはBrewing Stand燃料の使用回数と醸造速度を定義- 既存の
#brewing_fuelアイテムタグは削除され、新しい醸造燃料の登録には使用不可
- 既存の
- SmokerとBlast FurnaceのレシピはFurnaceと同じ調理時間を使用し、速度向上は燃料コンポーネントの
minecraft:cooking/speed_defaultが担当 - かまど・燻製器・溶鉱炉の調理および燃料時間フィールドはshortからintegerに変わり、
speed_multiplierが追加 - Brewing Standの
BrewTimeとFuelもintegerに変わり、total_brew_time、total_fuel、speed_multiplierが追加 - 追加されたデータコンポーネントは以下の通り
minecraft:sign_text_front、minecraft:sign_text_back: 看板の表・裏のテキストを保存し、アイテムのツールチップに表示minecraft:waxed: 内容物がワックス処理済みであることを示すフィールドなしのマーカーminecraft:cushion/color: 配置されたCushionに16種類の染料色を適用minecraft:villager_food: 村人が食べられるアイテムと栄養値を定義minecraft:mob_visibility: 装備がMobの検知距離に与える比率を0.0〜10.0で指定し、重複しても最大視野値は10.0を超えない
看板とデータパック互換性
- データパックバージョンは111.0へ上昇
- 看板のカスタムテキストのコマンドとクリックイベントは、デフォルトではブロッククリック時に実行されず、新しい看板のテキストコンポーネントも自動解釈されない
- 新しい
allow_op_featuresフィールドのデフォルト値はfalseで、以前の動作を復元するには明示的にtrueに設定する必要あり - 以前のバージョンで保存された看板と、看板データを含む
minecraft:block_entity_dataにはallow_op_features=trueが適用
- 新しい
- 配置後の看板編集画面は、ワックス処理されておらず表面テキストを編集できるなど、通常クリックで編集画面を開ける場合にのみ表示
- 看板は
minecraft:sign_text_front、minecraft:sign_text_back、minecraft:waxedコンポーネントを受け渡し /spreadplayersがプレイヤーを配置できる安全なブロックは、#entities_can_teleport_toブロックタグで制御
レジストリ参照と戦利品・進捗の変更
- 専用レジストリを持つ戦利品テーブルタイプは、レジストリ要素とタグ参照をサポート
- 単一要素フィールドはnamespaced IDまたはインライン値を受け取れる
- リストフィールドはインライン値、単一・複数のnamespaced ID、インライン値リスト、
#タグIDを受け取れる - 対象はadvancement、item modifier、loot table、number provider、predicate、recipe、slot source
- predicate、item modifier、slot sourceの既存の
referenceタイプは不要になり削除 - 進捗トリガーの複数のフィールドは、インラインpredicateだけでなくnamespaced predicate IDも受け取れる
- 既存条件リストの暗黙的な
minecraft:all_of動作が削除され、typeを必ず指定する必要あり - 複数の
block、recipe_id、loot_tableフィールドはそれぞれ複数形に変わり、単一ID、リスト、タグをサポート
- 既存条件リストの暗黙的な
- Loot Pool Entryの
conditionsはcondition、functionsはmodifierに名称変更 - Loot Functionの
conditionsはcondition、関数タイプを示していたfunctionはtypeに変更- インライン条件リストは今後受け付けず、同じ動作には
minecraft:all_ofを明示する必要あり
- インライン条件リストは今後受け付けず、同じ動作には
- Predicateのタイプフィールド
conditionはtypeに変わり、minecraft:referenceとminecraft:block_state_propertyは削除- 新しい
minecraft:match_blockはブロックID・タグ、状態、NBT、コンポーネントとコンポーネントpredicateをまとめて検査
- 新しい
- インラインnumber providerは常に
typeを明示する必要があり、今後minecraft:uniformをデフォルト値として使用しない - 調理燃料ごとの燃焼時間とデフォルトの調理・醸造速度、醸造回数を提供する複数のVanilla number providerが追加
Mobスポーンとワールド生成
- 新しい環境属性
minecraft:gameplay/natural_mob_spawnsが、カテゴリー別の重み付きMobスポーンとエンティティ別spawn costを定義- ワールド生成配置中はDimensionとBiomeのみがこの属性を適用
overlay修飾子は上位階層のカテゴリー設定と同じエンティティのspawn costを優先適用
minecraft:gameplay/creature_world_gen_spawn_probabilityは、ワールド生成中のcreatureカテゴリーMobスポーン反復確率を0以上1未満で指定し、デフォルト値は0.1- Biomeの
spawners、spawn_costs、creature_spawn_probabilityは削除され、新しい環境属性へ移動 - 周囲パーティクル環境属性は、タイムラインのキーフレーム間の確率を補間し、下位階層のパーティクルリストに項目を連結する
append修飾子をサポート - Noise Settingsでaquiferとore vein設定を、それぞれ任意の
aquifersオブジェクトとore_veinsリストに再構成- 設定がなければ該当するaquiferまたはore veinを生成しない
- 関連するdensity functionフィールドは
noise_routerから新しい構造へ移動
- Density Functionに
sub、div、negate、lerp、floor、round、ceil、truncate、beardifierが追加- 複数の既存引数名は
value、left、right、input、noiseに変更 invertはreciprocalに名称変更final_densityには今後beardifierが暗黙的に加算されない
- 複数の既存引数名は
グラフィックと主なバグ修正
- リソースパックバージョンは92.0へ上昇
- 順序非依存透明度(order-independent transparency)をサポートするシェーダーと
OIT_ALWAYS_WRITE_DEPTH定義が追加 core/integrate_depth.fshは3D HUDと常に上に表示されるgizmoの深度バッファをメイン深度バッファに統合- 修正された主な問題は以下の通り
- 非QWERTY配列とmacOS・CJK入力に関連するキーバインドおよび入力問題
- Improved Transparencyでの地図レンダリングのクラッシュ、ガラス・半透明オブジェクト・パーティクル・ワールド境界表示の問題
- ワールド高度外の発射体と最低高度でのミツバチの巣配置によって発生していたクラッシュ
- ワールド生成のheightmap保存・読み込み問題とtick sprint後のMob位置の非同期化
- Cushionの配置、色、カスタム名、燃料時間、衝突判定の問題
- Ender Dragonのダメージ・飛行、観戦者のポータル使用、
/spreadplayersの安全ブロック判定の問題
インストールとテスト時の注意事項
- SnapshotはMinecraft: Java Edition向けで、Minecraft Launcherの
InstallationsタブでSnapshotを有効化してインストール - テスト版はワールドを破損する可能性があるため、バックアップするか、通常のワールドとは別のフォルダーで実行する必要あり
- クロスプラットフォーム用のMinecraft server jarも提供
- バグはMinecraft issue tracker、意見はFeedbackサイトで提出可能
1件のコメント
Hacker Newsのコメント
このバインディングのLWJGL実装はGTNHモッドパックのチームメンバーが書いたもので、vanilla→modded→vanillaの循環が再び完成した https://github.com/LWJGL/lwjgl3/pull/1033
最近、ゲームTribal Trouble(https://github.com/bondolo/tribaltrouble)をGLFWからSDL3へ移行したが、全体としてはスムーズなリファクタリングだった。排他的フルスクリーンとデスクトップフルスクリーンでいくつか問題はあったが、最終的には解決できた
厄介な画面モード処理を試して文書化するためにデモも書いた。ゲームはMinecraftのようにJavaだが、デモはできるだけ単純にするためCを使った
Windowsの排他的フルスクリーンは、特にマルチモニター環境でゲームを壊すことがあり、Waylandでは入るだけで壊れるという既知の問題がある。どちらも普通はスナップショットを延期してよいブロッカーバグに見えるので、正式リリース前には直ってほしい
安定性への期待値は、長期サポート版、正式版、リリース候補、ベータ、アルファ、スナップショット、たった今マージされたコミット、未マージのPR、ドラフトPRの順だと考えている。大きなバグならリリース候補やベータを遅らせるべきだし、致命的なバグならそもそもマージを止めるべきだが、CIを通ってマージされたバグのせいでスナップショットを遅らせる理由はない
スナップショットは、ユーザーが自分でmainをビルドしなくても実行してフィードバックできるよう、現在の状態を定期的に切り出して配布するものに近い
スナップショットはバグがないと約束したことはなく、むしろその逆が前提
Minecraftをまったく知らない技術者の父親が、2026年に家族用サーバーを立てるにはどうすればいいのか気になる。子どもたちは今のところiPadと、ときどき古いMacBookやWindows PCで遊んでいる
標準のJavaサーバーを運用しつつ、GeyserでBedrockプロトコルをリアルタイム変換できる。制約の厳しいBedrockクライアントには回避策が必要なこともあるが、選択肢の多いJavaサーバーを中心に管理できる
最新のJVMを使い、許容できる範囲まで最大メモリを増やしてZGCを使えば十分。根拠なく多数のフラグを調整したり、Eden領域サイズと目標停止時間のような相反する設定を一緒に入れている指南もある
ZGCはレイテンシが非常に低く、ヒープが大きいほど性能低下が少ないが、オブジェクトヘッダー圧縮を維持するには32GB未満にしておくのがよい。最新のJVMはメモリ使用量と全体的な性能も改善してくれる
さらに性能が必要ならfabricとlithiumを入れればよい。Paper・Spigot・Purpurのようなものは自動化設備を壊すことがあるので避けたほうがよい
itzg/docker-minecraft-serverを何年も安定して使っており、依存関係を一つずつ入れなくてもイメージが全部処理してくれる点がよかった。Bedrockサーバーのイメージもあるが、うまく動かせなかった
最も楽に運用するには全員がWindows・Mac・LinuxでJava版を使うことだが、そうでなければホスティングサーバーのRealmsを契約する方法もある
家族サーバーの目的によっては合わないかもしれないが、子どもたちが素早く簡単に一緒に遊ぶには最も簡単な方法。長い間BedrockにこだわってからJavaへ移り、もっと早く切り替えなかったことを後悔した子どもたちも見てきた
Icculus が SDL2 から SDL3 へゲームを移植する素晴らしい動画を上げており、Doom の移植動画はこちら: https://www.youtube.com/watch?v=ixdeGhsoxy8
Minecraft が単なるゲームよりも、ますます 独自のゲームエンジン に近づいているのが驚き
GLFW を離れた理由が文書化されているのか気になる。GLFW を使っているプロジェクトがあるので、SDL のほうがより良い選択なのか いつも考えてしまう
SDL3 は Wayland 対応がもともとしっかりしている。Minecraft では GLFW はウィンドウ生成、タスクバーアイコン、フルスクリーン、入力にしか使っておらず、残りは生の OpenGL で処理しているので移行も簡単だった。今では Vulkan まで対応し、Linux デスクトップと Steam Deck で完全にモダンなスタックを使える
SDL3 は Android 4.2 でも動作し、Java なしで SDL3 と ImGui だけでアプリを作ったこともある
すべてのプロジェクトで大きな差になるとは限らないが、SDL のほうが機能が多く移植性も高い
リズムゲーム osu! も最近 SDL2 から SDL3 に移行し、性能とレイテンシが大きく改善した。SDL3 の導入はやや遅く見え、Minecraft が今まで GLFW を使っていたのも意外
特に SDL3 へ移行した後は、osu! 実行中に Discord クライアントを開いていたときに起きていた遅延が消えた。YouTube の開発動画で見た内容だと記憶している
Ubuntu 24.04 には最初から SDL3 が含まれておらず、SDL3 が思ったより新しいため、導入速度が期待より遅い理由の一つに見える
SDL2 は特に Vulkan・Metal を含む GPU API 抽象化 で老朽化が目立っていたため、SDL3 への移行は妥当。Java 版の Linux で長く続いていた入力遅延や Alt+Tab の問題も、ウィンドウ・入力層の変更で解決するのか気になる
モッドを活発に支援するには、Java や C# のような 逆コンパイルやランタイム改変が容易な言語、あるいは JVM や .NET CLR を使うほうが良さそう
内部変更を行いながらモッダーまで考慮するなら、実質的に追加コストなしで優れたモッディング API を得られる