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

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

ただいまの
回答率

89.63%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,694

wilddown

score 32

前提・実現したいこと

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/ツール等のバージョンなど)

より詳細な情報

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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 21:07

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

    キャンセル

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

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る