トップページへ戻る
Diary

RSS配信してます
 

HPがInfoseekにあったころの日記は、現在データベース化待機中となっています。
  DB化完了:2006年度分 ・ 2002年度分 ・ 2003年度分1~5月
インデックスより、年・月を指定すると、その月のタイトルが表示されます。
見たい日記のタイトルをクリックすることで、日記を閲覧することができます。
タイトルにつく【】の意味

インデックス
2002年2003年2004年2005年2006年2007年
2008年2009年2010年2011年2012年2013年
2014年
1月2月3月4月5月6月
7月8月9月10月11月12月

2006年 11月の日記タイトル
No. 703 [30日] ・マンデルブロー様万歳 【日・機】(0)
No. 702 [27日] ・プロジェクトラストダッシュ 【日】(0)
No. 701 [23日] ・XGL開発記『古代の遺産発掘』 【趣】(0)
No. 700 [18日] ・Social Gene 【日・心】(0)
No. 699 [ 9日] ・DaysDecrement 【日】(0)
No. 698 [ 5日] ・Aeroカミング 【機】(0)

2006年 10月の日記タイトル
No. 697 [30日] ・即効LifeHack~カバンに傘を固定する~ 【日】(2)
No. 696 [21日] ・SPIいぐざみん/らぞーな探検隊 【日】(2)
No. 695 [15日] ・Minehack 【日・機】(0)
No. 694 [10日] ・セルフバインド:リストレイント 【日・心】(0)
No. 693 [ 8日] ・動けフラクタル 【趣】(0)
No. 692 [ 7日]VB6の未来に賭けて 【趣】(0)
No. 691 [ 7日] ・長バトン 【繋】(0)
No. 690 [ 4日] ・10月開始 【日・心・考】(0)

2006/10/07 (Sat) No.  692
VB6の未来に賭けて 【趣】

やっとひと段落着いたので、久々にVBプログラミングでも。

昨日の章

最近やりたかったのは、ピクセル単位での描画(ピクセル=ドットでだいたい間違ってないです)。例えば、フラクタル画像とか『点』で描画する際に有効となる方法。 今までは、『1ピクセルの点のテクスチャを作成し、それを画面に敷き詰める』という手法をとっていたのだけど。これだと例えば400x400の画面では160000回も描画関数を呼ばないといけない。もちろんこれは高コスト。 さらに、毎回テクスチャを再描画しないといけないので、無駄に重いものとなってしまう。これでは『フラクタル画像を作って、そのあと』ができない。作るので精一杯だからである。

そこで、DirectX8のほかの機能でどうにかできないものかと調べてみる。するとほどなくして、ColorFill()という関数を発見。これはとある領域をとある色で塗りつぶせるものらしい。
これはテクスチャを直接いじるものなので、(多分)上記のテクスチャを大量に書くよりは早いはずである。

…が、しかし。どう検索してもColorFill()が出てこない。と、それもそのはず。この関数はDirectX9で新規に導入されたもののよう。X8で使えるわけが無い。
よし、じゃあこの機会にX9に乗り換えようか!とも思ったけど、残念ながらVB6がサポートしているのはX8まで…。.NETだとX9が使えるようです。が、.NETを使う気にはならない。

というわけで。残念。と、今回のプロジェクトが終わろうとしていたその時!

別のページで、『テクスチャが入っているメモリ(ここには各ピクセルの色情報が入っている)にアクセスして、それを書き換える』という技を発見。なるほど。
早速この方法を試してみる。テクスチャをロックして、テクスチャ情報が格納されている先頭のポインタを取得して、そのポインタにD3DColorValueを記入…。え、ポインタ?

そう、ポインタ。C系の言語にはあって、いろんな用途に使える概念。ポインタはメモリ上の住所であり、例えば『メモリ12345番地からテクスチャのデータが始まりますよー』っていうのさえ知ることができれば、10番目のピクセルのデータは12354番地にあるねっていうのが分かるわけ。
いろいろ難しいので、VBでは意識しなくていいように作られている。ちなみにVB上では、【変数⇒ポインタ』はできるんだけど、【ポインタ⇒変数】ができない。

いままでメモリをどうこういじることも無かったから、確かにポインタはいらないねぇ、VB万歳と思ってた。だけど、『ビデオメモリ(だと思う)』をいじると言う方法があったのは盲点。
今回は上記にも書いたとおりVBの仕様なのでどうしようもない。

よって、敗北。惨敗。


今日の章

リベンジをかけてみる。なぜならば、違う方法を思いついたから。

それは以下のような方法。
①ポインタはC++なら使うことが可能である。
②C++はDLLというファイルを作成することができる。
③DLLはVBで読み込むことが可能。

つまり、C++でポインタを弄くる関数を定義し、それをVB6から使おうという技。VBから見れば、ただのDLLの呼び出しなので、ポインタとか関係なく実行可能である。
あんまり好きじゃないんだけど、VS2005を立ち上げVC++を起動。DLL作成にしていざ開始!
インターネットで調べたところ、エクスポートしないと他の言語から参照できない模様。 また、普通に定義すると、関数名がfunc@XYYZZみたいに予測しにくいものになってしまうようなので、extern "C"というものを入れる。こうすると、func@8というように数字になるため、VBからも簡単に参照できるようになる。
このextern "C"は仕組みがよく分からなかったので、例の『おまじない』と言う事で理解しておいた。 あとは昨年のポインタの講義を思い出しながらC++でポインタいじくり関数を実装。『ポインタ番地』と『値』を放り込むと、該当番地に値を記入してくれるというもの。これにより『ポインタ⇒変数』がVB上でも使えるようになるはず!

DLLが完成したら、早速VB6で読み込んでみる。
そして、いざ戦闘開始!

テクスチャをロックして、テクスチャ情報が格納されている先頭のポインタを取得して…。このポインタとRGB(255,0,0)を例のDLLのほうに飛ばす。
すると、DLLがピクセルの情報を書き換えてくれる。これを広範囲で行えば…。

ピクセルへアクセス成功。VBの限界を打ち破った瞬間でもあります。

さらに1ピクセルずつちまちまやらないで、配列を送り込んでみる。C言語上では配列もポインタなので一気に処理が可能。

FPSは3…。だがまだ改良の余地はあるし何とかなるだろう。


まだまだ.NETやCに移らなくても大丈夫なようです。VB6愛してる。


★この日記のURLはhttp://haukun.sakura.ne.jp/?diarymode=200610070692

◆◇◆◇本日は複数の日記を書いています。◇◆◇◆

No. 691 [ 7日]長バトン 【繋】(0)

この日記へのコメント
コメント無し

名前(10文字)削除pass(8文字)
コメント(512文字)
送信オプション
コメントを送信する※誤爆防止用
コメントを削除する※名前に番号を,削除Passに投稿時のPassを入れてください。
《全体処理時間》0.138sec.
インデックスに飛ぶ
日記の先頭に飛ぶ
トップページへ戻る

HKP-DiarySystem Ver.1.07