過去の独りごち/独りごとはこちら
過去のJavaアプレットは
こちら

 

8/20 猫手仏心

 Rayleigh/Mie 散乱の図も描かないうちに、他のテーマに手を出してみる… だってドローツールのシリアルナンバーを九州に置いてきてしまったんだもん(哀)

 さて、猫の手スクロールってご存知でしょうか?

 こんなのです。


catwalk.zip
(ソース+バイナリ 238KB)

 左ドラッグでずるずるとテキストファイルを読めます。HTMLじゃなくてプレーンテキストなのがローテクですが、何事も初心忘るべからずなのです。 あと、カーソルの上下でフォントサイズの変更と、Aキーでアンチエイリアシングのon/offが切り替えられます。

 というより、ウィンドウをリサイズする事をあんまり考えていないので、リサイズすると画面にヘンなゴミが載るかもしれません。トホホ

 で、何がしたいかというと、Quadruple D Version 3.01 から付いた、フォントキャッシュの性能自慢というか性能自虐というかそんなところです。今までの方法では、

  1. 文字列を書き込むTBitmapをバッファとして確保
  2. TCanvasでTBitmapに文字を書かせる
  3. テクスチャをロックして転送
  4. 青チャンネルの輝度をαチャンネルにコピー
  5. αチャンネルを保持しつつ、白で塗りつぶす

 というそりゃ遅くて当然だよと突っ込まれるの必至な方法だったんですが、これからは全く違い

  1. フォントキャッシュにある文字が要求された場合
    フォントキャッシュから転送先テクスチャのフォーマットに合わせたラスタイメージを取り出す
  2. フォントキャッシュに要求された文字が無かった場合
    GetGlyphOutline Win32APIによって、ラスタイメージをシステムメモリ上に構築
  3. テクスチャをロックして、ラスタイメージを転送

 特にキャッシュヒット時のラスタイメージの転送ルーチンは、一応程度ですが高速化を施してあり、テクスチャをロックする必要こそあるものの(仕方ないんです)俊敏な動作をしてくれます。また、キャッシュに用いているハッシュ表も思ったより良好に働き、日本語の文章を1.5MBほど流し込んでみたところ、全てキャッシュに格納されました。

 フォントのサイズなどを変えれば別のラスタイメージを用意しなければならないので、キャッシュの効率は落ちる事になりますが、それにしても満足のいく結果が得られたと自分では思っています。

 しかし、この手のスムーススクロールで文章が読めるプログラムってFM-TOWNS(以前の)時代からあったし、当時から超高速に動作してたんですよね。なんでWindowsにすると…と愚痴っぽくなってしまうのですが、異なるテクスチャフォーマットへの変換とか、そういうTOWNSならやらなくてよいような事で足を引っ張られてしまうんですね。

 TOWNSではフォントデータをアセンブラで16色(テキストビューワの多くは16色で動作してましたので)に展開しながら、VRAMに転送すればよいのに対して、Direct3Dでやるには、先に述べたようなテクスチャフォーマットの変換があったり、バックバッファのハードウェアスクロールなんて無いのでテクスチャに書き込むという婉曲的な方法に頼らざるを得ません。さらに、今回のプログラムでは背景は真っ黒なのにわざわざαブレンディングで転送しています…。

 いや、ライブラリのテストですから、ハイ。

 ところで、DirectX9からこっそりと、サーフェスのGetDCが復活してるんですね。ただ、α付きのピクセルフォーマットを持ったサーフェスには適用できないので、使ってません。

Taku Hayase(SANDMAN)

戻る