トップページ > 過去ログ > 記事閲覧
処理落ち(?)のような症状
名前:朧火 日時: 2008/05/29 20:33

只今シューティングゲームを作っているのですが、実行した時に2〜3秒の間隔でカクカクした動作に(一瞬だけ動作が止まる感じ)になってしまいます。 とあるサイトからソースとプロジェクトをDLさせてもらい実行したのですが同じ症状が出てしまいます。 家のPCがおかしいのかと思い学校でもやってみましたが結果は同じでした。 どうすれば直るでしょうか?

Page: 1 |

Re: 処理落ち(?)のような症状 ( No.1 )
名前: 日時:2008/05/30 10:09

>>どうすれば直るでしょうか? さすがに処理が重いという情報だけで 分かる人はいないでしょう。。。 そういう質問をするならば、最低限どんな環境で どういうプログラムを動かしたかくらい書かないと 前者はDXライブラリが出力するログでも良いと 思います。
Re: 処理落ち(?)のような症状 ( No.2 )
名前:SweetBlack 日時:2008/05/30 10:37

私を含めた他のDXライブラリを使ってる人達に同様の現象が起こってない以上、 プログラムかPC環境に問題があるとみるのが普通でしょう。 参考になるかどうかは判りませんが、 私もある時を境に処理落ちをするようになった事があります。 朧火さんのように「2、3秒間隔でカクカクする」のではなく、 「1分間のうち、5回ほど1秒間隔でカクカクする」というものでした。 ”ある時を境に”といいましたが、その”ある時”の条件は覚えてません。 が、多分変なものをインストールしたかなにかだと思ってます。 ウィルスとかスパイウェアとかを疑って色々調べましたが結局改善はしませんでした。 最終的にHDDの故障をキッカケとしてOSの再インストールをした以降 現象はおこってませんので、やはり何か変なものをインストールしたせいだと思っています。 朧火さんのご自宅のPCと学校のPCとが同じ環境になってる可能性もありますので、 それ以外、つまり自分が日常的に使っていないPCで試してみた方がいいかもしれません。
Re: 処理落ち(?)のような症状 ( No.3 )
名前:朧火 日時:2008/05/30 13:22

失礼しました^^; 使用しているPCはWindowsXPでコンパイラはMicrosoft Visual Studio 2008です。 とりあえず学校で実行した際のログを張ります。 0:システムの情報を出力します 219: DXライブラリ Ver2.24b 219: OS WindowsXP ( Build 2600 Service Pack 2 ) 334: CPU動作速度:大体2.76GHz 341: MMX命令を使用します 346: CPUベンダ:GenuineIntel 376: CPU名: Intel(R) Pentium(R) 4 CPU 3.60GHz 382:COMの初期化... 成功しました 399:メモリ総量:1022.07MB 空きメモリ領域:597.00MB 404:タイマーの精度を検査します 411:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 418: パフォーマンスカウンターを使用します タイマー分解能 : 3591150.000000 KHz 431: ソフトの二重起動検査... 二重起動はされていませんでした 447:ウインドウクラスを登録します... 登録に成功しました 459:ウインドウモード起動用のウインドウを作成します 506:IMEを無効にしました 711:ウインドウスタイルをウインドウモード用に変更します... 完了 724:DirectInput関係初期化処理 729: DirectInput7 の取得中... 成功 753: 引き続き初期化処理... 初期化成功 768: ジョイパッドの初期化... 775: ジョイパッドの初期化は正常に終了しました 781: マウスデバイスの初期化... 初期化成功 794: キーボードデバイスの初期化... 初期化成功 810:DirectInput 関連の初期化は正常に終了しました 816:DirectSound の初期化を行います 823:DirectSound インターフェースの取得を行います.... 成功 837:引き続きインターフェースの初期化処理... 成功 920: DirectSound デバイスを列挙します 929: モジュール名: ドライバ記述:プライマリ サウンド ドライバ 934: モジュール名: smwdm.sys ドライバ記述:SoundMAX Digital Audio 940: 最大サンプリングレート:192.00KHz 最小サンプリングレート:0.10KHz 952: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 959: 利用可能サンプリング精度 964: プライマリ 16bit = OK 8bit = OK 970: セカンダリ 16bit = OK 8bit = OK 977: 利用可能チャンネル 982: プライマリ MONO = OK STEREO = OK 987: セカンダリ MONO = OK STEREO = OK 994:DirectSound の初期化は正常に終了しました 1001:DirectDraw 関連の初期化を行います 1007: DirectDraw オブジェクトの取得を行います.... 成功 1021: 引き続き初期化処理... 初期化に成功しました 1137: ビデオカードの情報 1143: 画面モード変更処理を開始します 1210: 画面モードの変更処理を開始します 640 x 480 16 bit 1217: ウインドウモードにします 1224: 画面モードの変更は正常に終了しました 1229: カラー情報 1236: A:00000000 B:0000f800 G:000007e0 B:0000001f 1244: ウインドウスタイルをウインドウモード用に変更します... 完了 1256: 出力画面用の DirectDrawSurface を作成します 1278: 各スクリーンメモリの配置位置 1285: PrimaryBuffer : VIDEOMEMORY 1291: BaskBuffer : VIDEOMEMORY 1297: 出力画面用の DirectDrawSurface の作成は正常に終了しました 1305: Direct3D 関連の初期化を行います 1313: Direct3Dオブジェクトを取得します 1319: Direct3Dオブジェクトを取得しました 1326: 3Dデバイスを作成します... 3Dデバイスの作成に成功しました 1345: テクスチャ最大幅:2048 最小幅:1 1351: 描画制限: D_D3DPTEXTURECAPS_POW2 = 1 D_D3DPTEXTURECAPS_SQUAREONLY = 0 1356: テクスチャピクセルフォーマット 1364: 通常グラフィック用 1372: BIT:16 RED:5 GREEN:6 BLUE:5 1378: RED:00f800 GREEN:0007e0 BLUE:00001f 1384: BIT:32 RED:8 GREEN:8 BLUE:8 1392: RED:ff0000 GREEN:00ff00 BLUE:0000ff 1398: アルファチャンネル付きグラフィック用 1404: BIT:16 ALPHA:4 RED:4 GREEN:4 BLUE:4 1410: ALPHA:0000f000 RED:00000f00 GREEN:000000f0 BLUE:0000000f 1418: BIT:32 ALPHA:8 RED:8 GREEN:8 BLUE:8 1425: ALPHA:ff000000 RED:00ff0000 GREEN:0000ff00 BLUE:000000ff 1431: Direct3D 関連の初期化は正常に終了しました 1437: グラフィック管理系の初期化を行います 1445: 3Dグラフィック描画機能を使用します 1452: フォントの初期化を行います 1462: フォントの初期化は正常に終了しました 1468: グラフィック管理系の初期化は正常に終了しました 1493: サーフェス間転送には BitBlt を使用します 1501: BitBlt:7231μs BltFast:8071μs 1507: スキャンラインの数:768 1646: 1フレーム当たりの時間は 17 msecです 1652: Tri00:18 msec 1660: Tri01:16 msec 1666: Tri02:17 msec 1672: Tri03:17 msec 1679: 画面モード変更処理は正常に終了しました 1688: オーバーレイサーフェスを使用します    UYVY 1693: DirectDraw 関連の初期化は正常に終了しました 1699: 文字コードバッファの初期化を行います... 完了しました 20826: ウインドウを閉じようとしています 21055: ウインドウが破棄されようとしています 21061: ソフトを終了する準備が整いました 21067: DirectDraw 関連の終了処理をおこないます 21081: フォントの初期化を行います 21090: フォントの初期化は正常に終了しました 21096: グラフィック管理系の終了処理は正常に終了しました 21103: Direct3D 関連の終了処理を行います 21211: 3Dデバイスの削除は正常に終了しました 21219: Direct3D 関連の終了処理は正常に終了しました 21225: メインサーフェスを破棄をします... 完了しました 21230: DirectDrawオブジェクトを解放します 21338: DirectDrawオブジェクトを解放しました 21344: DirectDraw 関連の終了処理は正常に終了しました 21349: DirectInput 関連の終了処理... 完了 21366: DirectSound の終了処理は正常に終了しました 21374: 21380: Alloc memory dump Total size:0(0.000kb) Alloc num:0 21392:
Re: 処理落ち(?)のような症状 ( No.4 )
名前:朧火 日時:2008/05/30 13:52

関係ありそうなプログラムを・・・ プレイヤー関係↓  /* player.cpp */ #include "DxLib.h" #include "ExternGV.h" void PlayerControl(){ if(Key[KEY_INPUT_LEFT]==1){ Player.x-=4.0f; if(Player.x<10) Player.x=10; } if(Key[KEY_INPUT_RIGHT]==1){ Player.x+=4.0f; if(Player.x>578) Player.x=578; } if(Key[KEY_INPUT_UP]==1){ Player.y-=4.0f; if(Player.y<10) Player.y=10; } if(Key[KEY_INPUT_DOWN]==1){ Player.y+=4.0f; if(Player.y>324) Player.y=324; } DrawGraph((int)Player.x,(int)Player.y,img_player,TRUE); DrawCircle ( Player.x+35 , Player.y+28 , 2 , GetColor(255,0,0) ) ;//中心点を描画 } void PlayerShotCalc(){ int j,i; if(Key[KEY_INPUT_Z]==1 && counter%4==0){ int positionx[7]={0,-5,-5,-10,-10,-15,-15},positiony[7]={0,-20,20,-30,30,-40,40}; for(i=0;i<ShotLevel;i++){ for(j=0;j<PLAYER_MAX_SHOT1;j++){ if(PlayerShot[j][i].flag==0){ PlayerShot[j][i].flag=1; PlayerShot[j][i].x=Player.x+(double)positionx[i]; PlayerShot[j][i].y=Player.y+(double)positiony[i]; if(CheckSoundMem(sound_player_shot[0])==0) //現在ショット音が再生されていなければ PlaySoundMem(sound_player_shot[0],DX_PLAYTYPE_BACK); //ショット音を再生する break; } } } } int sab[7]={0,-1,1,-2,2,-3,3}; for(i=0;i<PLAYER_MAX_SHOT2;i++){ for(j=0;j<PLAYER_MAX_SHOT1;j++){ if(PlayerShot[j][i].flag==1) PlayerShot[j][i].x+=15; PlayerShot[j][i].y+=(double)sab[i]; if(PlayerShot[j][i].x>660) PlayerShot[j][i].flag=0; if(PlayerShot[j][i].y>520) PlayerShot[j][i].flag=0; if(PlayerShot[j][i].y<-40) PlayerShot[j][i].flag=0; } } if(Key[KEY_INPUT_X]==1 && counter%4==0){ PlayerShot2[j][i].flag=1; PlayerShot2[j][i].x=Player.x; PlayerShot2[j][i].y=Player.y; } if(Key[KEY_INPUT_X]==0) PlayerShot2[j][i].flag=0; if(Key[KEY_INPUT_C]==1 && counter%4==0){ PlayerShot3.flag=1; } if(Key[KEY_INPUT_C]==0) PlayerShot3.flag=0; } void PlayerShotDisp(){ DrawGraph((int)Player.x+8,(int)Player.y-25,img_player_shot[3],TRUE); DrawGraph((int)Player.x+8,(int)Player.y+55,img_player_shot[3],TRUE); int j,i; for(j=0;j<PLAYER_MAX_SHOT1;j++){ for(i=0;i<PLAYER_MAX_SHOT2;i++){ if(PlayerShot[j][i].flag==1){ switch(i){ case 0: DrawGraph((int)PlayerShot[j][i].x+30,(int)PlayerShot[j][i].y+7,img_player_shot[0],TRUE); break; default: DrawGraph((int)PlayerShot[j][i].x+30,(int)PlayerShot[j][i].y+15,img_player_shot[1],TRUE); break; } } } } if(PlayerShot2[j][i].flag==1){ DrawGraph((int)Player.x+16,Player.y-25,img_player_shot[2],TRUE); DrawGraph((int)Player.x+16,Player.y+55,img_player_shot[2],TRUE); } DrawRotaGraph2 ( Player.x+35 , Player.y+28 , 8 , 76 , 1.0 , (double)Player.count*0.05 , img_player_shot[3] , TRUE ) ;//回転描画 DrawRotaGraph2 ( Player.x+35 , Player.y+28 , 8 , -60 , 1.0 , (double)Player.count*0.05 , img_player_shot[3] , TRUE ) ;//回転描画 DrawRotaGraph2 ( Player.x+35 , Player.y+28 , 76 , 8 , 1.0 , (double)Player.count*0.05 , img_player_shot[8] , TRUE ) ;//回転描画 DrawRotaGraph2 ( Player.x+35 , Player.y+28 , -60 , 8 , 1.0 , (double)Player.count*0.05 , img_player_shot[8] , TRUE ) ;//回転描画 if(PlayerShot3.flag==1){ DrawRotaGraph2 ( Player.x+35 , Player.y+28 , 8 , 164 , 1.0 , (double)Player.count*0.05 , img_player_shot[4] , TRUE ) ; DrawRotaGraph2 ( Player.x+35 , Player.y+28 , 8 , -68 , 1.0 , (double)Player.count*0.05 , img_player_shot[5] , TRUE ) ; DrawRotaGraph2 ( Player.x+35 , Player.y+28 , 164 , 8 , 1.0 , (double)Player.count*0.05 , img_player_shot[6] , TRUE ) ; DrawRotaGraph2 ( Player.x+35 , Player.y+28 , -68 , 8 , 1.0 , (double)Player.count*0.05 , img_player_shot[7] , TRUE ) ; } Player.count++; } 背景関係↓ /* background.cpp */ #include "DxLib.h" #include "ExternGV.h" void Background(){ BackGround[1].x=BackGround[1].x-2.0; BackGround[2].x=BackGround[2].x-2.0; if (BackGround[1].x+320<-320){ BackGround[1].x=BackGround[2].x+640; } if (BackGround[2].x+320<-320){ BackGround[2].x=BackGround[1].x+640; } DrawGraph(BackGround[1].x,0,img_background[0],FALSE); DrawGraph(BackGround[2].x,0,img_background[1],FALSE); } void BackGround2(){ DrawGraph(0,0,img_waku[0],TRUE); } 敵関係↓ /* enemy.cpp */ #include "DxLib.h" #include "ExternGV.h" #include <math.h> #define PI 3.141593 void EnemyPattern1(int i){ enemy[i].x-=3.0f; } void EnemyPattern2(int i){ if(enemy[i].counter<50) enemy[i].x-=4.0f; if(enemy[i].counter>100) enemy[i].x+=4.0f; } void EnemyPattern3(int i){ enemy[i].y+=sin(PI*enemy[i].counter/40.0f)*5.0f; enemy[i].x-=3.0f; } void EnemyPattern4(int i){ if(enemy[i].counter<100) enemy[i].x-=3.0f; if(enemy[i].counter>=100){ enemy[i].y+=sin(PI*(enemy[i].counter-100.0f)/160.0f)*2.5f; enemy[i].x-=sin(PI*(enemy[i].counter-20.0f )/160.0f)*2.5f; } } void EnemyControl(){ for(int i=0;i<100;i++) if(enemy[i].flag==1){ if(enemy[i].pattern==1) EnemyPattern1(i); if(enemy[i].pattern==2) EnemyPattern2(i); if(enemy[i].pattern==3) EnemyPattern3(i); if(enemy[i].pattern==4) EnemyPattern4(i); } } void EnemyCalcDisp(){ int i; for(i=0;i<100;i++) if(enemy[i].flag==0) break; switch(counter){ case 50: enemy[i].flag=1; enemy[i].counter=0; enemy[i].pattern=1; enemy[i].size=0.5f; enemy[i].x=650.0; enemy[i].y=120.0; break; case 200: enemy[i].pattern=2; enemy[i].flag=1; enemy[i].counter=0; enemy[i].size=0.5f; enemy[i].x=650.0; enemy[i].y=160.0; break; case 350: enemy[i].pattern=3; enemy[i].flag=1; enemy[i].counter=0; enemy[i].size=0.5f; enemy[i].x=650.0; enemy[i].y=200.0; break; case 500: enemy[i].pattern=4; enemy[i].flag=1; enemy[i].counter=0; enemy[i].size=0.5f; enemy[i].x=650.0; enemy[i].y=120.0; break; default: break; } for(i=0;i<100;i++){ if(enemy[i].flag==1){ enemy[i].counter++; int enemy_img[2]={0,1}; DrawRotaGraph( (int)enemy[i].x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[enemy_img[counter%32/16]] , TRUE ) ; if(enemy[i].x<0.0-MONSTER1_X_SIZE/2.0*enemy[i].size || enemy[i].x>651.0+MONSTER1_X_SIZE/2.0*enemy[i].size || enemy[i].y<0.0-MONSTER1_Y_SIZE/2.0*enemy[i].size || enemy[i].y>644.0-MONSTER1_Y_SIZE/2.0*enemy[i].size) enemy[i].flag=0; } } } fps関係↓ /* fps.cpp */ #include "DxLib.h" #include "ExternGV.h" void FpsTimeFanction(){ static int FpsTime[2]={0,},FpsTime_i=0; static double Fps=0.0; if(FpsTime_i== 0) FpsTime[0]=GetNowCount(); if(FpsTime_i==49){ FpsTime[1]=GetNowCount(); Fps = 1000.0f / ((FpsTime[1] - FpsTime[0]) / 50.0f); FpsTime_i=0; } else FpsTime_i++; if(Fps != 0) DrawFormatString(565,0,color_brack,"FPS %.1f",Fps); //fpsを表示 return; } /* main.cpp */ #include "DxLib.h" #include "GlobalVariable.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ extern void img_sound_load(); extern void initialization(); extern void SetColor(); extern void Background();     extern void BackGround2(); extern void PlayerShotCalc(); extern void PlayerShotDisp(); extern void PlayerControl();      extern void EnemyControl(); extern void EnemyCalcDisp(); extern void FpsTimeFanction();     extern void Font();     extern void wait_fanc(); int RefreshTime=0; ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ) ; //裏画面を使用する。 img_sound_load(); initialization(); SetColor(); while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0){ RefreshTime = GetNowCount(); //今の時間を取得 ClearDrawScreen(); //裏画面のデータを全て削除 Background(); EnemyControl(); EnemyCalcDisp(); PlayerShotCalc(); PlayerShotDisp(); PlayerControl(); BackGround2(); FpsTimeFanction(); ScreenFlip() ; //裏画面データを表画面へ反映 counter++; if(Key[KEY_INPUT_ESCAPE]==1) break; while(GetNowCount() - RefreshTime < 17); } DxLib_End() ; return 0 ; } です。 自分がインストールしたものでは何が関係あるかさっぱりわからないので、 今度友人の家にいって試してみたいと思います。
Re: 処理落ち(?)のような症状 ( No.5 )
名前: 日時:2008/05/30 14:57

さっと見ただけですが、ぱっと見ではネックに なりそうな部分は無さそうなのですが、 気になったところをいくつか。 >> while(GetNowCount() - RefreshTime < 17); 上記の部分はテストコードでしょうか? リフレッシュレートが17未満の場合は 無限ループで待つようになっていますが、 ループの精度は環境によってまちまちなので、 正確にWatiできません。 #待つならWaitを使うほうが良いかと。
Re: 処理落ち(?)のような症状 ( No.6 )
名前:朧火 日時:2008/05/30 21:40

どうやら問題だったのはそこみたいです^^; その部分を失くすかWaitTimerに変えるとスムーズに動くようになりました。 しかし今度は、今までFPS60.0で表示されていたのが そこを変えるとFPS61.3と表示されるようになってしまいました。 テストコードかどうか・・・はよくわかりません、すいません。 C++はまだ初めてまもなく、プログラムは色々なサイトをまねて作って 理解できたところしか弄れてないので^^;

Page: 1 |