ページ 11

メモリ使用量が増大する? 関数呼び出しと描画

Posted: 2010年6月22日(火) 20:48
by ABS
ABSと言います。C言語超初心者です。
よろしくお願いします。

今していることは、5対5で味方と敵がターン制バトル(ドラクエと同じ)を
したいと思ってます。
そこで、HPバーとMPバーを最大で10人分用意する必要があると思います。

1、攻撃コマンド選択。
2、攻撃対象を選ぶ。
3、HPバーを減らす。
のプログラムはなんとか組めたのですが、
HPバーを減らすたびに、下記のような関数を呼ぶ必要があるのでしょうか。
というか画像を少しでもいじるたびに全て消して、また描く必要があるのでしょうか。

このように関数を用意して画像を描写すると、メモリ使用量が爆発的に増大し、
攻撃コマンドを5回選択するとメモリ使用量が50M→1Gくらいになってしまいます。
何かおかしいと思うのですが、どうかアドバイスください。

つまり質問内容を要約すると、
「下記のようにプログラムを組むと、メモリを使いすぎる!!おかしいですか?」
ということです。。


プロジェクト全体(って言うのかな)をzipで上げます。
28.2MBで解凍すると80Mくらいになります。
ちなみにプログラムは途中で、プレイヤーの行動を決定するだけです。
パスは「C」
http://www1.axfc.net/uploader/Si/so/76874.zip

---------------------------------------------

void byouga_kihon(){

int image_attack = LoadGraph("attack.png");
int image_magic = LoadGraph("magic.png");
int image_defence = LoadGraph("defence.png");
int image_enemy = LoadGraph("enemy.png");
int image_forest = LoadGraph("Forest.png");
int image_py = LoadGraph("py.png");
int image_py2 = LoadGraph("py2.png");


SetDrawScreen( DX_SCREEN_BACK );

SetDrawBright(64,64,64);
DrawGraph( 0, 0,image_forest,FALSE);
SetDrawBright(256,256,256);
DrawGraph(360,75,image_attack,FALSE);
DrawGraph(360,108,image_magic,FALSE);
DrawGraph(360,141,image_defence,FALSE);
DrawGraph(480,75,image_enemy,TRUE);
DrawGraph(80,75,image_py,TRUE);
DrawGraph(80,180,image_py2,TRUE);


int i = 0;
double A = (py_hpX * 100) / py_maxhp;

DrawBox( py_hp_x , py_hp_y , py_hp_x+100 , py_hp_y+10 , GetColor(255,0,0) ,TRUE );
//HPメーターのダメージバーを描画(赤ゲージ)
DrawBox( py_hp_x , py_hp_y , py_hp_x+A, py_hp_y+10 , GetColor(0,255,255) , TRUE );
//HPメーターのダメージバーを描画(緑ゲージ)

i = 1;
A = (py_hpX[i] * 100) / py_maxhp[i];

DrawBox( py_hp_x[i] , py_hp_y[i] , py_hp_x[i]+100 , py_hp_y[i]+10 , GetColor(255,0,0) ,TRUE );
//HPメーターのダメージバーを描画(赤ゲージ)
DrawBox( py_hp_x[i] , py_hp_y[i] , py_hp_x[i]+A, py_hp_y[i]+10 , GetColor(0,255,255) , TRUE );
//HPメーターのダメージバーを描画(緑ゲージ)


i = 5;
A = (py_hpX[i] * 100) / py_maxhp[i];

DrawBox( py_hp_x[i] , py_hp_y[i] , py_hp_x[i]+100 , py_hp_y[i]+10 , GetColor(255,0,0) ,TRUE );
//HPメーターのダメージバーを描画(赤ゲージ)
DrawBox( py_hp_x[i] , py_hp_y[i] , py_hp_x[i]+A, py_hp_y[i]+10 , GetColor(0,255,255) , TRUE );
//HPメーターのダメージバーを描画(緑ゲージ)
} 画像

Re:メモリ使用量が増大する? 関数呼び出しと描画

Posted: 2010年6月22日(火) 20:55
by シエル
おそらくですが、この関数を呼ぶたびにLoadGraphで画像を何度も読み込んでることが原因
かと思われます。
画像はゲーム開始時に一度だけ読み込んで、DrawGraphだけで何度も描画するというように
したほうがいいと思われます。

Re:メモリ使用量が増大する? 関数呼び出しと描画

Posted: 2010年6月22日(火) 21:07
by ABS
>>シエルさん
void byouga_kihon(){

int image_attack = LoadGraph("attack.png");
int image_magic = LoadGraph("magic.png");
int image_defence = LoadGraph("defence.png");
int image_enemy = LoadGraph("enemy.png");
int image_forest = LoadGraph("Forest.png");
int image_py = LoadGraph("py.png");
int image_py2 = LoadGraph("py2.png");

ここの行を全てコメントアウトして、
最初に、グローバル変数をLoadGraphで読み込むようにしてみたのですが、
それだとなぜか画像が描写されないんです。

上の文のコメントアウト全て外すと、画像描写はされるのですが
やはりメモリ使用量がどんどん増えていきます。

よく分らないです。

Re:メモリ使用量が増大する? 関数呼び出しと描画

Posted: 2010年6月22日(火) 21:20
by ムンバ
こんばんは!

こちらのサイトの館で勉強させて頂いた時、作ったRPGの一部のソースです。
メインファイルは、添付させて頂きました。(←見れなかったら修正します。)
---↑解決により添付ファイル削除しました---
ABSさんの参考になりますでしょうか?
//Lord.cpp(ファイル)

#include "header.h"

void Load()
{
    /* キャラ画像 */
    LoadDivGraph("img/cat001.png", 16, 4, 4, 32, 32, chara001_img); //001(16分割)~016・猫001

    /* 背景画像 */
    bg[0] = LoadGraph("img/haikei_002.png"); //map1背景

    /* 行けない所画像 */
    no_img[0] = LoadGraph("img/wood001.png"); //木
    no_img[1] = LoadGraph("img/hako001.png"); //宝箱001
    no_img[2] = LoadGraph("img/hako002.png"); //宝箱002
    no_img[3] = LoadGraph("img/hako003.png"); //宝箱003

    /* 行ける所画像 */
    go_img[0] = LoadGraph("img/door001.png"); //扉
    go_img[1] = LoadGraph("img/jimen001.png"); //草
    go_img[2] = LoadGraph("img/miti001.png"); //草
    go_img[3] = LoadGraph("img/izumi_001.png"); //泉001
    go_img[4] = LoadGraph("img/yuka001.png"); //床001
    go_img[5] = LoadGraph("img/izumi_002.png"); //泉002
    go_img[6] = LoadGraph("img/numa001.png"); //沼001

    /* 敵画像 */
    teki_img[0] = LoadGraph("img/teki001_dog.png"); //敵犬

    SetDrawScreen(DX_SCREEN_BACK);    //描画先を裏画面に設定
}
ベテランの方のやり方は、また違うと思うので
ソースに関しては、突っ込まないで下さい。^^;
あくまでも、参考になればと思い。(笑

---編集・追記---
添付ファイルを開いて文字化けしてるようでしたら
ブラウザ→表示→エンコード→日本語(シフト JIS)などで表示されると思います。
メインファイルの 14行目辺りの Load(); で画像を読み込んでいます。
while文より先に(前で)呼び出してます。 画像

Re:メモリ使用量が増大する? 関数呼び出しと描画

Posted: 2010年6月22日(火) 21:37
by ムンバ
すみません。
これだと、型宣言が足りないですね。
ん~?
ABSさん、今お時間ありますか?

---修正・添付ファイル(dec.h)追加---
---解決により添付ファイル削除させて頂きました。---
型宣言をしたファイルを、添付させて頂きました。

header.h ファイルを追記させて頂きます。

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

#include "DxLib.h"
#include "define.h"
#include "struct.h"
#include "func.h"
#include "dec.h"

これで、何とかつながりますでしょうか?
もし解らなければ、こちらのサイトの
「龍神録プログラミングの館」の
0~
6 メインループで呼ぶ関数を制御してみよう
までを参考にされて下さい。 画像

Re:メモリ使用量が増大する? 関数呼び出しと描画

Posted: 2010年6月22日(火) 21:49
by シエル
すみません。ソースコードを見させていただきましたが、ちょっと修正していただく部分が
かなり多そうなので、一度下記のページを参照してもう一度書き直すことをお勧めします。
ScreenFlipとかSetDrawScreenなどを何度も呼び出しすぎです。
その他にもたくさん修正する必要があります。。。

http://dixq.net/g/13.html
http://dixq.net/g/14.html

Re:メモリ使用量が増大する? 関数呼び出しと描画

Posted: 2010年6月22日(火) 21:56
by ムンバ
修正してたら、シェルさんとかぶってしまいました。
申し訳御座いません。
私のソースは、今後の参考程度になればと思います。
ちょっと飛躍(ひやく)し過ぎてました。ごめんなさい。
ABSさん、がんばって下さい!^^

Re:メモリ使用量が増大する? 関数呼び出しと描画

Posted: 2010年6月22日(火) 21:57
by ABS
>>ムンバさん

はじめまして!

#include "header.h"や、
Load.cppを作りmainファイルで呼び出すことなど新しい発見がありました。
大変参考になりました。
自分がちょっと初心者すぎたと思います。勉強し直します。
とりあえずスパゲッティコードで何か作りたいと焦っていたようです。

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




※UPしたファイルを削除しました。

Re:メモリ使用量が増大する? 関数呼び出しと描画

Posted: 2010年6月22日(火) 22:05
by ABS
>>シエルさん
>すみません。ソースコードを見させていただきましたが、ちょっと修正していただく部分が
>かなり多そうなので、一度下記のページを参照してもう一度書き直すことをお勧めします。
>ScreenFlipとかSetDrawScreenなどを何度も呼び出しすぎです。
>その他にもたくさん修正する必要があります。。。


自分でもコレは突っ込みどころ満載だろうなぁと思ってました(笑)
わざわざ時間を取らせてもらってすいません。
そのページは何度か見たのですが、もう一度最初から見直してみます。
ありがとうございました!

Re:メモリ使用量が増大する? 関数呼び出しと描画

Posted: 2010年6月22日(火) 22:22
by ムンバ
あっ・・・
こちらこそ、初めまして!^^

私は、シェルさんがリンクを張られた、こちらのサイトの
「ゲームプログラミングの館」を参考にさせて頂き、ゲーム作りを始めました。
比類無きプログラマー と、なってますけど
ほとんど「聞くだけの比類無きプログラマー」ですので、ご勘弁下さい。

初級者の本を購入して基礎を勉強しながら、ゲームプログラミングの館を参考に
こちらの掲示板で解らない所を質問しながら・・・
最初は、怒られてるみたいに思う(感じる)かもしれませんが・・・
実は私、いつも訳の解らない、勘違いだらけの質問をしてまして・・・
でも皆さんは、親身になってご解説して頂いてると思う今日この頃です。
こちらのサイトを宣伝するつもりは無いですが。w

龍神録プログラミングの館の
0~ 6 メインループで呼ぶ関数を制御してみよう
までを勉強したら、添付・貼り付けさせて頂いたソースを含み
簡単なRPGができました。

Dixqさんが最初の頃に作成されたプログラム(何処かのページでおっしゃってましたが)
最初は、スパゲティコードで何万行?にもなってました。
と言ってましたが、最初はスパゲティでも動けば良いのではないかと思います。

そこで味が足りなければ、タバスコをかけたり粉チーズかけたりしてケチャップとか追加して
レベルアップしていけば良いのではないかと思います。

PS:私、また変な事言ってます?---顔文字削除しました---

---編集・追記---
解決後の書き込み、すみません。
相変わらず、確認不足ですみませんでした。
聞くだけの私でも出来たのですから、ABSさんにもできると思います。
無理せずマイペースでがんばるのが、良いかと思います。
以上、長い割りに何のメリットの無い私のコメントでした。www
私もアップさせて頂いたファイルを削除させて頂きますね。
失礼します。

---上から、すみません。---
自分で作ったスパゲティを食べて、味わい吟味しながら
中途半端でも、スパゲティを他人に味わってもらって意見を聞く事が、レベルアップになると思うんです。^^
なんちゃって。w
文字化けの確認ありがとうございました。
次に質問される時は、ABSさんはレベルアップしてると思うので
私には、解説できないかもしれませんね。^^ 画像

Re:メモリ使用量が増大する? 関数呼び出しと描画

Posted: 2010年6月22日(火) 22:43
by ABS
>>ムンバさん

はい、励ましありがとうございます!
スパゲティがまだ出来上がってないので、レベルアップは難しそうです。

あ、すいません。文字化けはしてませんでした。
コードも全て拝見させて頂きました。
顔文字は文字化けしてません。

分らないことがあったらまたスレッドを立てると思うのでよろしくお願いします。