Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RenderingContext の draw 系関数から Style に関係するステートを削除する #117

Open
lriki opened this issue Jan 9, 2020 · 0 comments
Labels
proposal 実装済みの機能を変更する場合に使用する。

Comments

@lriki
Copy link
Collaborator

lriki commented Jan 9, 2020

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 ステートフル

ステートレス方式はいわゆる数学的に単純であるが、パラメータが多くなるためほとんどのケースでは冗長なコードが増え、メンテナンスが難しくなる。

ステートフル方式はパラメータが少なく簡単に使えるが、プログラマが現在の状態を正しく認識することが難しく、不具合が発生しやすくなる。

ステートリセットと Push/Pop

ステートフル方式の問題の軽減策として、ステートの Reset と Push/Pop による復元をサポートする。

Note

実際のところステートは Font や Color だけではなく、RenderTarget や BlendState など多岐にわたる。

もし完全ステートレスを目指すなら DX12 や Vulkan の Pipeline 相当のデータ構造が必要になるが、パフォーマンスを徹底的に追求するならまだしも、
フレームワークというものが目指すものである「制約を設けて開発速度を上げる」からは逆の考えになってきそうなので思い直した方がよさそう。

@lriki lriki added the proposal 実装済みの機能を変更する場合に使用する。 label Jan 9, 2020
lriki added a commit that referenced this issue Jan 9, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
proposal 実装済みの機能を変更する場合に使用する。
Projects
None yet
Development

No branches or pull requests

1 participant