見出し画像

MGL週報 #66 - 今週の作業

このエントリはゲーム開発用フレームワーク「MGL」の開発記録です。MGLはzlibライセンスの下に無償で提供されています。


リリース直前という事もあって、今回は作業内容のみにしておきます。


今週の作業

このフォーマット久しぶりな気がします。

エクステンションのMGL 1.1.13対応

MGL 1.1.13の大規模リファクタリングに伴い、公開していたエクステンションの互換性が失われたための対応です。この更新のリリースはMGL 1.1.13と同じタイミングで行います。

当然ながら1.1.12までのMGLでは更新後のエクステンションは使用できないため、今回からバージョンチェックのマクロを仕込んでおきました。もし更新後のエクステンションを1.1.12以前で使用した場合、それを示すエラーメッセージが出るようになっています。

エクステンションの互換性を考慮すると、そもそもMGL自身に破壊的変更を加えるのを控えるべきではあるのですが、今はまだMGLがそこまで安定期に入っていないのが実情です。むしろ、互換性の縛りがマイナス方向に働くリスクのほうが大きいため、当面はこんな感じで随時更新を入れていくことになるかと思います。

MGLがある程度落ち着いたらバージョン1.2.0とかにする予定ですので、エクステンション開発はそこからが本番という感じでしょうか。それは一体いつになる事やらですが。

Appleプラットフォームの動作検証

最近は気候的に春と秋が失われている気がしますが、秋といえばAppleプラットフォームのOSのメジャーアップデートが行われる季節です。という訳で、macOS 15.0(Sequoia)、そしてiOS/iPadOSとtvOSの18.0が先週リリースされました。OSのメジャーアップデートには慎重になる方もいますが、私はMGLやリリース済みのゲームの動作チェックがある都合で基本的に即日アップデートを行なっています。

検証結果を先に述べると、SDKの更新に伴って不具合が見つかってしまいました。GameControllerフレームワークを用いたゲームパッドデリゲートにおいて、メモリの範囲外アクセスを行っていたようです。

C++の欠点の一つに、少し迂闊なコードを書くと簡単に管理外のメモリ領域へのアクセスを許してしまうというものがあります。今回の不具合の原因もやはり、配列のサイズ指定のミスという迂闊な実装によるものでした。これで不具合が生じるのはどの言語も同じですが、CやC++の場合は未定義動作となるため不具合が起こっている事に気付きにくいのです。

不幸中の幸いだったのはstd::arrayを使用していたことです。今回更新されたSDK(libc++)には添字アクセス時に境界をチェックするアサーションが入ったらしく、これが無ければ発見が遅れていたことでしょう。肯定的に捉えるなら、今回の更新のおかげで今後は同様のミスを見落とす事は少なくなるかもしれません。

Xcode 16にバンドルされたstd::arrayの添字アクセスのコード。範囲外アクセスのアサーションが仕込まれている。

こういった事例もありますので、C++で配列を扱う場合はC言語由来の配列を直接使用せず、極力std::arrayを使用しましょう。パフォーマンスよりも安全性を重視するなら、at()を用いることで範囲外アクセスの際に例外を送出させることも可能です。

念の為に動作への影響を調査してみたところ、この不具合によってXboxゲームパッドのシェアボタンが認識しなくなる可能性がありました。該当ボタンはXbox Serise X/S以降のモデルにしか存在しないため、このボタンに対するチェックが漏れていたようです。なお、Windowsは使用しているデリゲートが全く異なるため、この不具合は発生しません。

それ以外の動作に関しては、今のところは特に問題は確認できていません。発見した不具合の修正は1.1.13の更新に含める予定です。

ドキュメント整備

もうソースコードに触れるような作業は終えているため、後はひたすらドキュメントの更新です。これは後からも更新しやすいとはいえ、リリースまでに極力整えておきたいところ。少なくとも、ドキュメントの内容と実装内容に食い違いが生じていないレベルには持っていくつもりです。


その他

順調に行けば、次の週報のタイトルは「MGL 1.1.13リリース」となる予定です。なるといいなあ。

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