文字が一瞬だけ2重に表示されますNo.06898
foobar さん 12/01/12 11:51
 
HOME/ENDキーで行頭行末を移動していると、一瞬だけ文字が2重に表示されることが
あります。

画像はコチラ
http://imageshack.us/photo/my-images/850/20120112hidemarub.png/
http://imageshack.us/photo/my-images/641/20120112hidemarua.png/


(環境)
windows7 64bit
秀丸エディタ8.12 b3

[ ]
RE:06898 文字が一瞬だけ2重に表示されまNo.06899
秀まるお さん 12/01/12 12:10
 
 スクロールの処理は、一応これは他のWindowsソフトもだいたい同じだと思い
ますが、スクロールの処理の最中に文字が二重に見えることはありえると思いま
す。
 例えばEndキーを押してウィンドウの中身が左方向に半分ずれる例だと、秀丸
側の処理としては、

 1.ウィンドウ右半分の内容を左半分側にビットマップ転送する。
   (WindowsのScrollWindow関数呼び出しする)
 2.ウィンドウ右半分を描画しなおす。
   (WindowsのUpdateWindow関数呼び出し、および秀丸側での
    WM_PAINTの処理発生)

 となりまして、1と2の間に一瞬だけ文字が二重に見えてしまうことはありえ
ると思います。

 もしそう理由で二重に見えてるだけでしたら、たぶん本当に一瞬だけだと思う
ので、気にしないで使っていただくしか無いように思います。

 しいて、そういう中間的な状態になるのをなんとかするとしたら、いわゆるダ
ブルバッファリングって処理をする手はあります。つまり、

 1.ウィンドウと同じサイズのビットマップをメモリ上に作成する。
 2.ウィンドウの右半分をビットマップの左半分側に転送する。
 3.ビットマップの右半分を描画する。
 4.ビットマップ全体をウィンドウに転送する。

 とやると、文字が二重になることはありません。実際、ゲームとかではこうい
う描画をやってると思います。

 ただ、これをやると、ビットマップの転送量が増えるので、結果としてスク
ロールが遅くなるし、画面の描画開始のタイミングが遅くなるので、キーを押し
てから固まったような感じでかえってレスポンスの悪さを感じる可能性が高いで
す。


 ちなみにですが、文字を描画する時にも似たような問題がありまして、それに
ついては最近のバージョンで「動作環境・表示/操作・文字の描画」の中に「ち
らつき防止の描画方式」というのを追加した所でした。ただ、これは意図して追
加したというよりは、Direct2D方式で描画するのにどっちみに必要な処理だった
ので、ついでに追加した所になります。

 ということで話が長くなってしまいましたが…。

 結論的には仕様ってことで、気にしないで使って欲しいという感じですけど、
どうでしょ?

 それとも、画面がキャプチャ出来るくらい(秒単位で?)遅いってことでした
ら、何か別の原因があるのかもしれませんが…。例えばウィンドウサイズを変更
した時に折り返し桁数の再計算が動いたりすると大変遅いことはありえますか、
Home/Endキーを押しただけでそういう再計算が動くことは無いはずで、その辺ち
ょっと分からない所です。

[ ]
RE:06899 文字が一瞬だけ2重に表示されまNo.06900
foobar さん 12/01/12 14:41
 
>  となりまして、1と2の間に一瞬だけ文字が二重に見えてしまうことはありえ
> ると思います。

メモ帳でも今回のような現象が起きることを確認できました。
ただ、メモ帳は秀丸に比べて1と2の間の時間がだいぶん短いようで、
文字が2重に表示されてもまず気がつきません。

一方、秀丸エディタはメモ帳に比べると1と2の間が長いようで、素速
く操作を行うと残像が残る印象を受けます。
(秒単位で遅いわけでは無く、一瞬の出来事ですが)

実用上困っているわけではありませんが、もし改善の余地があるようで
したら改善をお願いしたいです。

(数値ではなく印象での指摘で申し訳ないのですが・・・)

[ ]
RE:06900 文字が一瞬だけ2重に表示されまNo.06901
秀まるお さん 12/01/12 15:13
 
 現状でなんとかするとしたらですが…

 画面のハードコピーをもう一回見直したら、ガイドライン(縦)がONになって
いるようで、これのせいで描画が多少重くなってるってのはあると思います。

 あと、正規表現パターンを使った強調表示とかがあると、その表記パターンに
よっては極端に重くなることがあります。

 なめらかスクロールをONにすると、横スクロールも細かい単位でスクロールし
ていく感じになるので、遅くはなりますけど見栄え的にはなめらか感は出ます。
それも一応お勧めかもしれません。

 Windows7での「エアロ」が有効になっていると、結果としてこれによってダブ
ルバッファリング相当の処理がWindowsによってなされるので、ちらつきは減り
ます。(ただ、遅いマシンだともっさり感は出ます)

[ ]
RE:06901 文字が一瞬だけ2重に表示されまNo.06903
foobar さん 12/01/12 18:07
 
エアロにして試したところ2重に描画されることはなくなりました。
アドバイスありがとうございます、助かりました。

ややこしい正規表現を使って強調表示を行っています。
テキストを編集しているなら遅くなるのも分かりますが、単に左右に
スクロールしているだけなので、高速化の余地があるようでしたら
お願いしたいです。

[ ]
RE:06903 文字が一瞬だけ2重に表示されまNo.06904
秀まるお さん 12/01/12 18:32
 
 正規表現パターンを工夫すれば劇的に速くすることが出来るかもしれません。
もしよければどういう正規表現パターンを指定されてるのか教えて欲しいです。

 それと、秀丸では、いろいろ高速化の処理をしてて、例えば強調表示について
は、1行毎に「強調表示にヒットするかどうか」のフラグを持っていて、もしも
強調表示に何もヒットしなければ、その行については強調表示のマッチングを省
略して表示するようになります。なので、正規表現パターンを多用していたとし
ても、強調表示にヒットする行が全体的に少なければ、そんなには遅くならない
です。

 それと、横スクロールだけを考えるなら、例えば画面の中に表示してる文字1
文字毎に色情報を持っておけば高速化出来ると思います。しかし、そのやり方だ
と上下スクロールした時は速くならないです。一般的には上下スクロールで遅い
方が問題だと思うので、1文字単位での色情報保持はやってないです。

[ ]
RE:06904 文字が一瞬だけ2重に表示されまNo.06905
foobar さん 12/01/13 11:20
 
強調表示の正規表現は以下の通りです。
243,(_)?g_[a-zA-Z0-9_]+
241,(?<=:[ \t]*)(TEXCOORD[0-9](?!\c))
241,(?<=:[ \t]*)(TANGENT[0-9]?(?!\c))
241,(?<=:[ \t]*)(POSITION(?!\c))
241,(?<=:[ \t]*)(NORMAL(?!\c))
241,(?<=:[ \t]*)(COLOR[0-9](?!\c))
241,(?<=:[ \t]*)(BLENDWEIGHT(?!\c))
241,(?<=:[ \t]*)(BLENDINDICES(?!\c))
241,(?<=:[ \t]*)(BINORMAL[0-9]?(?!\c))
435,m_[a-zA-Z0-9_]*

以下の定義を強調表示します。
struct MyVertex{
    float4 m_Position       : POSITION;
    float4 m_UV0            : TEXCOORD0;
    float4 m_UV1            : TEXCOORD1;
    float4 m_Color0         : COLOR0;
    float4 m_Color1         : COLOR1;
};
int _g_hoge=0;


(ちなみに、強調表示を(.hilight)へ保存すると1858行になります。)

本件は、メモ帳でも同じような現象になることから、私の気にしすぎなだけのような
気がします。
特に困っているわけでもないのでクローズで構いません。

[ ]
RE:06905 文字が一瞬だけ2重に表示されまNo.06906
アルビレオ さん 12/01/13 15:25
 
ユーザーのアルビレオです。

>強調表示の正規表現は以下の通りです。
>243,(_)?g_[a-zA-Z0-9_]+
>241,(?<=:[ \t]*)(TEXCOORD[0-9](?!\c))
>241,(?<=:[ \t]*)(TANGENT[0-9]?(?!\c))
>241,(?<=:[ \t]*)(POSITION(?!\c))
>241,(?<=:[ \t]*)(NORMAL(?!\c))
>241,(?<=:[ \t]*)(COLOR[0-9](?!\c))
>241,(?<=:[ \t]*)(BLENDWEIGHT(?!\c))
>241,(?<=:[ \t]*)(BLENDINDICES(?!\c))
>241,(?<=:[ \t]*)(BINORMAL[0-9]?(?!\c))
>435,m_[a-zA-Z0-9_]*

管理はちょっとしづらくなるでしょうが、以下のようにまとめてみてはどうでし
ょう?

243,_?g_\c+
241,(?<=:[ \t]*)(TEXCOORD|COLOR)[0-9](?!\c)
241,(?<=:[ \t]*)(TANGENT|BINORMAL)[0-9]?(?!\c)
241,(?<=:[ \t]*)(POSITION|NORMAL|BLENDWEIGHT|BLENDINDICES)(?!\c)
435,m_\c+

[ ]
RE:06906 文字が一瞬だけ2重に表示されまNo.06907
秀まるお さん 12/01/13 16:10
 
 遅いのは、

    (?<=:[ \t]*)

 が大量に(1800行以上?)あるせいなので、これは、アルビレオさんの話
にある通り、

    (?<=:[ \t]*)(POSITION|NORMAL|BLENDWEIGHT|BLENDINDICES....

 のようにまとめれば、圧倒的に速くなると思います。

 それがお勧めです。

[ ]