HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0215
ひつじhgdraw の使い方(hgimg3)3解決


ひつじ

リンク

2016/2/15(Mon) 01:58:08|NO.74615

hgdraw 2 や hgdraw 4 では、内部でどのような処理が行われているのでしょうか?
また、その意義は何なのでしょうか?
event_系 や モーション、dir などの処理は行われているのでしょうか?

………
現在hgimg3でゲームを作っており、
fps60で作成したものをfps30でも遊べるようにしたいと考えています。
そこで2フレームに一回、hgdraw と hgsync を呼び出すようにしてみたのですが、
これだとevent_系 や モーション、dirの処理も2フレームに一回になってしまいます。

そこで、画面描写はせずにevent_系 や モーション、dirの処理だけが行われるように
hgdraw p1 の p1 の値を色々いじってみたのですが、いまいちうまくいきません…
アドバイス等いただけると嬉しいです。



この記事に返信する


暇人

リンク

2016/2/15(Mon) 21:34:55|NO.74621

>また、その意義は何なのでしょうか?
画面分割表示用だと思う
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にしてる



暇人

リンク

2016/2/16(Tue) 19:14:01|NO.74630

あ、ファイルのディレクトリ指定してなかった・・・
最初のほうに

chdir dir_exe+"\\sample\\hgimg3"
を追加

後パーティクルサンプル2ってコメントあるのはサンプルを編集して削除し忘れ・・・



ひつじ

リンク

2016/2/17(Wed) 03:13:11|NO.74641

>event系や自動移動等をとめる事は出来ても描画無しで動かすことは出来ない
やっぱりそうなんですね。むむ…

ただ、非表示にしてhgdrawすれば、モーションやevent_系の処理が
行われるというのは盲点でした。
これならば動作や衝突判定などを大きく修正することなく処理を軽くできますね。

載せていただいたサンプルを参考にゲームをいじってみます!
アドバイスありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.