1行32万文字の行末移動と折り返し

この記事は約3分で読めます。

1行32万文字を色々試してたら、java scriptみたいなハイライトとかコメントとかを判断する必要のあるテキストの行末移動はめちゃくちゃ遅いです。試しに普通のテキストで確認してみました。そうなんですよ。そこまで遅くないんですよね。ただ、折り返すとこれまた遅いです。

差分折り返しの弱点

せっかく性能面を考慮して差分で折り返してるんですが、1行しかないんで差分とか関係無いんですよね。
自作エディタの折り返し計算するのは画面に表示可能な論理行数でしているので、1行32万文字あって右端125文字の場合、一度に2,560行の折り返し情報を作成してます。なんでね、また遅いんです。

これは折り返す処理を見直してもいいかもしれません。基本的には論理行数で折り返すけど、判断は論理行数と物理行数の両方で見るようにするとか。ってか、かなりのレアケースだと思うので、そこまで実装する必要あるかなーと思っています。

性能目標

自作エディタの性能面での目標は世界最速エディタ基準でも何でもいいんですが、基本的にネイティブでできてるテキストエディタの80%ぐらい出せればOKかなと思って作成しています。

差分折り返しのスクロールバー

あと、差分折り返しだとスクロールーバーが独特の動作になります。

多分、普通のテキストエディタの場合、スクロールバーの表示範囲って物理行数だと思うんで今回のケースだと1~2,560の範囲で移動できると思うんですが、自作エディタの場合は論理行数にしています。なぜかというと画面に表示している行を動的に折り返しているので物理行数ってわからないからです。

論理行数から物理行数の割合でできなくはないんですが、つまみスクロールしてドラッグをやめると、つまみが移動しちゃいます。

なので、今回のような場合、1~1の範囲でしか移動できないんです…。これは差分の折り返しの仕様でどうすることもできないですね。

ブログ運営

せっかく「テキストエディタを作るブログ」って名前でブログ運用しようとしてるので開発してるっぽいことを書いてみました。どこまで続くかは不明ですが。

え?なんで「C#でテキストエディタを作るブログ」じゃないのって思ってる人もいるかもしれません、(多分おらんね)

もーね、だいたいエディタ作成方法がわかってきたんで、C#にこだわる必要も無いかと。できればC++で作り直したいっていつも思っています。そん時用ですかね。多分無いとは思いますが…。あればよろしくお願いします。

ただね、ここまで長い年月かけてC#でやってきたんでね。捨てられないってのが本音です。実装時間は少ないですが、開発期間はかなり長いですw

現在の開発状況

最後に、1行32万文字の行末移動と折り返しのGIFを上げておきます。カーソルの線が残ったりしていますが、スクロールバーとかの雰囲気が伝わればと思います。上下のスクロールもおっそいです。

コメント

タイトルとURLをコピーしました