Dripです。
理沙さん、こんにちは。
> > 究極なのは、VRAMに直接配列参照を行いビット演算を行うことです。
> > これならば恐ろしい程の処理の高速化が期待できます。
> とあるのを見て、どういう方法なのか知りたくなりましたΣ( ̄△ ̄;
についてですが、元スレッドにも書きましたように、やりたいことに対応したケースバイケースの
スクリプトを組上げる必要があります。「この命令や演算子を使えば高速になりますよ。」というものでは
ないことを念頭に置いておいてください。
例えば「色の反転」を例にとって説明してみましょう。pget,psetを使用して全ピクセルの色を
判定して処理していたら途方もない時間がかかるのは、pget,pset命令が情報を人間にとって
処理し易い形にデータを加工する作業がはさまれているからです。
VRAMとpeek,pokeを使用したとしても、やはり10進数のデータとして1バイトずつ処理している上に
1バイトずつ関数をはさんで処理しているため、pget,psetよりは早くとも鈍足です。
ビット演算は、コンピュータにとって最も処理し易い演算で、データは2進数として考えます。
ビット演算についてはgoogleで「ビット演算」などと検索すれば、参考になるページが見つかると
思います。
論より証拠。色の反転処理の処理速度比較プログラムを以下に示します。
pget,psetによる色の反転、VRAM+peek,pokeによる色の反転、VRAM+ビット演算による色の反転
を実際に処理させ、処理速度を比較してみます。凄まじい処理速度の差が体感できることと思います。
mref vram,66
pat="pget,psetによる反転","VRAM+peek,pokeによる反転","VRAM+ビット演算による反転"
dialog "pget,psetを用いて色の反転を行います。"
redraw 0
time=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7)
repeat ginfo_winx:x=cnt
repeat ginfo_winy
pget x,cnt
color 255-ginfo_r,255-ginfo_g,b=255-ginfo_b
pset x,cnt
loop
loop
res(0)=(gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7))-time
redraw 1
dialog ""+res(0)+"mSecかかりました。"
dialog "VRAM,peek,pokeを用いて色の反転を行います。"
redraw 0
time=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7)
repeat ginfo_winx*ginfo_winy*3
poke vram,cnt,255-peek(vram,cnt)
loop
res(1)=(gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7))-time
redraw 1
dialog ""+res(1)+"mSecかかりました。"
dialog "VRAM,ビット演算を用いて色の反転を行います。"
redraw 0
time=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7)
repeat ginfo_winx*ginfo_winy-(ginfo_winx*ginfo_winy)/4
vram(cnt)^=-1
loop
res(2)=(gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7))-time
redraw 1
dialog ""+res(2)+"mSecかかりました。"
cls
pos 10,10:mes "処理速度比較\n\n"
repeat 3
pos 20,cnt*30+50:mes pat(cnt)
pos 0,-20:mes ""+res(cnt)+" mSec.":pos 340-ginfo_mesx,cnt*30+50:mes ""+res(cnt)+" mSec."
pos 0,-20:pos 400,cnt*30+50:mes ""+double(res(0))/res(cnt)+"倍高速化しました。"
loop
いかがでしょうか。かなりの処理速度の差を実感できたと思います。
しかし、これを見てわかるように、ビット演算で処理速度が向上する状況は、かなり制約を受けます。
どんな処理でもビット演算に置き換えることで高速になるとは限りません。
VRAMを使わないほうが高速になることも十分ありえることを覚えておいてください。
尚、今回の色の反転については、
buffer 3:gsel 0:time=gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7):redraw 0
gmode 6,ginfo_winx,ginfo_winy,256:gcopy 3:redraw 1
dialog ""+((gettime(4)*3600000+gettime(5)*60000+gettime(6)*1000+gettime(7))-time)+"mSecかかりました。"
が最も高速なので、単純な色の反転のためにVRAMを使用する意味は全くありません。