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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0726
ミント処理速度を速くしたい16解決


ミント

リンク

2010/7/26(Mon) 15:12:20|NO.33989

どーもお久しぶりです。そうでない方は初めまして。

ここのおかげでSTGの制作が終盤にさしかかってきました(体験版)
ですがこのままゲームとしてユーザーに渡した場合、重くってろくにプレイできない可能性があるので、
今回はその改善策を探しに質問させていただきます。



*環境*
まず最初に言いますが、私のPCが低スペックっというわけではございません。
(CPU自慢大会参考)



なるべく小さくしたつもりですが、100行を超えてしまいました。
一定の感覚に(g=20)弾幕を出しています。

以下がソースです。
-------------------------------------------------------

#define PI 3.14159265358979 ;(40 → 83 (EXE → 86 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速度 ;**********メインループ*********************** *mein ;画面クリア color 0,0,0 boxf ;矩形を塗りつぶす ;*********霊夢の移動************************** stick key,15 if (key & 1) : x = x - 0.3 ;← if (key & 2) : y = y - 0.3 ;↑ if (key & 4) : x = x + 0.3 ;→ if (key & 8) : y = y + 0.3 ;↓ ;*********円形弾幕************************** ;あまりのが1の場合 if(frame\160 == 0){ ;玉が出る感覚 g=20 ;20℃ repeat g ;180℃*2=360℃ t = PI*2*cnt / g ;+ trnd ;コメント外すとランダム弾幕 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.3 ;速さ b_vy(number) = sin(t) * 0.3 ;速さ }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 0 frame = frame +1 ;フレーム goto *mein ;メイン ;*********サブルート************************** *search number = -1 ;ナンバー repeat maxbullet ;640 ;1以外のとき実行 if( b(cnt) != 1 ) : number = cnt : break ;ループから抜ける ;存在しする ;ナンバー loop return ;サブルーチンから復帰
-------------------------------------------------------------
私のPCだと「40〜50弱」の数値がでます。
私は問題なのですが、最初に言ったようにユーザーがプレイすることを考えるとこのままではまずいです。

っていうかもしユーザー全員がハイスペックPCだとしても、
負担率40〜50なんていうのは避けるべきです。


よってなんとかCPUの使用率を、出来れば20前後までにしたいと思っております。
この場合どうしたら、もっと軽くすることが可能でしょうか?
弾幕を減らすなどは、無しな方向でお願いしいたします。

それではよろしくお願いいたします。



この記事に返信する


アイガモ

リンク

2010/7/26(Mon) 15:12:33|NO.33990

awaitの数値を上げれば負担率は大幅に減りますが
移動量を書き換える必要があります。



アイガモ

リンク

2010/7/26(Mon) 15:16:21|NO.33991

あとはDirectXを使うとか。

ちなみに私のPCでは負担率が90異常でした……。



ミント

リンク

2010/7/26(Mon) 15:37:36|NO.33994

>アイガモさん
「await」ですか、なるほど。
実際に変えてやってみたところ、結構下がりましたね。
「await 60」ぐらいで20以下になりました。

ですがアイガモさんのおっしゃるとおり、移動量を変えないといけませんね。




ちなみに3Dオンラインゲーを放置しながらやると、50以下でした。

なんでそんなものを立ち上げながらやっているんだよ!っという突っ込みがきそうですが
ユーザーの中には「00のついでに」っという方もいますので、そういったことの想定です。


ん〜さてどうしたものか、これはこれでいいのですが
すべての攻撃パターンの移動量を変えないといけないという悲しみが待っているが
もしこれしかないのならやるしかないですね。


ありがとうございました。



ミント

リンク

2010/7/26(Mon) 15:41:33|NO.33995

>アイガモさん
>>あとはDirectXを使うとか。
ダイレクトXですか。確かによさそうです。
が「DirectX」の勉強で嫌になるという話もよく聞くので、自分が耐えられるかどうか・・・

機会があれば「DirectX」に手を出してみたいと思います。



>>ちなみに私のPCでは負担率が90異常でした……
ぎゃああああぁぁ。
やっぱこのままだとまずいですね。

「DirectX」やほかの方法がないかどうか調べつつ、速度の改善に努めたいと思いますので
他にもありましたら教えてください。お手数掛けます。


アドバイスありがとうございます。



SYAM

リンク

2010/7/26(Mon) 15:42:19|NO.33996

…というか、await 0 だとゲームのスピードがバラバラになりすぎませんか?
遅いPCの心配も必要ですが、速いPCは速いPCでこれだとゲームのスピードが青天井で上がっていきます。それはそれでゲームになりません。
awaitに0を指定するということは一見、いちばん動作が速くてイイ…ように見えるかもしれませんが、単にスピードの制御をしていないってだけですからゲームにはひどく不都合です。特にアクションゲームやシューティングゲームなどはスピードの制御がたいへん大事でしょう。

await にちゃんと数値を指定して、そのうえでまともに動作するように物体のスピードを調整しましょう。
…ただし、 await の精度はあまりよろしくありませんから、60FPSのゲームを作るとかはHSPの標準命令では非常に厳しいです。
アクション性の高いゲームはおよそDirectXを利用するのが賢明です。そのためのものですから。



ミント

リンク

2010/7/26(Mon) 15:56:19|NO.33997

>>SYAMさん
>>…というか、await 0 だとゲームのスピードがバラバラになりすぎませんか?
>>遅いPCの心配も必要ですが、速いPCは速いPCでこれだとゲームのスピードが青天井で上がっていきます。それはそれでゲームになりません。
そうですね・・・弾幕によってムラが出てしまってます。

そういえば違うゲームですが、ノートPCでやったらとんでもない動きになりましたね・・・
なるほど速いPC対策もしないとダメですね・・・っとなるとFPSかな?



>>…ただし、 await の精度はあまりよろしくありませんから、60FPSのゲームを作るとかはHSPの標準命令では非常に厳しいです。
うげぇ・・・まだ初心者なので今は手を出さない方がよさそうだ・・・
でも興味はあるので、そのうちやろうかと思います。


>>アクション性の高いゲームはおよそDirectXを利用するのが賢明です。そのためのものですから。
な・・・なるほど。やっぱダイレクトXになるか。



とりあえず「await」で頑張ってみて、納得いく動作にならなかった場合
「DirectX」に手をだしてみようかと思います。
そのうち「FPS」を作ってみたいですね。

アドバイスありがとうございます。



あり

リンク

2010/7/26(Mon) 16:26:32|NO.34000

余計な事とは思いますが、念の為言っておくと
SYAMさんの言うFPSとは『First Person Shooting』ではなく
『フレームレート』(Frames Per Second)の事ですね。

>「DirectX」の勉強で嫌になるという話もよく聞くので、自分が耐えられるかどうか・・・
それは自分でDirectXを扱うライブラリを作る場合の話だと思いますが・・・
少なくともHSP標準添付のDirectXライブラリ(HPSDX,HGIMG(3),Easy3D)では
2Dに使う分にはそれほど覚える事も多くないですしHSP標準命令に近い使い方で
使えるようになっていますよ。

SYAMさんも言っていますがFPS制御をしていないとゲームとしてはまず成り立ちません。
CPU負荷も重要ではありますが2Dのゲームで優先されるのはフレームレートの方だと思います。
必要なFPSが出せない環境は動作環境に足りてないという事で切り捨てる事になるのが
ゲーム製作者が頭を悩ませる所ですね。
より多くの環境で動かしたいのであればフレームスキップを導入したり
PC用STGでよくあるように描画頻度を選択可能にするという方法もあります。

ちなみにawaitで60FPSを安定維持させるのは難しいですが
30〜50FPS(await 33〜20)ぐらいであれば余程重い処理をしていない限りは
比較的安定した値を維持する事ができました。
STGは60FPSじゃなきゃダメ、というような信念を持っていないのなら
40FPS辺りのフレームレートでも十分STGとして遊べると個人的には思います。



ミント

リンク

2010/7/26(Mon) 16:54:41|NO.34001

>>ありさん
>>それは自分でDirectXを扱うライブラリを作る場合の話だと思いますが・・・
すいません。ものすごい勘違いしてました・・・作る場合でした・・・


>>少なくともHSP標準添付のDirectXライブラリ(HPSDX,HGIMG(3),Easy3D)では
>>2Dに使う分にはそれほど覚える事も多くないですしHSP標準命令に近い使い方で使えるようになっていますよ。
今それをいじいじしてて、後もう少しで出来そうです。


>>SYAMさんも言っていますがFPS制御をしていないとゲームとしてはまず成り立ちません。
>>CPU負荷も重要ではありますが2Dのゲームで優先されるのはフレームレートの方だと思います。
うぅ・・・私にFPS制御なんて出来るのか・・・
いやいや、やってみようじゃないか。
時間があるときにやってみます。わからないことだらけですが。


>>PC用STGでよくあるように描画頻度を選択可能にするという方法もあります。
それなら実際にありますね。
ですが、これも今の私に作れるかどうか・・・
機会があればやってみます。



>>30〜50FPS(await 33〜20)ぐらいであれば余程重い処理をしていない限りは
>>比較的安定した値を維持する事ができました。
ふむふむ。とても参考になります。

>>STGは60FPSじゃなきゃダメ、というような信念を持っていないのなら
>>40FPS辺りのフレームレートでも十分STGとして遊べると個人的には思います。
「60FPSじゃなければだめ!」っというのを自分の中で作りすぎたようです・・・
そこまでこだわる必要が無さそうなので、少し気が楽になりました。



詳しいアドバイスありがとうございます!
なんとか完成までがんばってみようかと思います。



SYAM

リンク

2010/7/26(Mon) 18:57:27|NO.34004

>FPS制御なんて出来るのか

大丈夫、できますよ。
60FPSとか言い出さなければすっごい簡単。

await 命令は、「**ミリ秒経つまで待つ」という命令ではなく、「"前回のawaitから"**ミリ秒経つまで待つ」という命令です。
ということは、await 命令がループの中に1つだけ入っていれば、「ループ1回が**ミリ秒より早くならないようにする」という意味になります。
…つまり、FPSの制御ができてることになります。

今いくら出てるのか、っていう計算は(HSP標準命令では)厄介ですが、
制御すること自体はかんたんです。 await 命令はそのために都合のいいようにできているんですね。



GENKI

リンク

2010/7/26(Mon) 19:39:12|NO.34006

> うぅ・・・私にFPS制御なんて出来るのか・・・

awaitを使えば何も難しいことはありません。
むしろ可変fpsでゲーム作るほうが難しいと思います。
awaitの詳しい動作についてはf1キーでマニュアルよんでください。

awaitを指定すれば、おおよそ一定のfps値を得ることが出来るようになります。
30で約30fps、15で約60fpsになるようです。
本来なら、1s/30fps≒33ms、1s/60fps≒17msを指定すればいいはずですが、他の方々が言うようにawaitは精度があまりよくないので60fpsピッタリにあわせることは出来ません。しかし、ゲームする程度なら支障はありません。

また、fps値の確認はd3getfpsを使うと簡単です。

#include "d3m.hsp" ;d3getfpsを使用するために必要。 *main redraw 1 : await 30 : redraw 0 : color : boxf : color 255, 255, 255 : pos 0,0 mes "" + d3getfps() + " fps" goto *main


以下、誰も突っ込まないのでまとめて突っ込み。

> #define PI 3.14159265358979 ;(40 → 83 (EXE → 86

M_PI

> g=20 ;20℃

温度→20方向

> ;180℃*2=360℃

温度→度

> 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速度

こっちの方が楽ではないですか?
ddim b_x, maxbullet ;x座標
ddim b_y, maxbullet ;y座標
ddim b_vx,maxbullet ;x速度
ddim b_vy,maxbullet ;y速度



e

リンク

2010/7/26(Mon) 23:52:33|NO.34012

ていうかみんなawaitの制度がよくないというけど、
await 0で最高速度
await 1で60FPS
await 2でも60FPS
await 16くらいまで60FPS ←ほんとはこれで丁度60FPSくらいなんだけどねー
await 17くらいからいきなり30FPS
↑これが制度が悪いと言われている原因(多分)です。
await 2では2ミリ秒待ってくれないので、
await 1
await 1
と、await 1を2回書くことによって、安定して
60FPS→30FPSとできますよー。
(たいていの場合、64FPS→32FPSだけどね)



e

リンク

2010/7/27(Tue) 00:02:17|NO.34013

今スクリプト読んでたら「goto *mein」てw
笑っちゃったよww いや何も悪くないんだけど、逆に新鮮だった。
ちなみにグーグル翻訳に入れたら「やきそば」って出たよ。
他にも注訳で「;玉が出る感覚」とか「;存在しする」とか「;実際の画面にも反映されない」とか
たった104行のスクリプトで、ちょっとしたミスとも言えないようなネタがこんなにあると
とても不安になるから、たまに自分のスクリプトを見直した方が良いよ〜
でもバックアップは忘れずにね☆
なんか馬鹿にした感じになっちゃったかもしれないけど、
実際ツボに入っただけだから全然敵意ないから、愛してるぜ。



ミント

リンク

2010/7/27(Tue) 08:12:39|NO.34020

>>SYAMさん
>>await 命令は、「**ミリ秒経つまで待つ」という命令ではなく、「"前回のawaitから"**ミリ秒経つまで待つ」という命令です。
awaitにそんなことができるとは・・・
今まで無視してごめんよawait


アドバイスありがとうございます



ミント

リンク

2010/7/27(Tue) 10:46:22|NO.34025

>>GENKIさん
>>awaitの詳しい動作についてはf1キーでマニュアルよんでください。
マニュアルよんだら、意外とすごいことをやってくれるようで・・・やっぱ無視してごめんよawait。


>>30で約30fps、15で約60fpsになるようです。
メモメモ。


>>#include "d3m.hsp" ;d3getfpsを使用するために必要。
おおー、なんかすごいソースですね。参考になります!



> g=20 ;20℃
>>温度→20方向

> ;180℃*2=360℃
>>温度→度
ぎゃああああ。よくあるんですよ。こういうミス・・・
オンラインゲーの誤字脱字がそのままこっちまできています・・・
(このスレッドの一番↓の所とか → お願いしいたします。)




>>こっちの方が楽ではないですか?
>>ddim b_x, maxbullet ;x座標
〜〜略〜〜

おおー、なるほど・・・ってしばらくしたら、弾がでなくなったので修正しときますね。



細かいアドバイスと、参考になるソースまでありがとうございました!



ミント

リンク

2010/7/27(Tue) 10:52:23|NO.34027

>>eさん
>>await 0で最高速度
>>await 1で60FPS
>>await 2でも60FPS
>>await 16くらいまで60FPS ←ほんとはこれで丁度60FPSくらいなんだけどねー
>>await 17くらいからいきなり30FPS
おおー、awaitにこんな可能性があったとは。
17でいきなし変わるのですか。ふむふむ。


>>await 2では2ミリ秒待ってくれないので、
>>await 1
>>await 1
>>と、await 1を2回書くことによって、安定して
2回書くという荒業?っということも可能なのか、なるほど。



>>60FPS→30FPSとできますよー。
>>(たいていの場合、64FPS→32FPSだけどね)
なるほど。工夫次第では色々変化できるんですね。


アドバイスありがとうございます。



ミント

リンク

2010/7/27(Tue) 11:00:26|NO.34028

>>eさん
>>今スクリプト読んでたら「goto *mein」てw
>>笑っちゃったよww いや何も悪くないんだけど、逆に新鮮だった。
ぎゃああああ。ここにも誤字ががっがああああ。



>>他にも注訳で「;玉が出る感覚」とか「;存在しする」とか「;実際の画面にも反映されない」とか
間隔・・・しする・・・にも・・・

>>たった104行のスクリプトで、ちょっとしたミスとも言えないようなネタがこんなにあると
>>とても不安になるから、たまに自分のスクリプトを見直した方が良いよ〜
そのとおりですね〜。
結構前のソースを使ったので、多分その時の名残が残ってたかもしれません。
いや、一応見直したんだけどね。えぇ。



>>なんか馬鹿にした感じになっちゃったかもしれないけど、
>>実際ツボに入っただけだから全然敵意ないから、愛してるぜ。
いやいや、そんなことないですよ。
まー・・・こうゆうミスは、私の中ではデフォルであり気味なので気をつけときます。



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