|
|
2011/5/29(Sun) 23:50:48|NO.39432
HSPでSTGを一回作ってみたんですけど、とりあえず僕のスクリプトでは処理が多すぎて
動作がめっちゃ遅かったんで、
処理ごとにEXEファイルを分けて処理をさせたら早くなるでしょうか?
ちなみにEXEファイル同士の通信にはAPIを使おうと思ってるんですが、
こうした方法をとると動作がはやくなるでしょうか?
|
|
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に手を出すのもいいでしょうね。
|
|
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等で定数化しておくとデバッグや数値を変更する時に楽になりますよ。
|
|
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
こんなかんじです。
|
|
2011/5/30(Mon) 23:56:47|NO.39475
1GB!?少なくない?
|
|
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でサクサク動くといえるでしょう。
処理速度を考慮したプログラムが書けるので、これはこれで儲けだと思います。
|
|