まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
先日公開した縦スクロールスクリプトのコメント欄で、ありさんに5万回以上リピートしているので遅いのでは?とアドバイスを頂きました。
そんなにリピートしてたかなぁ?と思ってちゃんと数えて見ると・・・
2重リピートの中に、更に2重リピートを使っていたので合計1ループで57460回リピートしてました(汗)
具体的には↓こんな感じで書いていたのですが
repeat 16
repeat 13
gosub *lite;描画ルーチンへ
〜色々な処理
loop
loop
*lite
repeat 13
repeat 20
〜描画処理
loop
loop
return
リピート回数が小さいのでそれ程気にしてませんでしたが、ちゃんと考えると恐ろしい回数になるんですね・・・
で、なるべくリピート回数を減らす事が出来ないかと思って、ちょっと描画方法について考えてみました。
元々はこんなスクリプトで描画していたのですが、この場合260回必ずリピートしてしまいます。(マップチップが260個あるので)
*************************************
*lite
repeat 416/chp_sy;マップチップ画像のxサイズが416ドットなので
ent=cnt
repeat 640/chp_sx;マップチップ画像のyサイズが640ドットなので
if cd=cnt+ent*640/chp_sx:pos cb,cc+idy:es_copy 8,chp_sx*cnt,chp_sy*ent,chp_sx,chp_sy
loop
loop
return
*************************************
で、↑コレを↓このように変更してみました。
*************************************
*lite
if cd=13:return
if (cd>=0)&(cd<20):pos cb,cc+idy:es_copy 8,chp_sx*cd,0,chp_sx,chp_sy:return
if (cd>=20)&(cd<40):pos cb,cc+idy:es_copy 8,chp_sx*(cd-20),32,chp_sx,chp_sy:return
if (cd>=40)&(cd<60):pos cb,cc+idy:es_copy 8,chp_sx*(cd-40),64,chp_sx,chp_sy:return
if (cd>=60)&(cd<80):pos cb,cc+idy:es_copy 8,chp_sx*(cd-60),96,chp_sx,chp_sy:return
if (cd>=80)&(cd<100):pos cb,cc+idy:es_copy 8,chp_sx*(cd-80),128,chp_sx,chp_sy:return
if (cd>=100)&(cd<120):pos cb,cc+idy:es_copy 8,chp_sx*(cd-100),160,chp_sx,chp_sy:return
if (cd>=120)&(cd<140):pos cb,cc+idy:es_copy 8,chp_sx*(cd-120),192,chp_sx,chp_sy:return
if (cd>=140)&(cd<160):pos cb,cc+idy:es_copy 8,chp_sx*(cd-140),224,chp_sx,chp_sy:return
if (cd>=160)&(cd<180):pos cb,cc+idy:es_copy 8,chp_sx*(cd-160),256,chp_sx,chp_sy:return
if (cd>=180)&(cd<200):pos cb,cc+idy:es_copy 8,chp_sx*(cd-180),288,chp_sx,chp_sy:return
*************************************
変数cdにマップチップのデータが入っているのですが、それを利用してマップチップ画像のコピー位置を指定するようにすれば
if文が10回なので(つまりrepeat 10と同じ)、repeatが260回から10回に減らす事が出来、
全体で57460回のrepeatが最高でも2210回のrepeatを行うように変更出来ました^^
そして、描画が終わったら即returnするようにして、背景チップ(全く画像がない所)は描画せずにreturnするようにしてみたら
かなり描画速度が上昇しました!
・・・・・・と言ってもFPS50位なのですが(汗)
でも、ちょっとの工夫でスクリプトの実行速度を上げる事が出来るって事がわかっただけでも大きな収穫です。
また暇をみて、もっと効率的に描画できる方法を考えてみようと思っています。
とりあえず、スプライトを使用したスクロールを使用すれば速度的には問題ないので、そちらで製作を進めて行こうと思っています^^
そんなにリピートしてたかなぁ?と思ってちゃんと数えて見ると・・・
2重リピートの中に、更に2重リピートを使っていたので合計1ループで57460回リピートしてました(汗)
具体的には↓こんな感じで書いていたのですが
repeat 16
repeat 13
gosub *lite;描画ルーチンへ
〜色々な処理
loop
loop
*lite
repeat 13
repeat 20
〜描画処理
loop
loop
return
リピート回数が小さいのでそれ程気にしてませんでしたが、ちゃんと考えると恐ろしい回数になるんですね・・・
で、なるべくリピート回数を減らす事が出来ないかと思って、ちょっと描画方法について考えてみました。
元々はこんなスクリプトで描画していたのですが、この場合260回必ずリピートしてしまいます。(マップチップが260個あるので)
*************************************
*lite
repeat 416/chp_sy;マップチップ画像のxサイズが416ドットなので
ent=cnt
repeat 640/chp_sx;マップチップ画像のyサイズが640ドットなので
if cd=cnt+ent*640/chp_sx:pos cb,cc+idy:es_copy 8,chp_sx*cnt,chp_sy*ent,chp_sx,chp_sy
loop
loop
return
*************************************
で、↑コレを↓このように変更してみました。
*************************************
*lite
if cd=13:return
if (cd>=0)&(cd<20):pos cb,cc+idy:es_copy 8,chp_sx*cd,0,chp_sx,chp_sy:return
if (cd>=20)&(cd<40):pos cb,cc+idy:es_copy 8,chp_sx*(cd-20),32,chp_sx,chp_sy:return
if (cd>=40)&(cd<60):pos cb,cc+idy:es_copy 8,chp_sx*(cd-40),64,chp_sx,chp_sy:return
if (cd>=60)&(cd<80):pos cb,cc+idy:es_copy 8,chp_sx*(cd-60),96,chp_sx,chp_sy:return
if (cd>=80)&(cd<100):pos cb,cc+idy:es_copy 8,chp_sx*(cd-80),128,chp_sx,chp_sy:return
if (cd>=100)&(cd<120):pos cb,cc+idy:es_copy 8,chp_sx*(cd-100),160,chp_sx,chp_sy:return
if (cd>=120)&(cd<140):pos cb,cc+idy:es_copy 8,chp_sx*(cd-120),192,chp_sx,chp_sy:return
if (cd>=140)&(cd<160):pos cb,cc+idy:es_copy 8,chp_sx*(cd-140),224,chp_sx,chp_sy:return
if (cd>=160)&(cd<180):pos cb,cc+idy:es_copy 8,chp_sx*(cd-160),256,chp_sx,chp_sy:return
if (cd>=180)&(cd<200):pos cb,cc+idy:es_copy 8,chp_sx*(cd-180),288,chp_sx,chp_sy:return
*************************************
変数cdにマップチップのデータが入っているのですが、それを利用してマップチップ画像のコピー位置を指定するようにすれば
if文が10回なので(つまりrepeat 10と同じ)、repeatが260回から10回に減らす事が出来、
全体で57460回のrepeatが最高でも2210回のrepeatを行うように変更出来ました^^
そして、描画が終わったら即returnするようにして、背景チップ(全く画像がない所)は描画せずにreturnするようにしてみたら
かなり描画速度が上昇しました!
・・・・・・と言ってもFPS50位なのですが(汗)
でも、ちょっとの工夫でスクリプトの実行速度を上げる事が出来るって事がわかっただけでも大きな収穫です。
また暇をみて、もっと効率的に描画できる方法を考えてみようと思っています。
とりあえず、スプライトを使用したスクロールを使用すれば速度的には問題ないので、そちらで製作を進めて行こうと思っています^^
PR
この記事にコメントする
無題
先日は素人丸出しな書き込み申し訳ありません&素早い反応有難う御座います。
正直、es_copyだけに目がいっていたのでif文の存在に気がついていませんでした(汗)、試しにifを外してみたら大変なことに・・・(苦笑)
それで今回の改良型(?)スクリプトに置き換えてみたところウチの環境
WinMe アスロン700MHz メモリ256MB NVIDIA vanta8MB(オンボード)
で、以前は10FPSしか出なかったのが50〜60FPSと、劇的に速くなりました。
…が、それでもスプライト版の方がかなり速いので(es_sync 0,1にすると130FPS前後)問題がない限りはスプライト使用のほうが良いのでしょうね、わざわざ検証有難う御座いました。
やはりHSP製の高速STGは計算式や内部処理でかなりの最適化がされているのではないでしょうか。
ネットで探してみると高速化の情報が結構見つかりますので参考になるものもあるのでは?
それでは二日連続の書き込み&長文失礼致しました。
正直、es_copyだけに目がいっていたのでif文の存在に気がついていませんでした(汗)、試しにifを外してみたら大変なことに・・・(苦笑)
それで今回の改良型(?)スクリプトに置き換えてみたところウチの環境
WinMe アスロン700MHz メモリ256MB NVIDIA vanta8MB(オンボード)
で、以前は10FPSしか出なかったのが50〜60FPSと、劇的に速くなりました。
…が、それでもスプライト版の方がかなり速いので(es_sync 0,1にすると130FPS前後)問題がない限りはスプライト使用のほうが良いのでしょうね、わざわざ検証有難う御座いました。
やはりHSP製の高速STGは計算式や内部処理でかなりの最適化がされているのではないでしょうか。
ネットで探してみると高速化の情報が結構見つかりますので参考になるものもあるのでは?
それでは二日連続の書き込み&長文失礼致しました。
カレンダー
03 | 2025/04 | 05 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
リンク
カテゴリー
最新記事
(04/04)
(12/26)
(12/25)
(11/17)
(10/11)
プロフィール
HN:
kt.
性別:
男性
自己紹介:
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
最古記事