>また、その意義は何なのでしょうか?
画面分割表示用だと思う
event系や自動移動等をとめる事は出来ても描画無しで動かすことは出来ない
なのでフレームスキップのことは考慮されて無いんだろう
hspdxfixにはes_moveがあるのでhgimg3にも実装してくれると楽なんですが・・・
ちょっと無理やりだけど・・・(一応4割ぐらい軽減できる感じ)
hgdrawの前に非表示にして
画面初期化無しでhgdrawして
非表示にしたのを戻す
#include "hgimg3.as"
; パーティクルサンプル2
; (パーティクル生成をイベントで行なう)
randomize
screen 0,640,480,0
cls 4
hgsetreq SYSREQ_MAXOBJ ,10000
hgini
setborder 80,80,80
setfont 16,16,12,1 ; font Tex select(cx,cy,px,mode)
texload "fontchr.bmp" ; フォントテクスチャの登録
setuv 0,0,64,64
addplate m_plate,1,3,3
texload "efx.bmp"
newevent ev ; 新しいイベントIDを取得
event_setefx ev, $88,0,0,$44,0,0 ; 色加算モードに設定
event_setang ev ,0,M_PI,0,0,-M_PI,0 ; 色加算モードに設定
event_efx ev, 100, $ff, 0, 0,0
event_addang ev, 0, 0.1, 0
event_wait ev,100
event_efx ev, 100, $44, 0, 0,0
event_addang ev, 0, -0.1, 0
event_wait ev,100
event_jump ev,2
clscolor $80 ; 背景色の設定
setpos HGOBJ_CAMERA, 0,-5,30 ; カメラ位置の設定
addxfile m_xmodel,"font_a.x" ; モデルを読み込む
repeat 3000
regobj xobj, m_xmodel,OBJ_MOVE |OBJ_FLIP | OBJ_BORDER ; オブジェクトの登録
setcoli xobj,32768 //設定しないとfindobjで検索できない
setdir xobj,0.005*rnd(100),0.005*rnd(100),0.005*rnd(100)
setevent xobj, ev
loop
dim drawtime,2
sf=1 //フレームスキップするかのフラグ(1=フレームスキック)
chkbox "Skip",sf
setpos 0,0,0,100
*main
frame++
stick key,$3ff
if key&128 : goto *owari
hggettime timA
gosub *alldraw ////フレームスキップ処理
timB_bak=timB
hggettime timB
drawtime_total+=timB-timA
drawtime(frame\2)=timB-timA
if (timB/1000) ! (timB_bak/1000) {
fps=drawcnt
drawcnt=0
dtt=1.0*drawtime_total
drawtime_total=0
title "平均タイム="+(dtt/(frame-frame_bak))
frame_bak=frame
}
if draw_f {//画面の初期化した時だけ直接描画をする
fprt "drawon fps:"+fps+" drawtime:"+drawtime,100,4
if sf {
fprt "drawoff fps:"+fps+" drawtime:"+drawtime(1)+ " id_max:"+id_max,100,20
}
}
hgsync 15
goto *main
*alldraw
if (frame\2) and sf {//frameが偶数の時は描画スキップ
findobj OBJ_HIDE,$ffffffff //現在表示設定でコリジョングループが設定される物を検索
id_max=0
repeat
nextobj id(cnt)
if id(cnt)<0 {id_max=cnt:break}
setobjmode id(cnt),OBJ_HIDE,0 //非表示設定
loop
hgdraw 4 //画面初期化なし
if id_max {
repeat id_max
setobjmode id(cnt),OBJ_HIDE,1 //非表示設定削除
loop
}
draw_f=0 //画面初期化しなかったのでフラグリセット
}else{
drawcnt++ //描画した回数をカウント
hgdraw
draw_f=1 //画面初期化したフラグセット
}
return
*owari
end
hgsyncにバグがあるみたいで、ある程度以上hgdrawで時間を使うと
指定したウェイト時間から引かれなくてFPSが落ち込む(hgsyncに設定してる数値でも動作が変わる)
自分の環境ではhgsync 15が安定してるので15にしてる