今日やったこと: 2018/09/24

RenderContextのリファクタリング

Delirのエンジン内には、進行中のレンダリングに関する情報(コンポジションのサイズとか、レンダリング中のフレーム番号とか)を抱えるRenderContextというものがあるんだけど これが実はレンダリングのステップによって実は4種類くらい存在する。

その4種類の内、2種類はRenderContextPreRenderContextという形で表現されていたが、もう2種類はnullableプロパティが埋まってるかどうかで区別されていた。 この構造によって、ある状況で埋められるべきプロパティが埋められているかどうかが型検査時には保証できず、ランタイムにお祈りを捧げるしかなかった。

そんなのが辛いと嘆いていたら @orekyuu から助言を頂いた。

まず全てのContextで必ず存在するプロパティをまとめてRenderContextBaseというクラスに集約し、全ての派生型はこのクラスに実装された#to**RenderContextメソッドを経由するようにした。 これにより、そのメソッドコールの型検査を通過していれば、埋められるべきプロパティが埋められていることを確約できるようになり、安心して利用できるようになった。

詳しくはこのコミットを見てほしい

Refactor engine by ra-gg · Pull Request #181 · ra-gg/Delir · GitHub

***RenderTaskのリファクタリング

昨日、Parameter Reference APIをマージしたけど、キーフレーム周りのコードが重複しまくっていてつらかったのでリファクタリングした。 計算処理自体は関数化されていてDRYなんだけど、それらをクリップ・エフェクトのキーフレームに適用する部分が重複してた。

とりあえずキーフレームの処理に関しては同一のものとして扱うべきなので、ParameterTableというクラスに切り出した。 エクスプレッションの適用処理もインターフェース自体はクリップとエフェクトで違いがなかったのでこのクラスに詰めてとりあえず重複コードをある程度減らせた。

ここが切り出されたクラス

https://github.com/ra-gg/Delir/pull/181/commits/9f3eb186cd60ad70b21aded7b42737407d735cda#diff-69acab044fde8ac299c9e66d52c2806d

そしてこれが切り出される前の重複コード

ParametersTable クラスができたことで、キーフレームの探索処理もこのクラスに集約できるようになっていい感じになった。エクスプレッションの適用はまだ地獄味があるけど。