RenderingContext の draw 系関数から Style に関係するステートを削除する
Opened this issue · 0 comments
lriki commented
Proposal
例えば、drawText のシグネチャは次のようになっている。
void drawText(const StringRef& text, const Color& color, Font* font);
これを、次のようにしたい。
void setTextColor(const Color& color);
void setFont(Font* font);
void drawText(const StringRef& text);
Motivation
drawText を UIElement のカスタム実装で使おうとしたときに、既定の設定を使うためには color と font は finalStyle() から取り出す必要がある。
この処理のため定型的なコードが増えてしまい煩わしい。
Implementation
ステートレス VS ステートフル
- ステートレス → WPF の DrawingContext
- ステートフル → HTML Canvas
ステートレス方式はいわゆる数学的に単純であるが、パラメータが多くなるためほとんどのケースでは冗長なコードが増え、メンテナンスが難しくなる。
ステートフル方式はパラメータが少なく簡単に使えるが、プログラマが現在の状態を正しく認識することが難しく、不具合が発生しやすくなる。
ステートリセットと Push/Pop
ステートフル方式の問題の軽減策として、ステートの Reset と Push/Pop による復元をサポートする。
Note
実際のところステートは Font や Color だけではなく、RenderTarget や BlendState など多岐にわたる。
もし完全ステートレスを目指すなら DX12 や Vulkan の Pipeline 相当のデータ構造が必要になるが、パフォーマンスを徹底的に追求するならまだしも、
フレームワークというものが目指すものである「制約を設けて開発速度を上げる」からは逆の考えになってきそうなので思い直した方がよさそう。