テクスチャ君、君は・・・

どうやらTexture.FromBitmapメソッドはえらい遅いぽい。
TextureLoader.FromFileするのに比べてBitmap.FromFile後Texture.FromBitmapは10倍くらい遅い´〜`
うーん、このままだと”GDI+で作業してそれをテクスチャに”って作戦破綻しそう。
なにしろ4FPSとかしかでませんからの!
いい手はないものかなあ。

画像としてテキストを描画する

簡単度でいうとGDI+>Direct3D>=DirectDrawかしらん。
でも、ウェブでの例題の見つけやすさだとD3Dは難ありですな〜。
Fontクラスだけで書けるのに、テクスチャいじる話とかポリゴンがどうこうとかそういうのに混じってて話が難しくなってる´〜`
DDrawはDDrawで使わないのが推奨されてるからインテリセンスが使うなって言い出して不便だし!
DSoundの時も思ったけど、DirectXがらみって使える人と使えない人の差が大きいのかしらん。
サンプルコードが載りまくってる入門サイトってあんまないし、興味もってる人口少ないのかな´〜`

画像としてのフォントの扱い

フォントの間隔(縦横)が描画方法によって変わるのは困った事ですなあ。
1.ウィンドウズフォームのラベルやテキストボックス
2.GDI+
3.DirectXのDirectDrawやDirect3D
これでずれまくるのが困りもん´〜`
なにしろ、MSゴシック10ptsボールドで高さが16.666..., 17, -16とか
各種メソッド、プロパティで帰ってくる値が統一されてないのがなんとも。
型でずれるのはまだわかるけど、-16とかなんやねん!
あ〜あれですか? (int)(1.9 / 0.1) = 18とかなるのと根っこは同じですか´〜`?

Streamまわり

StreamWriterとかでベースストリームの更新のタイミングが問題になる例なぞ。
ま、らっぱ〜被せたらずっとそれを使えって話なんでしょうねえ。
ただ、byteとstringが混在する時は統一すると型変換で遅くなりそなのがどうも´〜`


private static void DumpFat12StyleDataOneLineFromStreamToStream(StreamWriter myStreamWriter, BinaryWriter myBinaryWriter, Stream myStream, int linePosition)
{
byte[] myBufferOfLine = new byte[BytesPerLineOfOriginalData];
myStream.Position = BytesPerLineOfOriginalData * linePosition;

//先頭にアドレス表示
myStreamWriter.Write(myStream.Position.ToString("X8"));
//フラッシュしないとベースストリームに反映される前に
//次の書き込みがベースストリームに書かれてしまう
myStreamWriter.Flush();
myStream.Read(myBufferOfLine, 0, BytesPerLineOfOriginalData);
for (int i = 0; i < DataPerLine; i++)
{
myBinaryWriter.Write(GetDumpedFat12(myBufferOfLine[3 * i + 0], myBufferOfLine[3 * i + 1], myBufferOfLine[3 * i + 2]));
//myStreamWriter.BaseStream.Write(GetDumpedFat12(myBufferOfLine[3 * i + 0], myBufferOfLine[3 * i + 1], myBufferOfLine[3 * i + 2]), 0, BytesOfDumpedTwoFat12);
}
myStreamWriter.Flush();
}

こんなとこでいいかな〜^〜^

Notify()&GetCurrentPosition()両方方式(id:parlin:20051216)でライブラリかきかき完了。多重再生もおっけだし、これで〆かな^〜^
以下ソースコードなり。

続きを読む

うーむNotify()&GetCurrentPosition()両方?

ここ(http://66.102.7.104/search?q=cache:1F737Qt61GgJ:www1.odn.ne.jp/ceb94660/memo/index.html+directsound+getcurrentposition&hl=ja&lr=lang_ja)に出てるようにNotify()&GetCurrentPosition()両方使うとウマウマなのかもしれず。ついでに無音も挿入したらええのかねえ。

GetCurrentPosition()!

動的ストリーム再生って色々大変ですの〜´〜`固定サイズバッファってのが曲者で

  1. 固定サイズバッファを使用するときはwavファイルから自分でwaveformatを取得しなくちゃいけない
  2. ループ再生になるから終了位置の確認が大変
  3. Notify()メソッドは自分がセットしたイベント以外にも反応する(ありえん!)
  4. GetCurrentPosition()メソッドは分解能がイマイチ>10ms前後分のとびとびの値が帰ってくる
  5. 多重再生するとポーリングが追いつかない事も´〜`>1msで監視しても駄目なケースがある

ここ(http://mowamowa.p.utmc.or.jp/~amedama/cgi-bin/wiki/wiki.cgi)でみつけたame_wlのソース(http://mowamowa.p.utmc.or.jp/~amedama/data/mowa_player/ame_wl_dev1.lzh)をぱくってポーリング版再生ライブラリつくた〜
メモがわりにSecondaryBufferを監視してバッファの更新する部分をはっとこう^〜^

以下ソースコードなり。

続きを読む