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

コマンドが増えると重くなっていくのを改善する #2143

Open
sigprogramming opened this issue Jun 29, 2024 · 4 comments
Open

Comments

@sigprogramming
Copy link
Contributor

内容

コマンドはstate.redoCommandsstate.undoCommandsで保持していますが、
コマンドが増えるとstateが大きくなり、stateが大きくなるとproduceWithPatchesで時間がかかるようになって、UIが重く(編集時に一瞬固まるように)なります。
これを改善したいです。

コマンドの数とproduceWithPatchesにかかる時間の関係は以下の通りです。
COMMAND_UPDATE_NOTESの方はノートが600個ある状態で計測しています)

  • COMMAND_ADD_NOTES

ADD_NOTESしたとき

  • COMMAND_UPDATE_NOTES

UPDATE_NOTESしたとき

Pros 良くなる点

  • UIが軽くなる(編集時に固まらなくなる)

Cons 悪くなる点

  • undoの範囲を制限すると、時間がたってミスに気づいた場合にundoできなくなる

実現方法

  • undoの範囲を制限する
  • storeの外でコマンドを保持するようにする
  • stateの一部をproduceWithPatchesに渡すようにする

その他

@Hiroshiba
Copy link
Member

Hiroshiba commented Jun 29, 2024

issue作成ありがとうございます!!

60fpsの1フレームである16msを目指したい、あるいはせめて100ms未満を目指したいですね・・・。

produceWithPatchesが重く、かつコマンドが増えるたびに重くなるのであれば、state.undoCommands自体に値が溜まっていくのが主な原因かも・・・?
もしそうだとしたら、createCommandMutationのあたりでstateからundoCommandsを省いて軽くなるかで検証できるかも・・・?

export const createCommandMutation =
  <S extends State, M extends MutationsBase, K extends keyof M>(
    payloadRecipe: PayloadRecipe<S, M[K]>,
    editor: EditorType,
  ): Mutation<S, M, K> =>
  (state: S, payload: M[K]): void => {
    const { undoCommands, ...noCommandState } = state; // add this ilne
    const command = recordPatches(payloadRecipe)(noCommandState as S, payload); // add this ilne
    applyPatchesImpl(state, command.redoPatches);
    state.undoCommands[editor].push(command);
    state.redoCommands[editor].splice(0);
  };

@Hiroshiba
Copy link
Member

あ、issue内容とあまり関係ないのですが、測定はどうやってされましたか? 👀
さくっとやる方法があればぜひ知りたいな〜と・・・!!

@sigprogramming
Copy link
Contributor Author

測定のコードです!
sigprogramming@913a2e7
(productionモードで起動して、ノートを追加→全選択→ノートを移動の順で行いました)

produceWithPatchesが重く、かつコマンドが増えるたびに重くなるのであれば、state.undoCommands自体に値が溜まっていくのが主な原因かも・・・?
もしそうだとしたら、createCommandMutationのあたりでstateからundoCommandsを省いて軽くなるかで検証できるかも・・・?

state.undoCommands[editor].push(command);をコメントアウトすると1~3msになり、軽くなりました。

@Hiroshiba
Copy link
Member

なるほどです!! 十中八九コマンドのステートが重くなっていくからな気がしますね!!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants