【HSP】VRAMに直接書き込むモジュール【遅い…orz】

【HSP】VRAMに直接書き込むモジュール【遅い…orz】

ユウキさんのブログに、昔の記事で、VRAMに直接書き込むというのがあったんで、私もやってみたんですけど、pset/pgetの2倍以上の時間がかかってしまいました…orz
どういうことなんでしょうか?環境によって変わっちゃうのか、それとも私のやり方がまずかったのか…orz

// モジュール
#module "kerupanium_draw"
#deffunc k_d_init
mref VRAM,66
dim RGBr
WinX=ginfo(26)
WinY=ginfo(27)
return
#define global ctype index(%1=0,%2=0) (limit(%1,0,WinX-1)+(WinY-1-limit(%2,0,WinY-1))*WinX)*3
#deffunc k_d_pget int _p1,int _p2
memcpy RGBr,VRAM,3,0,index(_p1,_p2)
color (RGBr>>16)&0xFF,(RGBr>>8)&0xFF,RGBr&0xFF
return
#deffunc k_d_pset int _p1,int _p2
RGBr=(ginfo_r<<16)|(ginfo_g<<8)|ginfo_b
memcpy VRAM,RGBr,3,index(_p1,_p2),0
return
#global
k_d_init

// サンプル
color 48,32,16 : boxf 0,0,639,159
color 96,80,64 : boxf 0,160,639,319
color 144,128,112 : boxf 0,320,639,479
onclick *click
*click
/* ; これで取得/設定サンプル切り替え
// ■GET (取得) サンプル
// マウスでクリックした点の色を取得し、
// タイトルバーに表示します。
k_d_pget mousex,mousey ; 639,0
title ""+ginfo_r+","+ginfo_g+","+ginfo_b
/*/
// ■SET (設定) サンプル
// マウスでクリックするたぶに、
// ランダムな色で塗りつぶします。(点の表示しまくり)
a=gettime(6)*1000+gettime(7) // 確かめ用
redraw 0
color rnd(256),rnd(256),rnd(256)
repeat 640
x=cnt
repeat 480
y=cnt
k_d_pset x,y
loop
loop
redraw
b=gettime(6)*1000+gettime(7)-a // 確かめ用
title ""+b // 確かめ用
/**/

まあ他の処理とかも一緒に挟んでるんで、完璧に何倍の時間かとかは出してないですけど、だいたい2倍ぐらいです…orz
ユウキさんのは2分の1になったって書いてあるけどな~。
まあとりあえず、ユウキさんのスクリプトにあったバグで解決したところ書きます。

・一番右端が塗りつぶせなかったバグ修正
バグというか、ユウキさんはlpokeを使って書き込んでいたので、最後の1ピクセル分のデータを書き込もうとするとエラーが出る状態になっていました。
・色が指定と違うものになるバグ修正
ユウキさん…色のデータは3バイトなのに、4バイトそのまま書き込んだらバグるに決まってるじゃないですか…。
(ユウキさんは3つのやり方で試していたみたいですが、そのうち2つは、元の背景色が白でない限りバグるものでした。おそらく、ユウキさんはずっと背景白で試していたんでしょうね。でも、黒や茶色にしたら一発でダメになりましたよ。)
・あとは特に意識してません

いちおう、こんなに遅くなるなんて信じられなかったので、ユウキさんが実行速度を図るのに使っていたプログラムを改変して使わせていただきました。すると、以下のような結果が出ました。

各命令の実行時間 (ms/1,000,000回)
PixelGetR,G,B     754      (by ユウキ)
PixelSetR,G,B     1962      (by ユウキ) 
PixelGet          781       (by ユウキ) 
PixelSet          1674       (by ユウキ) 
k_d_pget          1559      (by kerupani129)
k_d_pset          1562       (by kerupani129) 
pget              1886      (by HSP)
pset              15245      (by HSP)

あれ~これだと確かにpset/pgetより速いな~。
もうわけがわからん…。
とりあえず、自分のとユウキさんのを比べてみると、
・GETはユウキさんの2倍くらい遅い
・SETはユウキさんよりちょい速い
ですね。
でも、実際にぬりつぶし処理やってみるとpset/pgetのほうがはるかに早い…。どういうことなんだ…。
だれか…わかる人いたら教えてくれたら助かります…。
ではまた…。
↓それでもクリックしてほしいケルパニであった。


「【HSP】VRAMに直接書き込むモジュール【遅い…orz】」への4件のフィードバック

  1. 専門用語ヤメテー←
    初心者をいじめないでー←
    そもそもVRなんちゃらが何か分からないレベル←

  2. 私も詳しくは知りませんけど…。
    パソコンの画面上のデータを入れておくメモリのことです。簡単に言えば。(VはVideoのV、RAMはメモリのこと)
    DirectXとかは、直接VRAMに書き込んだり、その他いろいろ?な機能のおかげで、すごいゲームが簡単に作れる…ようになってるんですよ、あれでも。

  3. まあ、若干DirectXは触ったりしてるけどね・・・
    なんせ時間がないから・・・
    後、アルファベット恐怖症だから頭が痛くなるw

  4. DirectXやってるんですか!
    私なんか数時間であきらめたのに…orz

コメントは受け付けていません。