見出し画像

MGL週報 #57 - まだまだ大規模リファクタリング

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


今週の作業内容

大規模リファクタリング

予想通り大変だと言うべきか、思った以上に大変だと言うべきか……

長らく続けてきたclang-tidyを用いた大規模リファクタリングも、ようやく区切りが見えてきました。終わりとは言いません、区切りです。

ドキュメントの修正と共に進めていた機能別の修正作業は一通り片付いて、今はMGL全体のチェックと修正を行なっています。

clang-tidyは処理に結構な時間が掛かるため、機能単位で局所的にチェックをかけて修正対応を行なっていました。これらが一通り完了すれば全体のチェックも通るだろうという寸法です。

が、意外にチェックから外れていたものが多かったようで、全体にチェックをかけてみたら対応されていなかった部分が結構ありました。今日中に区切りを付けて「次は○○やります!」的な事を書きたかったのですが。

あと、今回対処しているのはMGLのコア部分のみとなるため、各プラットフォーム固有の実装についてはまだ対応できていなかったります。Windowsについてはこれから対処予定ですが、macOSやiOSなどのAppleプラットフォームは異なる言語が混じるためちょっと難しいかもしれません。

ドキュメント整理

ドキュメントの整理は常に少しづつ行なっているのですが、今回は全体を通して行う必要が出てきました。

MGLのAPIリファレンスはページによって微妙にフォーマットが異なる部分があります。かれこれ2年以上も前に書き始めた都合上、初期の頃に書いたページと最近書いたページが混在しているためです。

例えば、一部のページの内容にはバージョン情報が書かれていませんが、これは初期リリース以降更新されていないページが該当しています。一方、ページの先頭の概要部分に大まかな利用例が記載されているページは、割と最近書いたものです。

今回、全体のリファクタリングの都合上、結構色々なページにちょっとだけ更新を入れています。その際についでにフォーマットを変更していたのですが、そのせいでより「ちぐはぐ感」が増してしまいました。

良い機会なので、全体を一通り読み直して修正を加えていく予定です。


MGL 1.1.13の変更予定内容

全ての列挙型に基底型を指定

MGLはC++17以降を対象にしたフレームワークですので、列挙型は全てスコープ付き(enum class)で扱っています。

C言語由来の列挙型は基本的にint型であり、そのサイズは処理形依存となっていました。一方、スコープを持つ列挙型は基底の型を指定することでサイズの指定が可能となっています。基底型の指定を省略した場合はC言語と同様にint型になります。

追記:スコープを持つ列挙型の導入に伴い、既存の列挙型のサイズ指定も可能になっていたらしいです。知らなかった。

より詳細な仕様については、例によってcpprefjpさんへのリンクを貼っておきましょう。(一応スポンサーですからね、私)

MGLの列挙型は全てスコープ付きではありましたが、基底型は省略していたものが多数ありました。これはサイズにこだわりのない、すなわち動作に支障のないものについては特に指定する必要はないだろうと考えていたためです。

が、今回clang-tidyに「列挙型は極力小さいサイズにするとパフォーマンス的に嬉しいよ」的な指摘を多数受けました。それに伴い、既存の列挙型も含め、MGLでは列挙型に対し、基本的にその値を表現可能な最小のサイズを指定することにします。

基底型の指定のなかった列挙型のサイズが変化してしまうため、その値をバイナリに保存している場合などに正しくパースできなくなるなどの影響が考えられます。そんな事は滅多にしないだろうと考えていましたが、「ぺぐそり+」の設定データに含まれていたらしくデータ破損という扱いになって焦ったのは秘密です。

ちなみに、何で小さいサイズを指定するとパフォーマンス的に有利なのかについては、語りたいところですがちょっとした講義になってしまうため割愛します。一言で言うと、「プログラムの局所性が上がりキャッシュ効率が改善され、CPUストールを最小限に抑えられるため」です。この辺の情報は次の書籍にて詳しく解説されていますので、興味のある方にはこちらをお勧めします。


その他

そろそろリファクタリング以外の事を書きたい。


この記事が気に入ったらサポートをしてみませんか?