時間の取得について・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
夢見がちな学生
記事: 11
登録日時: 13年前

時間の取得について・・・

#1

投稿記事 by 夢見がちな学生 » 13年前

すみません、さっそくお世話になります。自分の学習のためにもスレを連発するのはなるべく避けたいのですが、気になることがふたつあります。(どちらも本当に初歩の話で恥ずかしいのですが)

とりあえず現状の報告をさせていただきます。
前回私が立てたスレで、ソフト屋様からたくさんの課題、学習用サイトを紹介していただき、問題形式でプログラムを作ろうとしたところ、できないものばかりで、本や紹介していただいたサイトで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;
}


よろしくお願いいたします。
もうひとつ気になることがあるのですが、そちらのほうは後述させていただきます。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 時間の取得について・・・

#2

投稿記事 by h2so5 » 13年前

何の時間を測ろうとしているんですか?

夢見がちな学生
記事: 11
登録日時: 13年前

Re: 時間の取得について・・・

#3

投稿記事 by 夢見がちな学生 » 13年前

h2so5様、よろしくお願いします。

a++を10万回行う処理の時間をはかりたいのです

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 時間の取得について・・・

#4

投稿記事 by h2so5 » 13年前

夢見がちな学生 さんの、「思い通り」とはどのような状態なのでしょうか?

夢見がちな学生
記事: 11
登録日時: 13年前

Re: 時間の取得について・・・

#5

投稿記事 by 夢見がちな学生 » 13年前

旧ゲームプログラミングの館八章の「時間を取得する」という項目のコードの結果のような、a++を十万回繰り返したときにかかる時間として妥当な数値がでてきてほしいのです。正直自分のパソコンで処理を行った場合の妥当な数値はどんな数値なのか把握できないのですが。

Ryo

Re: 時間の取得について・・・

#6

投稿記事 by Ryo » 13年前

開発環境や、プログラムの実行時のビルド構成などは挙げられますか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 時間の取得について・・・

#7

投稿記事 by h2so5 » 13年前

夢見がちな学生 さんが書きました:正直自分のパソコンで処理を行った場合の妥当な数値はどんな数値なのか把握できないのですが。
結果として出てきた0〜1ミリ秒くらいが妥当な数値とは考えられませんか?

夢見がちな学生
記事: 11
登録日時: 13年前

Re: 時間の取得について・・・

#8

投稿記事 by 夢見がちな学生 » 13年前

Ryo様、よろしくお願いします。

開発環境はwindows7、VC++2008EEです。申し訳ないのですが、ビルド構成とはどのようなものなのかわかりません。すみません。

h2so5様、申し訳ありません。そういうことかもしれません。なにやら勘違いをしていたのかも。ブレークポイントを使ったときに桁が増えていたのは変数の内容を確かめていた分の時間、ということなんでしょうか。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 時間の取得について・・・

#9

投稿記事 by beatle » 13年前

まずWindowsやLinuxなどのマルチタスクOSにおいては、OSが複数のプログラムを高速に切り替えながら処理しているということを理解する必要があります。
a++を10万回行うのに「妥当な」数値が0〜1ミリ秒で、それを行なっている最中に他のプログラムに切り替わらないときにその時間を取得できているのかなと思います。
「桁が大きくなってそれらしい数字になった」ときは、きっと1回目と2回目のGetNowCountの間にプログラムが切り替わった(タスクスイッチが発生した)のだと、僕は想像しました。

コード:

        for(i=0;i<100000;i++){
            a++;
        }
ただ、こんな単純なコードは(ビルド構成によっては)最適化されて、a = 100000; という代入文のようになってもまったくおかしくありません。
これを避け、本当に10万回インクリメントしたいなら、変数aをvolatile宣言する必要があります。

コード:

volatile int a = 0;
volatile宣言された変数は、本当にRAM上に確保され、さらに変数へのアクセスが最適化されなくなります。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 時間の取得について・・・

#10

投稿記事 by beatle » 13年前

ちなみにビルド構成とは、典型的には Debug と Release の2種類ありまして、最適化する・しない、デバッグ情報を埋め込む・埋め込まない、などを選択することができるようになっています。
自分で細かくカスタマイズすることもできるはずですが、Visual C++ にははじめから2種類のデバッグ構成が組み込まれていますので、それら2つを使い分けるだけで当面は大丈夫でしょう。

夢見がちな学生
記事: 11
登録日時: 13年前

Re: 時間の取得について・・・

#11

投稿記事 by 夢見がちな学生 » 13年前

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()でもあるんですね。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 時間の取得について・・・

#12

投稿記事 by softya(ソフト屋) » 13年前

インデントが乱れてますね。インデントにはご注意ください。
あとインデントはTABがお勧めです。

ScreenFlip(); に関してはvsync同期(大抵1/60秒)がデフォルトですが自分で周期を制御する方法もあります。
それもゲームプログラミングの館にサンプルがあったはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

夢見がちな学生
記事: 11
登録日時: 13年前

Re: 時間の取得について・・・

#13

投稿記事 by 夢見がちな学生 » 13年前

ソフト屋様、ご回答ありがとうございます。
いままでインデントをあまり意識していなかったので、たまに忘れてしまいます。改善していきます。

自己制御の方法も見てみます。

今回も、ありがとうございました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 時間の取得について・・・

#14

投稿記事 by softya(ソフト屋) » 13年前

夢見がちな学生 さんが書きました:ソフト屋様、ご回答ありがとうございます。
いままでインデントをあまり意識していなかったので、たまに忘れてしまいます。改善していきます。

自己制御の方法も見てみます。

今回も、ありがとうございました。
ここでFPS制御と言えばISLeさんなのでサイトを紹介しておきます。
「処理落ちしても一定のFPS制御: ISLeのビデオゲーム工房」
http://isle.cocolog-nifty.com/blog/2011 ... -927b.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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