MGL週報 #27 - MGL 1.1.8 リリース
このエントリはゲーム開発用フレームワーク「MGL」の開発記録です.MGLは次のWebサイトにて無償で公開されています.
週明けとか言っておきながら週末一歩手前になってしまいましたよ.という事で,先ほどリリースしたMGL 1.1.8の更新内容についてざっとお話ししたいと思います.
ファイルパスクラスの追加
ちょっと前の週報でも書きましたが,MGLは環境ごとの差異を吸収するためにマウント名を含めたファイルパスを一般的に用います.このMGL仕様のパスを表現するために,2つのファイルパスクラスを新規に追加しました.
追加したのは MGL::File::Path クラスと,それとよく似た MGL::File::PathView クラスの2つです.これらについて少しご紹介します.
MGL::File::Path
MGL::File::Pathクラスは,C++の標準ライブラリで言うところの std::filesystem::pathに相当するクラスです.パス文字列を格納できる他,パスの編集や解析にも使用できます.
例えば,ディレクトリ名とファイル名が別々に用意されている状態でパスを生成する場合,次のようなコードになります.
MGL::File::Path path("$resource/image");
path /= "character.png";
この手順でpathが表すパスは "$resource/image/character.png" となります.この処理は一般的な文字列の連結とは異なり,必要に応じてパスの区切り文字を自動で挿入します.
MGL::File::Pathクラスはパス文字列を自身で管理します.この性質は,文字列の扱いでありがちな不正な参照やバッファオーバーフローを防ぐという点で優れていますが,パフォーマンス的な観点で見た場合にちょっとした問題も併せ持っています.
パスを自身で管理するという事は,パスを与えられた際にメモリリソースのアロケートと内容のコピーが発生します.このコストはパスを保持したり編集したりする場合には必要経費と言えますが,単に文字列定数をパスとして参照したい場合は無駄なコストでしかありません.そして,ゲームプログラミングにおいては,圧倒的に後者のケースが大多数となります.
この問題に対処すべく用意したもう1つのファイルパスクラスが後述のMGL::File::PathViewクラスです.
MGL::File::PathView
MGL::File::PathViewクラスは先述のMGL::File::Pathクラスと似た機能を備えていますが,自身で文字列を管理せずに参照のみを行います.C++に慣れていれば何となく名前で推察できると思いますが,ちょうど標準ライブラリの std::basic_string に対する std::basic_string_view のようなものです.
このクラスは内部ではポインタ変数1つのみしか保持しておらず,それを通して内容を書き換えることもできません.想定としては,今まで const char *型でパスを扱っていた箇所の置き換えとして用意されています.パスの追加や編集は可能ですが自身は書き換えず,先述のMGL::File::Pathクラスを新規に作成して結果として返します.
参照のみを行うため,安全性もポインタ1つと同程度です.すなわち,参照先アドレスの内容が書き換えられたり,そのアドレスが無効化されたりしていても,このクラス側からはそれを検知できません.このため,参照中は文字列の内容が変更されないという前提で使用する必要があります.もちろん,パスの保持にこのクラスを使用することは絶対にお勧めできません.
その性質上,用途がやや限定的となりますが,正しく扱えばMGL::File::Pathクラスにはない柔軟性を備えたクラスとなっています.
両者の使い分け
性質の異なる似たクラスが2種類あって分かりにくいよ,と思うかもしれませんが,両者は用途が明確であるため悩む必要はありません.
次の2つの用途においては,参照のみを行うMGL::File::PathViewクラスが推奨されます.
関数の引数でパスを受ける場合
文字列定数としてパスを定義する場合
これ以外の用途,すなわちパスの保持や編集などについては,MGL::File::Pathクラスの利用が推奨されます.
Appleプラットフォーム用ファイルデリゲートの追加
こちらは前回の週報に書いた,理由の宣言が求められるAPIへの対処になります.
今回新規に追加したファイルデリゲートは,POSIX準拠のファイルデリゲートを元に問題となる箇所をNSFileManagerで置き換えた実装となります.iOSとtvOSの環境においてはデフォルトのファイルデリゲートとなり,代わりにPOSIXファイルデリゲートは使用不可能としました.
macOSに関しては,今のところは引き続きPOSIXファイルデリゲートがデフォルトとなります.任意で今回追加したデリゲートを使用することも可能です.将来的にはiOSやtvOSに合わせることになるかもしれませんが,この辺はAppleさんの顔色を窺いつつ,いつでも対応できるようにしておく予定です.
UIのイベント機能を新規に再実装
相変わらず未完成のままの状態ですが,UIイベント処理の大幅な変更も今回のアップデートに含まれています.
今までに引き続き,現段階ではこの機能の使用は推奨されません.作り直した事によって欠落した機能などもあるし,かといって今までのものも色々と問題を抱えていましたので,正式にドキュメントにまとめるまでお待ちください.
本来ならばアップデートに含めるべきではなかったのですが,ちょっとこちらの都合で今回に含めることにしました.この辺については近々お話しできればと考えています.