ちょっと気になったのでこちらも色々やってみました。
で気付いたのですがソース内におかしな点がありました。
*main
gsel 1 //バッファに書き込む
redraw 0
color 255,255,255 : boxf //テスト用背景
//ここから画像等描画とメイン処理
color 0,0,0 : pos 0,0 : mes "現在サイズ:"+winx2+","+winy2+""
gmode : pos 32,32 : celput 2
gmode : pos 32,32 : celput 3
//メイン処理ここまで、実際は500枚ほど予め読み込み
gosub *screendraw
await 16
goto *main
*screendraw //メインスクリーンにバッファを拡大表示
gsel 0
pos 0,0
gmode : celput 1,,winsize,winsize
redraw 1
return
これredraw 0の位置が違います。
gsel 1 1はバッファなので描画停止しても意味がなく、
gsel 0 の後でredraw 1で描画開始……
つまり0(メインウィンドウ)は常に描画状態。
メモリ上のウィンドウ1(バッファ)は常にメモリ上に描画。
どちらもredrawが実質無意味なことになっています。
gsel 1 //バッファに書き込む
;redraw 0 // こちらは消去
//************中略****************
gsel 0
redraw 0
このようにした方がチラつきなんかも無くなり、高速になるはずです。
実際これで計測してみたら倍程度高速になりました。
更に、使いどころが限られるマシン語を利用したモジュールを使って
拡大コピーしてみたらgzoomよりも早いという結果も出ましたので
モジュールを乗せておきます。
#uselib "kernel32.dll"
#func global VirtualProtect "VirtualProtect" var,int,int,var
#define global xdim(%1,%2) dim %1,%2:VirtualProtect@ %1, %2*4,$40,AZSD
#module
// 縦横比固定 等倍コピー
// src 描画元
// bai 倍率
#deffunc zoomcopy int src, int bai
dist = ginfo_sel;
// 描画先情報取得
mref dvram, 66;
dvramp = varptr(dvram);
dx = ginfo_winx;
dy = ginfo_winy;
// 描画元情報取得
gsel src;
mref svram, 66;
svramp = varptr(svram);
sx = ginfo_winx;
sy = ginfo_winy;
gsel dist;
dim size, 7;
size(0) = dx, dy, sx, sy, bai, dvramp, svramp;
if( (sx*bai != dx) || (sy*bai != dy) ) {
return -1; // サイズが合わない
}
xdim fncode, 60
fncode( 0) = $83ec8b55, $458b1cec, $8b534008, $8d56105d, $e6834034, $01438dfc;
fncode( 6) = $8df47589, $e0834004, $f04589fc, $8514458b, $bb8e0fc0, $8b000000;
fncode(12) = $3357f055, $89c933ff, $4d89e87d, $001f0fec, $8e0fdb85, $0000008b;
fncode(18) = $3320558b, $087589f6, $8df85d89, $c8030142, $4d89d02b, $89c38bfc;
fncode(24) = $7d83e455, $148a0018, $8a198a0a, $3d7e0171, $8d184d8b, $758b3704;
fncode(30) = $0ff98b1c, $c683c1af, $8bf00302, $fe5088c6, $8803408d, $7088fc58;
fncode(36) = $01e983fd, $7503ef75, $184d8bf4, $7501ef83, $fc4d8be2, $8b08758b;
fncode(42) = $7d8bf845, $e4558be8, $8303c683, $758903c1, $01e88308, $89fc4d89;
fncode(48) = $9e75f845, $8bf4758b, $458bec4d, $105d8b14, $03f0558b, $83fe03ca;
fncode(54) = $4d8901e8, $e87d89ec, $0f144589, $ffff5785, $5b5e5fff, $c35de58b;
p = callfunc(size, varptr(fncode), 7);
return 0;
#global
winx = 256 : winy = 192 //解像度設定
winsize = 3 ://オプションで設定する画面サイズ用変数
winx2 = winx*winsize
winy2 = winy*winsize
screen 0,winx2,winy2 //メインスクリーン作成
buffer 1,winx,winy //デフォルトサイズのバッファ作成
//本来はここからcelloadによる画像読み込み
buffer 2 ,64,64
color 0,255,0 : boxf
buffer 3 ,32,32
color 0,0,255 : boxf
//画像読み込みここまで
font "MS ゴシック",12
*main
loopcount++;
gsel 1 //バッファに書き込む
color 255,255,255 : boxf //テスト用背景
//ここから画像等描画とメイン処理
color 0,0,0 : pos 0,0 : mes "現在サイズ:"+winx2+","+winy2+""
gmode : pos 32,32 : celput 2
gmode : pos 32,32 : celput 3
//メイン処理ここまで、実際は500枚ほど予め読み込み
gosub *screendraw
await 16
goto *main
*screendraw //メインスクリーンにバッファを拡大表示
gsel 0
redraw 0
pos 0,0
;gmode : celput 1,,winsize,winsize
;gmode : gzoom winx2, winy2, 1,,,winx, winy
zoomcopy 1, winsize;
redraw 1
return
zoomcopy p01, p02;
p01 描画元ID
p02 拡大率(1以上の整数)
gselで指定したウィンドウにp01のウィンドウの画像をp02倍してコピーします。
posなどの描画位置は無視、ウィンドウサイズが倍率に合わないとエラーとなります。
ほかでは非常に使いにくい物ですがこの場合に限っては少しは使えるかもしれません。