見出し画像

MGL週報 #20 - MGL 1.1.6リリース,WWDCあれこれ

このエントリはゲーム開発用フレームワーク「MGL」の開発記録です.MGLは次のWebサイトにて無償で公開されています.

前回から3日間しか経っておらず「週報とは?」となってしまいますが,MGLの更新連絡ついでに週報という事にしてしまいましょう.

MGL 1.1.6 リリース

MGLのバージョン 1.1.6 をリリースしました.様々な都合で前回入りきらなかった小規模なアップデートになります.

リリースノートはこちら.

小規模ではあるものの,いくつか動作に関わる変更点があります.ざっくりとした変更内容は次の通りです.

フォントに表示上限数の設定を追加

MGL::Render::Font::SetLimitsによって表示する文字数に上限を設定できるよう対応しました.この機能は何に使うのかというと,文字送りアニメーションを行う際に必要になります.

ゲームにおける文字表示の定番の表現として,瞬時に全てを表示せずに1文字づつ順に表示する表現方法があります.最も有名なのはドラゴンクエストの会話メッセージでしょうか.あの「ピピピピピ……」という短いSEと共に流れるように文字が表示される表現です.

これは表示する文字列を加工することでも実現できますが,それよりも表示側で文字数を制御したほうが好都合です.例えば,最初に上限数に0を設定しておき,一定時間おきに加算するような実装です.これなら余計な処理は不要なうえにフロー的にもシンプルになるはずです.

また,全ての文字が表示された事を知るためにMGL::Render::Font::Printに戻り値を追加しました.指定された文字列が最後まで表示されれば true が返るため,例えばアニメーション処理からボタン入力待ちに移行のような判定に使用できます.

この機能はゲームプログラミングにおいては必須級に重宝するのですが,何だかんだで実装が後回しになってしまっていたのですよね.これでようやく後ろめたさが1つ減りました.

文字描画後の自動改行を削除

今までフォントで文字列を描画した際に自動で改行されていました.例えば,

font.Print("AAA");
font.Print("BBB");

と書いた際に,AとBの間に改行が入り2行で表示されていました.

今回のバージョンでこの動作を変更し,明示的に改行しない限りは行を変更しないようにしました.したがって,1.1.6以降では上記のコードは "AAABBB" と1行で表示されます.

ゲームプログラミングはコンソール環境と違いピクセル単位で文字を描画するため,自動改行は行わないほうが何かと都合が良かったりします.では何故今まで自動で改行されていたのかと言うと,実は意図した動作でなかったのです.修正するとそこそこに影響範囲が広いためどうしようかなと対処を戸惑っていたのですが,やるなら今だろうと言うことで今回ようやく修正しました.これでまた1つ後ろめたさが減りました.

macOSの実行時型情報をデフォルトで有効化

これはフォントとは無関係なお話.macOSで実行時型情報がデフォルトで無効になっていたのですが,これを有効にしました.

実行時型情報が何なのかと言うと,C++でクラスの種類を判別するために付与する情報です.この情報は基底クラスから派生クラスへの変換,すなわちダウンキャストを行う際に必要となります.しかし,この存在によりパフォーマンスに若干の影響を与える事や,ダウンキャスト自体が設計上あまり好まれないという理由により,C++コンパイラにはこの情報を無効化する機能も備わっています.

要するに「無効化するとちょっと速くなる」(かもしれない)機能であり,MGLではこれを無効にしてもちゃんと動くように作られています.ですが,この設定はアプリケーション側の作り方に影響するだけでなく,ライブラリ側とアプリケーション側の設定が一致していないと正しくリンクが行われない場合もあります.Xcodeはプロジェクトを新規に作成した場合,デフォルトではこの機能は有効になっていますので,MGL側もそれに合わせてデフォルトで有効にしました.もちろん,任意に無効にすることは可能です.

……ええ,これも単に私のミスです.「ぺぐそり+」はこの機能を無効にしてリリースしたのですが,その時の変更がそのまま乗ってしまっていたのですよね.なので,同じXcodeプロジェクトで管理されているiOSとtvOSは今までのバージョンでもデフォルトで有効になっています.ああ,また1つ後ろめたさが減りました.


WWDCあれこれ

先日,AppleのイベントであるWWDCが行われましたね.あのイベントは製品発表会のようなものとして広く知られていますが,本来はデベロッパーカンファレンス,すなわち開発者向けのお話をするイベントだったりします.新製品を発表するのは基調講演と呼ばれるオープニングイベントなんですね.

開発者にとってWWDCはワクワクよりもハラハラです.と言うのも,Appleは割と容赦なく破壊的変更や対応必須な新機能を放ってくるため,自分が作っているものにどれだけ影響があるかをチェックする必要があるのです.そのおかげでレガシーが少ないとも言えるのですがね.

そんな訳で,今回のWWDCで気になった事をいくつかリストアップしてみました.

SwiftとC++の互換機能

MGLに最も影響がありそうなのがこちら.既にドキュメントが用意されているようですので,リンクを貼っておきましょう.

MGLはC++17向けのフレームワークですが,AppleプラットフォームのAPIは低レイヤな部分を除いたほとんどがSwiftかObjective-Cで提供されています.これらのAPIはC++からは直接呼び出すことはできません.そのため,MGLではAPI側の部分をObjective-Cで記述し,Objective-C++という少々特殊な言語を経由することでこの差異を解決しています.

さて,現在Appleが推奨している言語はSwiftです.しかし,これまではSwiftとC++との間にある壁は高く,不可能ではないにしろ不便で遠回りな方法でブリッジする必要がありました.この壁は同時にゲーム開発における移植性の壁にもなっています.これはゲームエンジンを利用していても例外ではなく,ユーザーが直接扱うことはなくとも,そのゲームエンジン自体がC++に依存している事は珍しくありません.

そういった理由かどうかは不明ですが,次のXcode15からはSwiftとC++を相互に運用するための機能が追加されるそうです.まだドキュメントをあまり細かく読んでいないのですが,クラスや関数は相互に呼び出し可能みたいです.C++からSwiftのAPIを扱いやすくなるのは嬉しいですね.

ただ,これはObjective-Cがお役御免になる兆候のような気もします.そうなると既存のObjective-CのコードをSwiftで書き直す必要があり,それはそれで面倒なお話です.とは言え,この流れは予想していた事でもあるので,そろそろ重い腰を上げる頃合いなのかもしれません.

Game Porting Toolkit

基調講演でも紹介されていた,ゲームを簡単にmacOSに移植できるツールだそうです.調べてみたところ,どうやらフレームワークのようなものではなく,Windows向けバイナリをエミュレーションして動作させる仕組みらしいです.

MGLは元からネイティブ対応しているため,このツールにお世話になることは無さそう.セッションでも最初の方で少しだけ紹介しつつ,そこからmacOSにネイティブ対応させる方法について話を移しているあたり,これ1つで全てを解決させるつもりは無さそうですね.

ユーザー的にはSteamDeckのProtonみたいにシステムに含めてくれたほうが嬉しい気もしますが,それはそれで多方面で問題になりそうなのが容易に想像できます.

macOSのゲームモード

基調講演で紹介されていた,次期macOS向けに搭載されるらしいゲームモード.CPU・GPUのリソースを優先的に割り当てつつ,Bluetoothのポーリングレートを倍にして低遅延を実現する……のような感じで紹介されていましたね.いかんせん解説しているセッションが見当たらないし,リリースノートにも記載が無くて詳細が不明なのですが……まあ,紹介された通りの機能なのでしょう.そう信じていますよ.間違ってもアプリ側の対応が必要とか無いですよね?

個人的にはこれと同じモードをAppleTVに欲しいと思っています.あのデバイス,ゲームによっては支障をきたすレベルに遅延が酷くて,それがAppleTV版「反撃BLOCKS」を作るだけ作って配信しなかった理由の一つでもあったりします.リモコンでの操作は快適だったんですけどね.


その他

ところで将軍,Acerolaが助けを求めている.
記事にリンクを貼っておくので確認してきて欲しい.

いいなと思ったら応援しよう!