龍神録のメモリ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
りり

龍神録のメモリ

#1

投稿記事 by りり » 9年前

こんにちはC初心者です^^龍神録を参考にしています

1、1面から2面にステージを変えるときに、メイン関数のスイッチで飛んで
変数をロードすればいいと何処かに書いてあったので試行錯誤しています
一応ロードすれば2面がはじまって画像が変わったりしますが
ロードする時間がとても長い(5分くらい)感じです^^;
短くする方法を教えてください
LoadDivGraph( "../dat/img/enemy/4.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ;//敵画像追加
LoadDivGraph( "../dat/img/enemy/5.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[1] ) ;
LoadDivGraph( "../dat/img/enemy/6.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[2] ) ;
...
私は、上のように、snd_lord()を作ってロードするファイル名を1.png →4.pngのように変えてるだけです
変数のロードのやり方は 変数に新しい画像などのデータを代入するだけでしょうか?
ロード時間が長過ぎな気がするのですが、メモリ不足でしょうか
それとも変数のメモリの場所を探すのに時間が掛かっているのでしょうか
あと、メインキャラの画像データは同じなので変えないでいますが、
オプションの玉だけ消えたりよくわからない現象になります

2、それから、敵の種類を沢山出したくて
GV.hの配列
GLOBAL int img_enemy[3][9]; //キャラ数×敵画像9枚分
これを
GLOBAL int img_enemy[10][9]; //キャラ数×敵画像9枚分
のように変えて、敵の画像も10種類分ロードして、敵を出現させてみるのですが、
5種類目くらいの敵が出たところで固まってしまいます
メモリが不足しているのでしょうか? メモリ管理の事がよくわかりません

3、背景の画像を斜め上からの視点(俯瞰視点?)にしたいのですが、
どうすればよいですか?本など調べて行列の掛け算で出来る見たいな事がありますが、、、

アバター
パコネコ
記事: 139
登録日時: 10年前
住所: 大阪

Re: 龍神録のメモリ

#2

投稿記事 by パコネコ » 9年前

メモリは足りなくなる場合は画像のロードを何度も繰り返してると言うことがよくありましたが、
そういうところはありますか?

それとロードで5分はかかりすぎだと思うので何かミスをしていると思います。
最初にゲームをスタートした時にもそのぐらいかかっているなら話は別ですが・・・
そんなことないのなら一度画像を解放してからロードすればメモリが足りないとかは関係ないと思いますし・・・
本当にメモリが足りないかはわかりませんが、
ロードを行っている場所とそれを呼び出している個所(メインのスイッチ文あたり?)のプログラムをさらしていただけると、
問題の個所がわかるかもしれません。

敵が出ていたところでフリーズっていうのがまた変な気がします。
みないことにはまったくわかりませんが・・・
(みてもわからなかったりして・・・)

3は残念ながらわかりません。
ニャン!!\(゜ロ\)(/ロ゜)/

アバター
kimuchi
記事: 163
登録日時: 9年前
住所: 東京

Re: 龍神録のメモリ

#3

投稿記事 by kimuchi » 9年前

メモリについてですが、タスクマネージャ等で確認してみてはいかがでしょうか?
パコネコさんの仰るように画像のロードを繰り返していればみるみるうちに使用メモリが増えていくのが分かります。
あと、メインキャラの画像データは同じなので変えないでいますが、
オプションの玉だけ消えたりよくわからない現象になります
私の場合同様の現象が起きた時はバッファオーバーフローが原因でした。
もう少し、バグが発生していそうなコードを掲示して下さいませんか?

りり

Re: 龍神録のメモリ

#4

投稿記事 by りり » 9年前

レスありがとうございます^^
>一度画像を解放してからロードすればメモリが足りないとかは関係ないと思いますし

開放してません!^^;これが原因?
画像を開放とはどういう意味でしょう・・・

開放せずに既存の配列への代入だから遅いのでしょうか?
開放するということは配列を作り直す?
関数は動的な開放free()を使う?

初心者なもので初歩な?が多杉^^;

アバター
パコネコ
記事: 139
登録日時: 10年前
住所: 大阪

Re: 龍神録のメモリ

#5

投稿記事 by パコネコ » 9年前

この場合メモリが足りてないのが問題だと仮定すると、

コード:

宣言 int DeleteGraph( int GrHandle ) ; 
概略 指定のグラフィックをメモリ上から削除する
引数 GrHandle : メモリ上から削除したいグラフィックのハンドル 
戻り値  0:成功 
  -1:エラー発生
解説  GrHandleで指定されたハンドルのグラフィックをメモリ上から 削除します。これによって使えるメモリの量を増やす事が出来ます。
 当然ですが削除したグラフィックは再度ロード等しない限り 使用できなくなります。
というものがあります。

ちなみに普通にロードしたほうが早いです。
(メモリ放置だけど・・・)

やっぱり何が原因なのかわからないので、
コードを張っていただけませんか?
(ロード部分とロードを呼ぶ部分)
ニャン!!\(゜ロ\)(/ロ゜)/

りり

Re: 龍神録のメモリ

#6

投稿記事 by りり » 9年前

>コードを張っていただけませんか?
>(ロード部分とロードを呼ぶ部分)
main()はスイッチさせて
スイッチ101~103は支館にあったラノベとかコンティニュ入用で104は未使用

以下ソース
if(stage_count>boss.appear_count[1]){ //ボスアピアカウント
SetDrawBright(Bright,Bright,Bright);//明るさ切り替え
Bright-=1; //BRIGHT255から黒へ
if(Bright<=0)
func_state=105;//クリア画面を表示させる場所へ移動
}
case 105: //クリア画面を表示
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
DrawString(0, 200,"クリア!!!",GetColor(255,255,255));
if(CheckStatePad(configpad.shot )==1)
func_state=106; //Zキーを押されたら読み込み。
break;

case 106: //よみこみ
StopSoundMem(area.bgm.handle);//追加
delete_bgm();//追加
area.bgm.flag=0;
snd_ini();
load_story();
func_state=100;
break;

snd_ini()は丸々最初のini()のコピーで作って変えたとこは
stage_count=1;にするのと
//ch.power=400;//初期パワー(41)
//ch.num=5;//初期残機数(41)
この辺をコメントアウトにして削っただけ;

snd_load()はボード(背景)とボスと敵の画像を変えただけです
void snd_load(){
int t;
SetCreateSoundDataType( DX_SOUNDDATATYPE_MEMPRESS ) ;
t=GetNowCount();
img_board[10] = LoadGraph("../dat/img/board/10.png");
img_board[11] = LoadGraph("../dat/img/board/11.png");
img_board[12] = LoadGraph("../dat/img/board/12.png");
img_board[20] = LoadGraph("../dat/img/board/20.png");//ボード
LoadDivGraph( "../dat/img/char/boss2.png" , 8 , 8 , 1 , 100 , 100 , img_dot_riria ) ;//ボス画像追加
LoadDivGraph( "../dat/img/enemy/4.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ;//敵画像追加
LoadDivGraph( "../dat/img/enemy/5.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[1] ) ;
LoadDivGraph( "../dat/img/enemy/6.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[2] ) ;
}

アバター
kimuchi
記事: 163
登録日時: 9年前
住所: 東京

Re: 龍神録のメモリ

#7

投稿記事 by kimuchi » 9年前

コードはcodeタグで囲っていただけると助かります。

if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
この行の特に「DxLib_Init()」ですが、
「龍神録プログラミングの館」さん通りなら、最初にこのDXライブラリ初期化処理をしているはずなので、この行は必要ありません。むしろ一度しか呼んではいけなかったはずです。

りり

Re: 龍神録のメモリ

#8

投稿記事 by りり » 9年前

お答えありがとうございましたn^^

if(DxLib_Init() 、、、の1行早速削除しました、その行はこの掲示板で見かけたものを使ってました^^;
その行を除いても暗くフェードしていくみたい
開放はよくわかりませnorz
遅くなる原因はロードストーリーとかも関係ありますか?
画像の開放の仕方?が判れば先に進めるかもしれませぬ~

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 10年前
住所: 北海道札幌市
連絡を取る:

Re: 龍神録のメモリ

#9

投稿記事 by Dixq (管理人) » 9年前

ロードは5秒でも長すぎると思いますが、5分って考えられないくらい長いですね。
kimuchiさんが仰るようにメモリ量確認してみました?
ロード前とロード後はいくら変わっているでしょうか。

後、Sleep関数等を使用して待機する処理はFPS制御部以外にありますか?
それと、5分も関数から返ってこないというのは考えにくいです。
もしかしたら表示されていないだけかもしれません。
メインループ部にブレイクポイントを付けて本当にループ部に返ってきていないか確認して見て下さい。

アバター
kimuchi
記事: 163
登録日時: 9年前
住所: 東京

Re: 龍神録のメモリ

#10

投稿記事 by kimuchi » 9年前

りりさんのパソコンにはメモリがどれくらいありますか?
足りない、ということは考えにくいですが念のためにお願いします。
(先日の投稿の内容ですが、タスクマネージャでメモリの状態も確認していただけましたか?
現段階では原因がメモリかどうかもわかりませんので・・・)

あと、snd_load()を呼んでいる部分も掲載していただけますか?
画像の開放についてですが、開放しないことの問題より、
何度も同じ画像のロードを繰り返してしまっている問題があるという可能性の方を強調しておきます。
開放が必要になるほど画像を読み込むことはほとんどないと思います。

最後に、
1、1面から2面にステージを変えるときに、メイン関数のスイッチで飛んで
変数をロードすればいいと何処かに書いてあったので試行錯誤しています
一応ロードすれば2面がはじまって画像が変わったりしますが
ロードする時間がとても長い(5分くらい)感じです^^;
短くする方法を教えてください
と、ありますが、プログラムを起動したときのロードは問題ない(ロードが早い)のでしょうか?

質問ばかりですがよろしくお願いします。

りり

Re: 龍神録のメモリ

#11

投稿記事 by りり » 9年前

コード:

//ゲームの初期化 2面
void snd_ini(){
Ini3Dbackground_snd();//(60)
stage_count=1;

memset(&ch,0,sizeof(ch_t));
memset(enemy,0,sizeof(enemy_t)*ENEMY_MAX);
memset(lazer,0,sizeof(lazer_t)*LAZER_MAX);
memset(enemy_order,0,sizeof(enemy_order_t)*ENEMY_ORDER_MAX);
memset(shot,0,sizeof(shot_t)*SHOT_MAX);
memset(cshot,0,sizeof(cshot_t)*CSHOT_MAX);
memset(effect,0,sizeof(effect_t)*EFFECT_MAX);
memset(del_effect,0,sizeof(del_effect_t)*DEL_EFFECT_MAX);
memset(&bom,0,sizeof(bom_t));
memset(&bright_set,0,sizeof(bright_set_t));
memset(&dn,0,sizeof(dn_t));
memset(&boss,0,sizeof(boss_t));
memset(child,0,sizeof(child_t)*CHILD_MAX);
memset(&stage_title,0,sizeof(stage_title_t));
memset(item,0,sizeof(item_t)*ITEM_MAX);
memset(&area,0,sizeof(area_t));//(48)
memset(option_bb,0,sizeof(option_bb_t)*2);//(49)

	ch.x=FMX/2;
	ch.y=FMY*3/4;
	//ch.power=400;//初期パワー(41)
	//ch.num=5;//初期残機数(41)

	/*弾幕それぞれの設定。後々きちんと設定しましょう。*/
	boss.appear_count[0]=1700;//中ボスが出現する時刻(42)
//	boss.appear_count[0]=50;//中ボスが出現する時刻(42)(47)(53)
	boss.appear_count[1]=2850;//最後ボスが出現する時刻(44)(47)

	boss.danmaku_num[0]=1;//中ボスが何個目までの弾幕を出すか
	boss.danmaku_num[1]=4;//最後に出るボスが何個目までの弾幕を出すか(47)

	for(int i=0;i<DANMAKU_MAX;i++){//弾幕それぞれのHP(47)
		boss.set_hp[i]=boss_hp[i];
	}
	boss.hp_max=boss.set_hp[0];
	for(int i=0;i<DANMAKU_MAX;i++)//弾幕それぞれの背景の種類
	boss.back_knd[i]=back_knd[i];
	///*ここまで*/

	area.bgm.flag=0;//音楽再生フラグを初期化(48)
	area.bgm.knd[0]=0;//通常BGMをどういうタイミングで再生するか、取り決めはmusic.cpp(48)
	area.bgm.knd[1]=0;//ボスBGMをどういうタイミングで再生するか、取り決めはmusic.cpp(48)
	area.bgm.loop_pos[0]=26672;//通常BGMのループ位置(48)
	area.bgm.loop_pos[1]=27010;//ボスBGMのループ位置(48)

	option_bb[0].img=img_cshot[2];//オプションボンボンの画像代入(49)
	option_bb[1].img=img_cshot[2];

	bright_set.brt=255;//初期輝度は最大
}
レス遅くなりました^^;
snd_iniはiniをコピペでsnd_lordを呼んでいます
何を削っておkかわからないので、ほとんど削っていませぬ;

>メモリがどれくらいありますか?
PCのメモリは1.0Gあります
でも
一面で3~4種類くらいしか敵出せないのは仕様?5種類目くらいで固まります

>後、Sleep関数等を使用して待機する処理はFPS制御部以外にありますか?
わかりませぬorz FPS制御?・・・・sleepを探せばおk?

>何度も同じ画像のロードを繰り返してしまっている問題があるという可能性
どうやってbreakすればおk?

>プログラムを起動したときのロードは問題ない(ロードが早い)のでしょうか?
問題ないです

アバター
kimuchi
記事: 163
登録日時: 9年前
住所: 東京

Re: 龍神録のメモリ

#12

投稿記事 by kimuchi » 9年前

少し前に投稿されたものについてですが、気になったことをいくつか申し上げます。

コード:

void snd_load(){
    int t;
    SetCreateSoundDataType( DX_SOUNDDATATYPE_MEMPRESS ) ;
    t=GetNowCount();
    img_board[10] = LoadGraph("../dat/img/board/10.png");
    img_board[11] = LoadGraph("../dat/img/board/11.png");
    img_board[12] = LoadGraph("../dat/img/board/12.png");
    img_board[20] = LoadGraph("../dat/img/board/20.png");//ボード
    LoadDivGraph( "../dat/img/char/boss2.png" , 8 , 8 , 1 , 100 , 100 , img_dot_riria ) ;//ボス画像追加
    LoadDivGraph( "../dat/img/enemy/4.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[0] ) ;//敵画像追加
    LoadDivGraph( "../dat/img/enemy/5.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[1] ) ;
    LoadDivGraph( "../dat/img/enemy/6.png" , 9 , 3 , 3 , 32 , 32 , img_enemy[2] ) ;
}
>>5~8行目
最初のロードでおそらくロード済みの画像だと思います。追加ロードであれば必要ない気がします。

>>9~12行目
読み込む配列の方ですが、既に一面で使用されているものにそのまま代入していらっしゃったのですね。
確かにロード前で一面の画像を解放する必要がありますね。すみません。
けれども、容量が大したことないので、ロード時間への影響はほとんどないと思います。

以下、返答です。
PCのメモリは1.0Gあります
でも
一面で3~4種類くらいしか敵出せないのは仕様?5種類目くらいで固まります
1.0G有ればおそらく問題ないと思います。
(こちらは512MBで「龍神録プログラミングの館」さんのコードを動作確認しています)
起動も問題ないようですので、やはり二面のロードに問題がありそうですね。
敵の種類の方の問題はメモリとは別にあるように思います。
わかりませぬorz FPS制御?・・・・sleepを探せばおk?
特に触られていないなら大丈夫だと思います。
Dixqさんの仰る通り、描画がされていないだけ、
というのは考えられますので、チェックされることをお勧めします。
snd_iniはiniをコピペでsnd_lordを呼んでいます
どうやってbreakすればおk?
snd_load()が見当たらないんですが・・・(^^;)
繰り返しというのも、この関数が何度も呼ばれますと
画像のロードが何度も行われてメモリを食い潰してしまうのはお分かりかと思います。
関数がある以上はコードの何処かで呼び出していますよね?
その部分を拝見したかったのです。


最後に、くどいようですがタスクマネージャでメモリの状態を確認して報告していただけませんか?
もし本当にメモリ不足であれば、これではっきりします。
逆にメモリに変化がなければ、別の可能性を考えなければならないので、お願いします。

りり

Re: 龍神録のメモリ

#13

投稿記事 by りり » 9年前

レスありがとうございます^0^
snd_lord()の呼んでいる場所main()でした><;

コード:

case 106: //よみこみ
StopSoundMem(area.bgm.handle);//追加
delete_bgm();//追加
area.bgm.flag=0;
snd_lord();//←ここにセカンドロード入れていますノシ
snd_ini();
load_story();
func_state=100;
break;
 
症状は
ボス倒した後通常処理case100この部分で、Z押したりX押したりしていると急に2面が始まります
始まる瞬間にクリア!!の文字が一瞬見えるので
ロードや、クリア画面の表示は一瞬で終わっているらし(ご指摘どおりメモリ不足じゃないらし?)
画面が黒くなって自分キャラが残っている?、急に2面の画面が出て、mobとかが沸いて
オプションの玉が消えているw

コード:

case 100://通常処理 
条件stage_count>boss.appear_count[1]
SetDrawBright(Bright,Bright,Bright);//明るさ切り替え
 Bright-=1; //BRIGHT255から黒へ
if(Bright<=0) 
func_state=105;//クリア画面を表示させる場所へ移動 
 
>タスクマネージャー
使い方で質問です
プロセスのメモリ(プライベートワーキングセット)を見る?
パフォーマンスのところにもメモリ 物理メモリの使用率の遍歴とありますがどこ見る?
教えてください(; ё;)

アバター
kimuchi
記事: 163
登録日時: 9年前
住所: 東京

Re: 龍神録のメモリ

#14

投稿記事 by kimuchi » 9年前

コード:

case 100://通常処理 
    条件stage_count>boss.appear_count[1]
    SetDrawBright(Bright,Bright,Bright);//明るさ切り替え
    Bright-=1; //BRIGHT255から黒へ
    if(Bright<=0) 
        func_state=105;//クリア画面を表示させる場所へ移動
    break;

case 105: //クリア画面を表示
    DrawString(0, 200,"クリア!!!",GetColor(255,255,255));
    if(CheckStatePad(configpad.shot )==1)
        func_state=106; //Zキーを押されたら読み込み。
    break;

case 106: //よみこみ
    StopSoundMem(area.bgm.handle);//追加
    delete_bgm();//追加
    area.bgm.flag=0;
    snd_lord();//←ここにセカンドロード入れていますノシ
    snd_ini();
    load_story();
    func_state=100;
    break;
「Bright」は2面移行時にちゃんと初期化されていますか?
クリア画面
→Zキー押す(「case 106」へ)
→2面のロード(「case 100」へ)
→「Bright」が初期化されていないと「Bright<=0」のままなので「func_state=105;」の処理(「case 105」へ)
→クリア画面
→エンドレス・・・

これによって「case 106」の「snd_lord()」も繰り返して、画像を多重ロードしてしまいます。
(つまりメモリが食い潰される)
画面が黒くなって

コード:

SetDrawBright(Bright,Bright,Bright);//明るさ切り替え
「Bright」が上に述べた通りなら、この命令によってそうなっている可能性が高いです。

また、

コード:

条件stage_count>boss.appear_count[1]
これは何ですか?
>タスクマネージャー
メモリ(プライベートワーキングセット)でOKです。
変化はどうでしたか?

りり

Re: 龍神録のメモリ

#15

投稿記事 by りり » 9年前

レス有難うございますノ^^
snd_ini()の最初にBright=255を追加したら、ロード速くなりました
タスクマネジャーでも増えてないみたいです

>1 条件stage_count>boss.appear_count[1]
最後ボスが出る時間が過ぎたら 暗くなり始める条件です

でも;
ロードは早くなりましたが
2面が始まる時に画面黒いまま、裏でゲーム始まっていて、MoBとか沸いてしまう;
Xを押す(ボムを撃つ)と画面が明るくなって画面表示されるらし
Sleepさせるのはこの辺のこと?
sleepのやり方教えてください(。。;)


あと、ノベル風会話を作りたいですが、CVS形式で会話を読み込むのは
支館さんのをつかっていますが、2面、3面、、会話を読み込む場合は、会話1.cvs 会話2.cvs 会話3.cvs
みたいにしてロードしたほうがいいですか?それとも
会話1.cvsの中に、2面、3面の会話なども書いて1つのファイルにまとめられますか?

アバター
kimuchi
記事: 163
登録日時: 9年前
住所: 東京

Re: 龍神録のメモリ

#16

投稿記事 by kimuchi » 9年前

ロードの問題は改善されたようですね!
2面が始まる時に画面黒いまま、裏でゲーム始まっていて、MoBとか沸いてしまう;
Xを押す(ボムを撃つ)と画面が明るくなって画面表示されるらし
「SetDrawBright(255,255,255);」を「snd_ini()」に追加してみて下さい。
ボムで明るくなるあたり、1面から2面移行時の輝度設定がそのままになっているのだと思います。

ちなみに「Sleep()」はスレッドを一定時間静止させるための物で、
スレッドの待機や処理落ちの再現、早すぎて見えない出力のチェックなどに使います。
以前出たのは、ロードを遅くする原因じゃないか、と疑われたものなのでもう関係ないかと思われます。
あと、ノベル風会話を作りたいですが、CVS形式で会話を読み込むのは
支館さんのをつかっていますが、2面、3面、、会話を読み込む場合は、会話1.cvs 会話2.cvs 会話3.cvs
みたいにしてロードしたほうがいいですか?それとも
会話1.cvsの中に、2面、3面の会話なども書いて1つのファイルにまとめられますか?
私の経験からいえば、「会話1.cvs 会話2.cvs 会話3.cvs」のように分割する方が無難かと思います。
まとめられないこともないでしょうが、
最初に全て読み込むか、ファイル位置を記憶して逐一読み込まなくてはならないので、
管理の面からみて不便です。逆に、目立ったメリットもないように思えます。

閉鎖

“C言語何でも質問掲示板” へ戻る