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


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
0529
ひろSTGを作ろうとしているんですが、17未解決


ひろ

リンク

2011/5/29(Sun) 23:50:48|NO.39432

HSPでSTGを一回作ってみたんですけど、とりあえず僕のスクリプトでは処理が多すぎて
動作がめっちゃ遅かったんで、
処理ごとにEXEファイルを分けて処理をさせたら早くなるでしょうか?

ちなみにEXEファイル同士の通信にはAPIを使おうと思ってるんですが、
こうした方法をとると動作がはやくなるでしょうか?



この記事に返信する


check

リンク

2011/5/29(Sun) 23:55:51|NO.39433

いくつかのプロセス(exeファイル)に分けるのはどう考えても非効率。
まずは自分のスクリプトを見直して見なさい。



ひろ

リンク

2011/5/30(Mon) 00:05:48|NO.39434

詳細をいいますと
敵をたくさん出したら(30くらい?)敵の弾を1つにしても
動作が遅くなってしまいます。
それで一回DirectXをつかった?ていうか使い方がよくわからないので、
適当につかったらちょっとは早くなった?んですけど、やっぱりDirectXで全部処理を
書くものなんでしょうか?
もしよかったらご教授おねがいします。



晩御飯

リンク

2011/5/30(Mon) 00:24:48|NO.39435

メインループ内で毎度画像を読み込んでるんじゃないかとか
当たり判定のところでわけの分からないことしてるんじゃないかとか
実行ファイルを分けたりDirectXを使うことよりも気にすべきことはいっぱいありますね。

いまどきのパソコンなら標準命令だけで2DSTGを組んでもそこまで遅くならない(と思う)ので
もう一度処理を見直してみて下さい。
その上で速度が気になるというのならDirectXに手を出すのもいいでしょうね。



ORZ

リンク

2011/5/30(Mon) 00:46:57|NO.39436

作った料理がまずいのは、愛情が足りないとか、食材が良くないだとか、湿気が多すぎるとか
調理器具がダメダメだとかそういうんじゃない。

つまり、自分のソースコードを見直し、完ぺきになってから新しいお鍋を買いなさいと。



ミント

リンク

2011/5/30(Mon) 08:00:44|NO.39443

どこかのループとかで何回も呼んでいるか、それともPCスペックの問題のどちらか?
それとも「await」の数値がおかしいとか?


#include "d3m.hsp" ;fpsを使用するために必要。 *メイン redraw 1 await 15 redraw 0 color : boxf color 255, 255, 255 : pos 0,0 : mes "" + d3getfps() + " fps" goto *メイン
FPSを見れるソースです。
もしPCのスペックに自信がないなら「Ctrl」+「Alt」+「Delete」同時押しで
タスクマネージャ開いて「パフォーマンス」の「CPU使用率」を見ればいいと思うよ。

昔私が出した糞ースを少し修正したもの つ

#define PI 3.14159265358979 #include "d3m.hsp" ;d3getfpsを使用するために必要。 screen 0,380,450 frame = 0 ;フレーム buffer 2 //picload "素材7.bmp" gsel 0 ;スタート位置指定 x = 200.0 : y = 420.0 ;弾幕情報初期化 maxbullet = 640 dim b ,maxbullet dimtype b_x,vartype("double"),maxbullet ;x座標 dimtype b_y,vartype("double"),maxbullet ;y座標 dimtype b_vx,vartype("double"),maxbullet ;x速度 dimtype b_vy,vartype("double"),maxbullet ;y速度 ;**********メインループ*********************** *メイン color 0,0,0 : boxf ;****************カウンター******************** color 255,0,0 pos 0,0 : mes "FPS " + d3getfps() ;****************霊夢の移動******************* stick key,15 if (key & 1) : x = x - 0.8 ;← if (key & 2) : y = y - 0.8 ;↑ if (key & 4) : x = x + 0.8 ;→ if (key & 8) : y = y + 0.8 ;↓ ;*****************円形弾幕****************** ;あまりのが1の場合 if(frame\160 == 0){ ;玉が出る感覚 g=20 repeat g ;18*2=360 t = PI*2*cnt / g gosub *search ;サブルート if(number != -1){ ;玉の発射 b(number) = 1 b_x(number) = 200.0 ;玉のx座標 b_y(number) = 150.0 ;玉のy座標 b_vx(number) = cos(t) * 0.8 ;速さ b_vy(number) = sin(t) * 0.8 ;速さ }loop } ;玉の移動 repeat maxbullet ;640 if( b(cnt) == 1 ){ b_x(cnt) = b_x(cnt) + b_vx(cnt) b_y(cnt) = b_y(cnt) + b_vy(cnt) }loop ;*****************描画****************** ;霊夢の描画 pos x-16 , y-16 gmode 4,29,42,255 ;横,縦,color指定した透明度 gcopy 2,1,0 ;画面コピー ;弾幕の描画 repeat maxbullet ;640 if( b(cnt) == 1 ){ ;存在しする pos b_x(cnt)-8, b_y(cnt)-8 gmode 4,16,16,255 ;横,縦,color指定した透明度 gcopy 2,141,2 ;画面コピー }loop ;画面更新 redraw 1 ;実際の画面にも反映される redraw 0 ;実際の画面にも反映されない await 15 frame = frame +1 ;フレーム goto *メイン ;****************サブルート******************* *search number = -1 ;ナンバー repeat maxbullet ;640 ;1以外のとき実行 if( b(cnt) != 1 ) : number = cnt : break loop return

大体10%ぐらいの処理率を使う。
ちなみに「昔のソース」なので内容に関しては突っ込み厳禁で。


あとORZさん、いくら例え話でも「料理」の話を持ってきたら的外れだと思います。
回答したくなかったら回答しなくってもいいのでは?
「回答しないといけない」というルールはありませんし。



ひろ

リンク

2011/5/30(Mon) 09:13:57|NO.39444

スクリプト載せます
敵をいっぺんに5〜10くらい倒したら若干おそくなります
敵の弾と自分の判定はとりあえずつけてません


screen 0,500,400,0 title "STG" cls 4 an =1 :mmax=2.5 mx =double((500-18)/2) : my =double((400-18)/5*4) ms =2.0f dim t,20 : dim tx,20 : dim ty,20 dim a,10,5 : dim ax,10,5 : dim ay,10,5 dim af,10,5 ddim afx,10,5,10 : ddim afy,10,5,10 :dim aann,10,5 ddim aang,10,5 :ddim aan,10,5 :ddim rr,10,5 dim mfrx,6 : dim mfry,6 a(0,0)=1,1,1,1,1, 1,1,1,1,1 a(0,1)=1,0,0,0,0, 0,0,0,0,1 a(0,2)=1,0,1,1,0, 0,1,1,0,1 a(0,3)=1,0,0,0,0, 0,0,0,0,1 a(0,4)=1,1,1,1,1, 1,1,1,1,1 for i,0,5,1 for j,0,10,1 ax(j,i)=17+(j*50) ay(j,i)=25+(i*25) aann(j,i)=rnd(45) next next *main gosub *key gosub *tama gosub *me gosub *you gosub *draw await 10 :frame++ goto *main *draw redraw 0 color : boxf 0,0,500,400 color 255,255,255 if lif>=0 { pos mx,my : mes "▲" pos 450,350 : mes ""+frame } else { color 255 for i,0,6,1 pset mfrx(i),mfry(i) next } for i,0,5,1 for j,0,10,1 if a(j,i)=1 { color 255,255,255 pos ax(j,i),ay(j,i) mes "●" } if af(j,i)=1 { color 255,150,150 repeat 5 pset afx(j,i,cnt),afy(j,i,cnt) loop } next next color 255,255,200 for i,0,20,1 if t(i)=1 { line tx(i) ,ty(i)+10,tx(i) ,ty(i) line tx(i)+3,ty(i)+7 ,tx(i)-2,ty(i)+7 } next redraw 1 return *key stick k,31 if lif>=0 { if k&1 : mx=limitf(mx-ms,0,482) if k&4 : mx=limitf(mx+ms,0,482) if k&2 : my=limitf(my-ms,0,382) if k&8 : my=limitf(my+ms,0,382) if k&16: if auto=1 :auto=0 if k&32: if auto=1 :auto=0 :else :auto=1 } return *tama for i,0,20,1 if t(i)=1 :ty(i)-=4 :if ty(i)<-10 :t(i)=0 next if tf=1 { tt++ :if tt=15 :tt=0 :tf=0 } else :if (k&16)|(auto=1) { for i,0,20,1 if lif>=0 { if t(i)=0 : t(i)=1 :tx(i)=mx+7 :ty(i)=my :_break } else { for i,0,20,1 if t(i)=1 :t(i)=0 next } next tf=1 } return *me//my kitai if lif=-1{ for i,0,6,1 ang=deg2rad(an-90) mfrx(i)=cos(ang)*r+mx mfry(i)=sin(ang)*r+my an+60 next r++ } return *you for i,0,5,1 for j,0,10,1 for p,0,20,1 if (a(j,i)=1)&(t(p)=1){ if (( ax(j,i)<tx(p) )&( ax(j,i)+18>tx(p) ))&(( ay(j,i)<ty(p) )&( ay(j,i)+18>ty(p) )){ a(j,i)=0 : t(p)=0 :af(j,i)=1 } } if af(j,i)=1 { ans=0 repeat 5 if ( (afy(j,i,cnt)<0)|(afy(j,i,cnt)>400)|(afx(j,i,cnt)<0)|(afx(j,i,cnt)>500) ) :ans++ aang(j,i)=deg2rad(aan(j,i)-90+aann(j,i)) afx(j,i,cnt)=cos(aang(j,i))*rr(j,i)+ax(j,i)+8 afy(j,i,cnt)=sin(aang(j,i))*rr(j,i)+ay(j,i)+9 aan(j,i)+72 loop rr(j,i)+0.1 if ans=5 :af(j,i)=0 } next next next return

ご指導おねがいします。



あり

リンク

2011/5/30(Mon) 10:34:04|NO.39445

自分のPC(WinXP CeleronM1.7GHz)では特に処理落ちは発生しなかったので
単純にPCのスペックが足りていないという事も考えられますね(OSはVista?)

とりあえず高速化できそうなポイントとして
キャラクター(自機・敵・弾・破片等)をgcopyやcelputで表示する(mesやpset等があまり速くない為)
for〜nextを多用しない(HSPのマクロは結構遅いので)
多次元配列を多用しない(2次元以上の配列へのアクセスは要素数が増えるとかなり遅くなる)
辺りでしょうか。

あとこれは高速化とは関係ありませんがループ回数が敵の数等で固定されている場合は
#defineや#const等で定数化しておくとデバッグや数値を変更する時に楽になりますよ。



whoさん

リンク

2011/5/30(Mon) 21:59:45|NO.39467

僕も処理落ちしませんでした。CPU使用率も1パーセントと、影響は全くありませんでした。
ありさんと同じ意見です。



ひろ

リンク

2011/5/30(Mon) 22:46:51|NO.39469

CPU使用率50%こえてました(汗
どうすればいいでしょうか?



ひらまる

リンク

2011/5/30(Mon) 23:32:34|NO.39472

パソコンのスペックを公開してはどうでしょうか?
敵を一気に倒すと重くなるということは、あのセンスのある爆風が問題なのでしょう。
パソコンのスペックはおそらく、マイコンピュータのプロパティで見れるのではないでしょうか。



ひろ

リンク

2011/5/30(Mon) 23:44:33|NO.39474

すみません。
OSはwindows7 starter で
メモリは1GBです
ハードディスクは
空き容量が
C: 51.8/83.3
D: 9.59/55.5

こんなかんじです。



whoさん

リンク

2011/5/30(Mon) 23:56:47|NO.39475

1GB!?少なくない?



whoさん

リンク

2011/5/30(Mon) 23:57:12|NO.39476

CPUとかのほうも聞きたいです。



たんす

リンク

2011/5/31(Tue) 00:16:01|NO.39480

>OSはwindows7 starter
ネットブックですかねぇ。



あり

リンク

2011/5/31(Tue) 11:28:41|NO.39482

参考までに
古いPC(WinMe Pen3 700MHz)でNO.39444のスクリプトを起動させて
どの部分で処理が重くなるのか検証してみたところ
ラベル*youの中にある

repeat 5 if ( (afy(j,i,cnt)<0)|(afy(j,i,cnt)>400)|(afx(j,i,cnt)<0)|(afx(j,i,cnt)>500) ) :ans++ aang(j,i)=deg2rad(aan(j,i)-90+aann(j,i)) afx(j,i,cnt)=cos(aang(j,i))*rr(j,i)+ax(j,i)+8 afy(j,i,cnt)=sin(aang(j,i))*rr(j,i)+ay(j,i)+9 aan(j,i)+72 loop
の部分で非常に処理が重くなるようでしたので
なるべく多次元配列を使わないような処理に変更すれば
速度向上が見込めるかもしれません。



ひろ

リンク

2011/5/31(Tue) 14:26:36|NO.39484

すみません、
メモリは学生なのでお金がなくて(汗
余裕があったときに増設したいと思います。

ありさんありがとうございます。
多次元配列はHSPじゃ処理がおそいんですね、初めて知りました。
多次元配列をなるべくなくして作りたいと思います。

ではまたなにかあったら、ご指導おねがいします。
みなさんありがとうございました。



ひらまる

リンク

2011/5/31(Tue) 14:42:51|NO.39485

えと…一応言っておきますが、
メモリを増設したからといってパソコンの実行速度が上昇することはマレです。
速度に大きく関わるのはCPUなのですが、ノートパソコンの場合、これは増設や交換ができません。
ノートPC用増設メモリは5000円くらいだと思いますが、
ほとんどの場合、増設しても速度は変わりません。
なのでパソコンを買い換えるのが一番なのですが、今は仕方有りませんね。

せっかく速度の遅いPCを持っているのですから、
そのPCでサクサク動くゲームは、他のほとんどのPCでサクサク動くといえるでしょう。
処理速度を考慮したプログラムが書けるので、これはこれで儲けだと思います。



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