ページ 1 / 1
時間の取得について・・・
Posted: 2012年8月15日(水) 01:19
by 夢見がちな学生
すみません、さっそくお世話になります。自分の学習のためにもスレを連発するのはなるべく避けたいのですが、気になることがふたつあります。(どちらも本当に初歩の話で恥ずかしいのですが)
とりあえず現状の報告をさせていただきます。
前回私が立てたスレで、ソフト屋様からたくさんの課題、学習用サイトを紹介していただき、問題形式でプログラムを作ろうとしたところ、できないものばかりで、本や紹介していただいたサイトでCの勉強を改めてしている、といった段階です。龍神録やゲームプログラミングの館などで、コピペしながら(見ながら)「ふむふむ」と、わかっていたつもりでも実際はほんのすこし毛が生えた程度だったようです。
今、旧ゲームプログラミングの館にある、「時間の取得」の項目を見ないでコードを書こうとしているのですが、結果が、0ミリ秒だったり、1ミリだったり、かと思えば桁が大きくなってそれらしい数字になったりと、思い通りにならないのです(ブレークポイントを使うと結果が変わったり)。正解と見比べてもなかなか間違い、原因がつかめないのです。
原因は何が考えられるのでしょうか。よろしければヒントのようなものがほしいです。
コードを以下に貼らせていただきます
コード:
#include "DxLib.h"
int zikan();
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE);
if(DxLib_Init()!=0){
return -1;
}
zikan();
WaitKey();
DxLib_End();
return 0;
}
int zikan(){
int i,t,time,a=0;
t = GetNowCount();
for(i=0;i<100000;i++){
a++;
}
time= GetNowCount()-t;
DrawFormatString(250,0,GetColor(255,255,255),"%d",time);
return 0;
}
よろしくお願いいたします。
もうひとつ気になることがあるのですが、そちらのほうは後述させていただきます。
Re: 時間の取得について・・・
Posted: 2012年8月15日(水) 01:22
by h2so5
何の時間を測ろうとしているんですか?
Re: 時間の取得について・・・
Posted: 2012年8月15日(水) 01:26
by 夢見がちな学生
h2so5様、よろしくお願いします。
a++を10万回行う処理の時間をはかりたいのです
Re: 時間の取得について・・・
Posted: 2012年8月15日(水) 01:36
by h2so5
夢見がちな学生 さんの、「思い通り」とはどのような状態なのでしょうか?
Re: 時間の取得について・・・
Posted: 2012年8月15日(水) 01:46
by 夢見がちな学生
旧ゲームプログラミングの館八章の「時間を取得する」という項目のコードの結果のような、a++を十万回繰り返したときにかかる時間として妥当な数値がでてきてほしいのです。正直自分のパソコンで処理を行った場合の妥当な数値はどんな数値なのか把握できないのですが。
Re: 時間の取得について・・・
Posted: 2012年8月15日(水) 02:01
by Ryo
開発環境や、プログラムの実行時のビルド構成などは挙げられますか?
Re: 時間の取得について・・・
Posted: 2012年8月15日(水) 02:02
by h2so5
夢見がちな学生 さんが書きました:正直自分のパソコンで処理を行った場合の妥当な数値はどんな数値なのか把握できないのですが。
結果として出てきた0〜1ミリ秒くらいが妥当な数値とは考えられませんか?
Re: 時間の取得について・・・
Posted: 2012年8月15日(水) 02:15
by 夢見がちな学生
Ryo様、よろしくお願いします。
開発環境はwindows7、VC++2008EEです。申し訳ないのですが、ビルド構成とはどのようなものなのかわかりません。すみません。
h2so5様、申し訳ありません。そういうことかもしれません。なにやら勘違いをしていたのかも。ブレークポイントを使ったときに桁が増えていたのは変数の内容を確かめていた分の時間、ということなんでしょうか。
Re: 時間の取得について・・・
Posted: 2012年8月15日(水) 07:17
by beatle
まずWindowsやLinuxなどのマルチタスクOSにおいては、OSが複数のプログラムを高速に切り替えながら処理しているということを理解する必要があります。
a++を10万回行うのに「妥当な」数値が0〜1ミリ秒で、それを行なっている最中に他のプログラムに切り替わらないときにその時間を取得できているのかなと思います。
「桁が大きくなってそれらしい数字になった」ときは、きっと1回目と2回目のGetNowCountの間にプログラムが切り替わった(タスクスイッチが発生した)のだと、僕は想像しました。
コード:
for(i=0;i<100000;i++){
a++;
}
ただ、こんな単純なコードは(ビルド構成によっては)最適化されて、a = 100000; という代入文のようになってもまったくおかしくありません。
これを避け、本当に10万回インクリメントしたいなら、変数aをvolatile宣言する必要があります。
volatile宣言された変数は、本当にRAM上に確保され、さらに変数へのアクセスが最適化されなくなります。
Re: 時間の取得について・・・
Posted: 2012年8月15日(水) 07:20
by beatle
ちなみにビルド構成とは、典型的には Debug と Release の2種類ありまして、最適化する・しない、デバッグ情報を埋め込む・埋め込まない、などを選択することができるようになっています。
自分で細かくカスタマイズすることもできるはずですが、Visual C++ にははじめから2種類のデバッグ構成が組み込まれていますので、それら2つを使い分けるだけで当面は大丈夫でしょう。
Re: 時間の取得について・・・
Posted: 2012年8月15日(水) 12:52
by 夢見がちな学生
beatle様、ご回答ありがとうございました。
volatile宣言をしても結果は同じでした。最初から間違っていなかったようです(汗)
また、前述した「もうひとつ気になること」は自己解決できた(おそらく)と思います。
a++を十万回繰り返すのに、それこそ0ミリ~2ミリ秒でやってしまうのに、それだと新ゲームプログラミングの館の以下のコードの「x=x+2]もすさまじくはやく計算されてるはずなのに、FPSに合わせてキャラクターが秒間120進むのはなぜなんだ。という疑問だったのですが、
コード:
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode( TRUE );
DxLib_Init();
SetDrawScreen( DX_SCREEN_BACK );
int x = 0;
int Handle;
Handle = LoadGraph( "画像/キャラクタ01.png" );
while( 1 ){
if( ProcessMessage() != 0 ){
break;
}
ClearDrawScreen();
DrawGraph( x, 100, Handle, TRUE );
x = x + 2; // ここの部分
ScreenFlip();
}
DxLib_End();
return 0;
}
そのためのScreenFlip()でもあるんですね。
Re: 時間の取得について・・・
Posted: 2012年8月15日(水) 13:02
by softya(ソフト屋)
インデントが乱れてますね。インデントにはご注意ください。
あとインデントはTABがお勧めです。
ScreenFlip(); に関してはvsync同期(大抵1/60秒)がデフォルトですが自分で周期を制御する方法もあります。
それもゲームプログラミングの館にサンプルがあったはずです。
Re: 時間の取得について・・・
Posted: 2012年8月15日(水) 13:12
by 夢見がちな学生
ソフト屋様、ご回答ありがとうございます。
いままでインデントをあまり意識していなかったので、たまに忘れてしまいます。改善していきます。
自己制御の方法も見てみます。
今回も、ありがとうございました。
Re: 時間の取得について・・・
Posted: 2012年8月15日(水) 13:25
by softya(ソフト屋)
夢見がちな学生 さんが書きました:ソフト屋様、ご回答ありがとうございます。
いままでインデントをあまり意識していなかったので、たまに忘れてしまいます。改善していきます。
自己制御の方法も見てみます。
今回も、ありがとうございました。
ここでFPS制御と言えばISLeさんなのでサイトを紹介しておきます。
「処理落ちしても一定のFPS制御: ISLeのビデオゲーム工房」
http://isle.cocolog-nifty.com/blog/2011 ... -927b.html