こんにちは。
ゲーム好きが高じてゲーム作成に手をつけ始めたものです。
プログラミングはまるっきり初心者なので、Dixq様のサイトを始め色々なサイトにお世話になっております。
自分が持っていた本の内容がシューティングゲーム制作用のものであったのと、初心者の私が最初から全て自力で作っていくのは厳しいだろうと思ったことからジャンルはシューティングに決め作成を開始しました。
二週間ほど掛けてコツコツ作り続けた結果、現状ある程度のゲームの骨格はできたと思っています。
自分のPCがかなり低スペックな為に(ほぼガクガクです)ゲームスピードなどの動作確認を友人に頼んだ結果、いくつかのバグと「プログラムを数秒走らせると徐々に重くなっていく現象」を指摘されました。
とりあえず視覚的にどこが原因なのか分かりやすかったバグについては既に処置済みですが、処理が遅くなっていく現象はPCにあまり通じていない私には正直どこが悪いのか依然分からず、作成がストップしています。
ソースコード、実行ファイルとその他必要なファイル(画像、マップデータetc)をアップロードしてあるので、よろしければどこが悪いのか指摘していただけないでしょうか。
また、最終的に低スペックでもそこそこ快適に動くゲームを目指しているので、パソコンにあまり負荷のかからないプログラムの書き方も教えていただけたらと思います。
まったくもって面倒なお願いですがどうかよろしくお願いします。
データアップロード先 → http://www.dotup.org/uploda/www.dotup.o ... 5.zip.html
(パスは掛かっていません)
環境 borland C++ compiler5.5
ゲームがだんだんと重くなる……
Re:ゲームがだんだんと重くなる……
弾や敵がを出したりする度に LoadGraphを呼んでテクスチャをロードしているようですが、
これではその度にディスクにアクセスするので遅いです。
更に敵や弾が消えた後 DeleteGraphを呼んでテクスチャのメモリを解放していないので
そのテクスチャはずっとメモリに残ったままになります。
すると時間が経ち表示される敵や弾が増えるにつれ追加でどんどんテクスチャを読み込みますので、
メモリを激しく消費、OSがスワップを起こし重くなっています。
改善策としては、起動時に使用する全ての素材を LoadGraphで読み込んで
事前にグラフィックスハンドル化しておきます。
その上で、各弾や敵を表示する際にそのグラフィックスハンドルを割り当てる(使い回し)ようにすれば
毎回読み込むことがなくなるので現象は改善されると思います。
このあたりは龍神録の館のコードを参考にするといいでしょう。
これではその度にディスクにアクセスするので遅いです。
更に敵や弾が消えた後 DeleteGraphを呼んでテクスチャのメモリを解放していないので
そのテクスチャはずっとメモリに残ったままになります。
すると時間が経ち表示される敵や弾が増えるにつれ追加でどんどんテクスチャを読み込みますので、
メモリを激しく消費、OSがスワップを起こし重くなっています。
改善策としては、起動時に使用する全ての素材を LoadGraphで読み込んで
事前にグラフィックスハンドル化しておきます。
その上で、各弾や敵を表示する際にそのグラフィックスハンドルを割り当てる(使い回し)ようにすれば
毎回読み込むことがなくなるので現象は改善されると思います。
このあたりは龍神録の館のコードを参考にするといいでしょう。
Re:ゲームがだんだんと重くなる……
> Arcさん
こんにちは。それは大槻さんの本ですかね~?
ところでJustyさんが紹介して下さっている
> このあたりは龍神録の館のコードを参考にするといいでしょう。
の部分を簡単に言うと、ゲームが始まる前にグラフィックを読み込み、終わったら解放する、つまり
グラフィック読み込み
while(1){ // メインループ
ゲームの処理
}
グラフィック解放
こんな感じかなと思います。
こんにちは。それは大槻さんの本ですかね~?
ところでJustyさんが紹介して下さっている
> このあたりは龍神録の館のコードを参考にするといいでしょう。
の部分を簡単に言うと、ゲームが始まる前にグラフィックを読み込み、終わったら解放する、つまり
グラフィック読み込み
while(1){ // メインループ
ゲームの処理
}
グラフィック解放
こんな感じかなと思います。
Re:ゲームがだんだんと重くなる……
なるほど。
確かにグラフィックハンドルを一度取ってグローバルにでもしまっておけば、LoadGraph関数で何度もメモリに読み込む必要はありませんね……。さらに私の場合はグラフィック消滅時にメモリを開放してなかったのでそれがどんどん蓄積されていっていたと。
おかげ様で良く理解することができました。
お二方ともわざわざご丁寧にありがとうございました。
都合上少しの期間PCを触る時間がとれないのですが、なるべく早く書き変えたいと思います。
本はお察しの通り、大槻有一郎さんの「14歳から始める~」を使っています(一番優しそうなので)。
ただこの本はDxライブラリでゲームを作ることにのみ特化し、標準関数などの使い方についてはあまり言及されていないようなので、内田智史氏監修の「C言語によるプログラミング-基礎編-」を併用しています。
一応、解決マークはプログラム改変後の動作を確認した後、報告と同時に付けさせていただきますね。
確かにグラフィックハンドルを一度取ってグローバルにでもしまっておけば、LoadGraph関数で何度もメモリに読み込む必要はありませんね……。さらに私の場合はグラフィック消滅時にメモリを開放してなかったのでそれがどんどん蓄積されていっていたと。
おかげ様で良く理解することができました。
お二方ともわざわざご丁寧にありがとうございました。
都合上少しの期間PCを触る時間がとれないのですが、なるべく早く書き変えたいと思います。
本はお察しの通り、大槻有一郎さんの「14歳から始める~」を使っています(一番優しそうなので)。
ただこの本はDxライブラリでゲームを作ることにのみ特化し、標準関数などの使い方についてはあまり言及されていないようなので、内田智史氏監修の「C言語によるプログラミング-基礎編-」を併用しています。
一応、解決マークはプログラム改変後の動作を確認した後、報告と同時に付けさせていただきますね。
Re:ゲームがだんだんと重くなる……
意外と時間がとれたので早速書き変えました。
http://www.dotup.org/uploda/www.dotup.o ... 3.zip.html
パスなし
改善後、今までの苦悩が嘘のようにヌルヌル滑らかに動くようになりました。
特に負荷を掛けていたのは画面右側の情報表示部分のようで。一秒間に60回も読み込むんじゃ、そりゃ遅くもなりますよねぇ……。
たぶんこれで大丈夫だと思うので解決マークを付けさせていただきます。本当にありがとうございました。
http://www.dotup.org/uploda/www.dotup.o ... 3.zip.html
パスなし
改善後、今までの苦悩が嘘のようにヌルヌル滑らかに動くようになりました。
特に負荷を掛けていたのは画面右側の情報表示部分のようで。一秒間に60回も読み込むんじゃ、そりゃ遅くもなりますよねぇ……。
たぶんこれで大丈夫だと思うので解決マークを付けさせていただきます。本当にありがとうございました。