質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

3517閲覧

C言語(DXライブラリ)で、下記のソースを実行するとありえないほど重くなる

wilddown

総合スコア34

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2016/04/11 11:27

###前提・実現したいこと
C言語でプログラムを組んでいます。下記のソースを実行すると、ありえないほど重くなり、パソコン全体の動作が止まってしまいます。何故なのでしょうか?
いろいろ試しましたが、全く理由が分かりません。DXライブラリを使用しています。まだ初心者で無駄の多いプログラムですみません。
このサイトの利用は初めてで、不慣れな点も多いです。ご了承ください

###発生している問題

実行すると、ありえないぐらい重くなり、パソコン自体の動作が止まる

###該当のソースコード
C言語
#include <DxLib.h>

double u;
double d;
double myy = 300;
int sx;
int sx2;
int sx3;
int sx4;
int sy;
int sy1=600;
int sy2 = 600;
int sy3 = 600;
int sy4 = 600;
//ボタン
BOOL space = FALSE;
BOOL upstate = FALSE;

BOOL isakeytrigger(int key);

int WINAPI WinMain(HINSTANCE h1, HINSTANCE hP, LPSTR lpC, int nC){
ChangeWindowMode(TRUE);
SetGraphMode(800, 600, 32);
if (DxLib_Init() == -1) return -1;
SetDrawScreen(DX_SCREEN_BACK);
while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
int Pghandle = LoadGraph("media\smp1_chara01.png");
int Sghandle = LoadGraph("media\shougai.png");
int S2ghandle = LoadGraph("media\shougai2.png");
sx+=2;
sx2+=2;
sx3+=2;
sx4+=2;
if (CheckHitKey(KEY_INPUT_Z) == 1)sy += 5;

if (CheckHitKey(KEY_INPUT_X) == 1)sy -= 5; if (800 - sx > 500)sy1 = 600 - sy; if (800 - sx<500 && 1100 - sx>500)sy2 = 600 - sy; if (1100 - sx<500 && 1400 - sx>500)sy3 = 600 - sy; if (1400 - sx<500 && 1700 - sx>500)sy4 = 600 - sy; if (sy > 380)sy = 380; if (sy < 80)sy = 80; if (1700 - sx4 == 500)sx = 0; if (1700 - sx4 == 200)sx2 = 300; if (1700 - sx4 == -100)sx3 = 600; if (1700 - sx4 == -400)sx4 = 900; int key = GetJoypadInputState(DX_INPUT_KEY_PAD1); if (isakeytrigger(key) == TRUE){ space = TRUE; d = 0; } if (space == TRUE){ u += 0.2; myy -= u; if (u > 4){ upstate = TRUE; } if (upstate == TRUE) u -= 0.5; if (u < 0) { space = FALSE; upstate = FALSE; u = 0; } } if (space == FALSE)myy += d; ClearDrawScreen(); DrawGraph(200, myy, Pghandle, TRUE); DrawGraph(800-sx, sy1,Sghandle, TRUE); DrawGraph(800 - sx, sy1-700, S2ghandle, TRUE); DrawGraph(1100 - sx2, sy2, Sghandle, TRUE); DrawGraph(1100 - sx2, sy2 - 700, S2ghandle, TRUE); DrawGraph(1400 - sx3, sy3, Sghandle, TRUE); DrawGraph(1400 - sx3, sy3 - 700, S2ghandle, TRUE); DrawGraph(1700 - sx4, sy4, Sghandle, TRUE); DrawGraph(1700 - sx4, sy4 - 700, S2ghandle, TRUE); ScreenFlip(); } WaitKey(); DxLib_End(); return 0;

}

//キートリガー処理
BOOL isakeytrigger(int key){
if (CheckHitKey(KEY_INPUT_SPACE) == 1 && space == FALSE){
return TRUE;
}
if (space == TRUE)return FALSE;

d += 0.2; if (d > 10) d = 10; return FALSE;

}

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

int Pghandle = LoadGraph("media\smp1_chara01.png");
int Sghandle = LoadGraph("media\shougai.png");
int S2ghandle = LoadGraph("media\shougai2.png");

これが気になります。
DXライブラリは使ったことがないので具体的なことは判らないのですが、関数名からして画像ファイルを読み込んでそのハンドルを返しているのだと思いますが、whileループの中で毎回行っています。
おそらく、毎フレーム画像をメモリに読み込んでいるために消費メモリが増大し、物理メモリを使い切ってスワップしまくり状態で重くなっているのだと思います。

画像ファイルは1回読めば良いはずなので、上記LoadGraph関数呼び出し部分をループの前に実行してみてはどうでしょうか。

投稿2016/04/11 12:03

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wilddown

2016/04/11 12:07

おお!解決しました!意外と単純なことだったのですねw気を付けます!ありがとうございました!本当に助かりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問