テキストエディター「Mery」アルファ版 Ver 3.1.0 を公開、DirectWrite の高速化と鬼車の試験的実装

テキストエディター「Mery」アルファ版 Ver 3.1.0 を公開、DirectWrite の高速化と鬼車の試験的実装

今回は DirectWrite まわりの処理を作り直したのと、正規表現ライブラリの鬼車を試験的に実装したので、その概要を簡単にご紹介したいと思います。

スポンサーリンク

DirectWrite の高速化

DirectWrite はマイクロソフトの DirectX というコンポーネントの中のひとつで、文字の描画に関する API を集めたものです。

DirectX といえばゲームで使うものといった印象がありますが、カラー絵文字の描画などで DirectX (DirectWrite) が必要となります。

DirectWrite はグラフィックボードの力を使って描画する仕組みとなっており、高品質な文字を、CPU に負荷をかけずに描画できるといわれています。

DirectWrite の文字描画

従来、Windows では文字描画などにおいて GDI というコンポーネントが使われており、Mac と比べると文字が汚いと言われることがありましたが、DirectWrite でずいぶん改善されました。

GDI はハードウェアの性能が低かった時代に設計されたということもあって、ほとんどの環境で同じように動作するのですが、DirectWrite はそうではありません。

パフォーマンスは OS やハードウェア、ドライバーの最適化に依存しており、環境によっては十分な速度が出ないことや、動作しないこともあります。

ところで、「白源」フォントって GDI でも DirectWrite でも美しいですね。

外部 【文字幅 半角3:全角5 も追加】Ricty を神フォントだと崇める僕が、フリーライセンスのプログラミングフォント「白源」を作った話

Mery では画面の再描画を抑えてみたり、描画済みの部分を再利用してみたりと、DirectWrite の描画の遅さをごまかすためにいくつかの対策をしてきました。

こういった対策は画面のスクロールにおいて有効ですが、背景画像を設定している場合など、すべての行を再描画する必要があるシーンではほとんど効果がありませんでした。

DirectWrite の速度改善

Mery の画面の描画は GDI と DirectWrite が共存しており、従来のバージョンでは 1 画面を描画する間に何度も GDI と DirectWrite を切り替えていました。

切り替えの都度、描画部分を GDI から BitBlt で DirectWrite に渡してやり、DirectWrite で文字を描画したら再び BitBlt で GDI に戻すのですが、この切り替えがボトルネックとなっていました。

特に、背景画像を設定した場合などは実用に耐えないぐらいモッサリしていたんですよね。

そこで本バージョンでは、背景や選択範囲、記号や折り返し線、下線のような、従来は GDI で描画していた箇所をすべて Direct2D で描画することで、GDI と DirectWrite の切り替えを 1 度だけに抑えました。

私の環境 (Windows 10 + NVIDIA GeForce GT730) ですと体感速度で 1.5 倍 ~ 2 倍ぐらいの高速化ですが、従来のモッサリ感とは違って、そこそこキビキビした動作になったように感じます。

ASUS NVIDIA GeForce GT730搭載ビデオカード ファンレス GT730-SL-2GD3-BRK

ASUS NVIDIA GeForce GT730搭載ビデオカード ファンレス GT730-SL-2GD3-BRK
Asustek
ファンレスで省エネで長寿命。ゲームもそこそこ遊べます。

なお、Windows 7、8 のように DirectWrite のバージョンが古い場合や、グラフィックボードの性能が非常に低い場合では、今回の対策によって逆に遅くなってしまうケースもあるかもしれません。

しかしながら、それなりのグラフィックボードを搭載 (またはオンボード) した Windows 10 であれば、実用に耐えるレベルで快適になるのでないでしょうか。

鬼車の試験的実装

現在、Mery の正規表現ライブラリとして利用させていただいているのは鬼雲 (Onigmo) ですが、Ver 2.5.0 より前は鬼車 (Oniguruma) でした。

鬼車と鬼雲

名前が似ているのでややこしいですが、鬼車 (Oniguruma) がオリジナルで、鬼雲 (Onigmo) はその派生版となっており、Mery では 64 ビット版をリリースするタイミングで 64 ビットに対応している鬼雲に切り替えた次第です。

当時、まだ 64 ビットに対応していなかった鬼車ですが、ここ数年で 64 ビットに対応し、「可変長の戻り読み」という機能を搭載した正式版がリリースされたとのことで、Mery でも使えるようにならないかというご意見をいただきました。

32 ビットの頃は鬼車と鬼雲で互換性があって、DLL を差し替えるだけで動いていたような気もするのですが、それぞれ 64 ビット対応の方針や仕様が異なるためか、単純な差し替えでは動作しなくなってしまったようです。

鬼車対応の目的

今回、鬼車に暫定対応した理由のひとつは、フォーラムにご報告いただいた以下の問題が改善できるということです。

フォーラム 中途半端な正規表現で検索すると応答なしになる

これは鬼雲を使用したアプリケーション全般で発生する問題で、私の力ではどうすることもできないと思っていたのですが、鬼車では改善されています。

しかも、鬼車の公式なテストプログラムに含まれるtest_utf8.cというファイルの中に、なんと当サイトの該当記事が参照されており、ちょっと興奮しました。

可変長の戻り読み

それからもうひとつ、鬼車に新たに搭載された「可変長の戻り読み」という機能を体験してみたいという技術的好奇心もあります。

私は正規表現に詳しくないので「ワーイ、便利ー!」と思ったぐらいですが、可変長の戻り読みが搭載されたのはすごい出来事らしいです。

ちなみに、\sが全角空白にもマッチするなど、鬼雲と仕様が異なる箇所がいくつかあるようです。

Mery は bregonig.dll を使用せず、鬼車のソースコードにも手を加えず、直接 onig.dll を使用できるテキストエディターなので、新しい鬼車の性能を気軽に試せるツールとして何かのお役に立てればというのが、今回、鬼車を試験的に実装した目的です。

鬼車を使用する方法

既定の正規表現ライブラリが鬼車になったわけではありません。

鬼車を有効にするためには、Mery を終了 (常駐している場合はトレイアイコンも終了) した状態で、メモ帳などを使って Mery.ini のSearchセクションにFindOnig=1を追記します。

Mery.ini は通常、C:\Users\<ユーザー名>\AppData\Roaming\Mery\Mery.iniにあります。

Mery.ini
[Search]
FindOnig=1

あとは普通に Mery を起動すると鬼車が有効になります。

鬼車を使用する方法

[ヘルプ] メニューから [バージョン情報] を開いて Oniguruma の箇所にバージョン番号が表示されていれば鬼車が有効になっている状態です。

今後の予定

これを機に鬼車に移行するとか、鬼車と鬼雲をいつでも切り替えられるようにするとか、そういったことは今のところ何も考えていません。

また、今回の鬼車対応は試験的なもので、今後、これらの隠し機能は廃止となる可能性もあるので、ご利用の場合はくれぐれもご注意ください。

鬼車、鬼雲、どちらも素晴らしい正規表現ライブラリなので、どちらか一方を選択するというのはなかなかのなかなかですね。

と、私は正規表現ニワカなので、適当にお茶を濁しつつフェードアウトさせていただきます。

咲-Saki-阿知賀編 episode of side-A 1巻 (デジタル版ガンガンコミックス)

咲-Saki-阿知賀編 episode of side-A 1巻 (デジタル版ガンガンコミックス)
スクウェア・エニックス
ニワカは相手にならんよ!

鬼車の実装について不具合をご報告いただける場合はとても助かりますが、鬼車の仕様や正規表現の書き方についてのお問い合わせは回答できませんので、サポート外とさせていただきます。

また、試験的な機能は廃止となる可能性もありますので、ご意見・ご要望 (鬼車と鬼雲の切り替えをもっと簡単にできるように、など) は対応できませんが、ご了承ください。

変更ログ

本バージョンではいくつかの不具合修正や機能改善が含まれています。現在お使いのバージョンで問題がある場合はバージョンアップで改善されるかもしれません。

3.1.0 (2020-09-16)

補足

上記の変更ログについて、補足ということでいくつか抜粋して簡単にご説明および言い訳をさせていただきたいと思います。

[起動時にウィンドウの位置とサイズを復元する] の仕様変更

[...] ボタンで表示されるダイアログで [位置]、[サイズ] のチェックボックスを [オフ] にした場合は前回終了時の位置、サイズを復元します。

デフォルトは [オフ] にしたので、ウィンドウサイズを数値指定で固定したい場合はお手数ですがチェックボックスを [オン] に設定してください。

フォーラム ウィンドウの位置とサイズの復元について(ver.3.0.4)

また、[起動時にウィンドウの位置とサイズを復元する] では最大化の状態を復元しないように仕様変更したので、最大化の状態を復元したい場合は [タブ有効時にウィンドウの位置とサイズを保存、復元する] をご利用ください。

フォーラム 要望

DirectWrite で等幅フォントの幅がずれる問題の対策

従来、DirectWrite を有効にすると、特定のフォントサイズにおいて等幅フォントで半角と全角の幅が正しく 1 : 2 で描画できないという問題がありました。

本バージョンでは、GDI 互換 (GetGdiCompatibleGlyphMetrics) をやめたので、等幅フォントで半角と全角の幅が正しく 1 : 2 で取得できるようになったのですが、内部では座標や幅を整数で管理しています。

DirectWrite、Direct2D では座標や幅は小数なので、本来であればより正確な文字間隔を表現できるのですが、これを整数に丸めて表示するため、小数点以下の誤差が蓄積することで微妙に文字幅がずれてしまうんですね。

現状、GDI と DirectWrite が共存している状態なので、内部の座標は整数のままですが、ずれをある程度補正するような仕組みを作ってみました。

背景画像とウィンドウ分割

従来、背景画像を設定した状態でウィンドウを分割すると描画速度に影響がありましたが、本バージョンではその対策を行いました。

その副産物として、従来はそれぞれのウィンドウに同じ背景画像が複製されていたのですが、本バージョンでは 1 枚の背景画像が分割されたように描画できるようになりました。

折り返しを文書単位に仕様変更

折り返し位置が全体で連動していることにメリットを感じなかったので仕様変更してみました。

従来はCtrlを押しながらルーラーのドラッグで文書単位の折り返し変更でしたが、それを標準とし、Ctrlを押しながらルーラーのドラッグ、および折り返しの変更は全体設定というかたちにしてみました。

この仕様変更にともない、マクロやプラグインから文書ごとに折り返し位置を取得・設定できるようになりました。

ついでに EditorConfig の新しい属性、max_line_lengthにも対応しておきました。

MeryWiki EditorConfig プラグイン

[変換中の文字列を挿入モードで入力] と禁則処理の組み合わせ

ちょうど折り返し位置などで禁則処理をともなう文字をトゥルーインライン入力したときに、カーソル位置をなるべく正しく描画するように修正しました。

ダウンロード

導入が簡単なインストーラー版、設定ファイルを外部に作成しないポータブル版、レジストリを一切使用しない ZIP 版を用意しています。

インストーラー版

解凍などの作業が必要なく簡単に使えるインストーラー版です。

Mery Ver 3.1.0 (32 ビット版) インストーラー Mery Ver 3.1.0 (64 ビット版) インストーラー
VirusTotal で誤検出されたり SmartScreen で保護されたりしますが、もちろんウイルスではありません。ご心配なかたは正式版が Vector さんか窓の杜さんで公開されるまでお待ちください。

ポータブル版

インストールは不要。通常の ZIP 版と異なり設定ファイルを外部に作成しないので USB メモリに保存して持ち歩けますし、PC 環境を汚すこともありません。

Mery Ver 3.1.0 (32 ビット版) ポータブル Mery Ver 3.1.0 (64 ビット版) ポータブル
ポータブル版は解凍したフォルダの中に、設定ファイルなどのすべてのデータを保存しますので、必ずアクセス権のあるフォルダに配置してください。

ZIP 版

アーカイブを解凍するだけですぐに使える ZIP 版です。

Mery Ver 3.1.0 (32 ビット版) ZIP Mery Ver 3.1.0 (64 ビット版) ZIP
ZIP 版はレジストリを汚したくないかた向けに、インストーラー版の内容を ZIP アーカイブにしたものです。1 つの環境に複数の Mery を導入する場合は ZIP 版ではなくポータブル版をご利用ください。

おわりに

私事で恐縮ですが、右手首腱鞘炎の悪化にともない休養のため Mery の開発とサポートを休止させていただいておりました。

励ましのお言葉や贈り物をくださったみなさん、ありがとうございます。おかげさまで非常にゆっくりではありますが、Ver 3.1.0 をリリースすることができました。

今後も開発は継続したいと考えていますが、どうにも右手が言うことを聞かず、以前のようなペースでの開発およびフォーラムでのサポート体制は厳しいかもしれません。

そういった事情もあって、今回はあまりダウンロードされないことと、バグが出ても怒られないことを願ってアルファ版とさせていただきました。

サンワサプライ キーボード用低反発リストレスト(ブラック) TOK-MU3NBK

サンワサプライ キーボード用低反発リストレスト(ブラック) TOK-MU3NBK
サンワサプライ
なにこれすごい。腱鞘炎の痛みが随分緩和されました。本当にありがとうございました。

スポンサーリンク

関連する記事

フォローする