C言語でのsleep機能について

このQ&Aのポイント
  • C言語でのsleep機能についての質問。
  • C言語で3Dゲームを作る際に、1秒間に画面を更新する回数を決める方法について知りたい。
  • 自作のsleep関数の精度と、Windowsで使えるsleep関数との比較について。
回答を見る
  • ベストアンサー

C言語でのsleep機能について

C言語でのsleep機能について  C言語で3Dゲームを作っている所です。今情報学科の大学1年でC言語歴は4年程度です。3Dゲームを作るのは初めてなのですが、普通ゲームって1秒間に何フレーム(fpsとか言ったかな?あまり詳しいことは知りません)というように、1秒間に画面を更新する回数って決めますよね?というより、決めないと早く更新しすぎてCPUが持たないですよね?  そこで、60フレームなら1/60秒間待って画面を更新する。というようにしたいのですが、「1/60秒待つ」というしっくりくる方法が、あまり見つかりません。いろいろ検索してwindowsで使えるsleep関数を見つけたのですが、家の環境はMacですし、なるべく多くのOSに対応するゲームを作りたいと思っています(最低Mac, Win, Linaxの3つぐらいは…)。  現在自分が用いている方法は、timerinit()という関数を自分で定義して、for分の1回のループにかかる時間を計測し(clock()を用いて)、その値を元にsleepf(double sec)という関数を定義し、sleepを行うようにしています。または、while分を用いてclock()をそのまま使ってsleepする方法をとっているときもあります。  これより良い方法って無いですか?あまりCPUなどは詳しくないですが、CPUとかが節約できるような方法があればとても嬉しいです。というより、自分が今やっている方法とWindowsで使えるsleep関数と比べると、やはり自分の方法のほうが精度が悪いのでしょうか?(CPUなどへの負担は大きいのでしょうか?)  長い質問になってしまいましたが、宜しくお願いします。 ちなみに… 【環境】MacOS 10.5 【エディタ】Xcode3.0 【言語】C言語(GLUTとOpenGLを使って3Dを描画しています) 【CPU】2GHz Intel Core 2 Duo 【メモリ】2G (CPUとメモリはこんなもんですが、もう少し性能の低いパソコンにも対応させたいかな?)

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

スリープはOSのシステムコールなので、マルチプラットホーム用のライブラリでもなければ共通で使うことのできる関数は存在しません。 なおビジーループでWaitするのは自プロセスだけでCPUを占有する、マルチタスクに対する悪行です。 1/60秒ごとにタイマー割り込み/イベントが発生するようにして、そのハンドラで処理した方が良いでしょう。

hira_kazu
質問者

お礼

>>なおビジーループでWaitするのは自プロセスだけでCPUを占有する、マルチタスクに対する悪口です。  やっぱり、そうですよね。意味も無いループを繰り返してWaitしても、なんか気持ち悪いと思っていました><  あまりタイマー割り込みイベント等の知識は無いのですが、また勉強してみます^^  回答ありがとうございました。

その他の回答 (3)

回答No.4

Unix系のsleepには、1秒毎のsleep()と、精度をナノ(?)に上げたnanosleep()の2つがあります。 質問は「1/60のsleepがしたい」とのことですので、nanosleep() を使うことになります。 その機能については、terminal から「man nanosleep」とすれば知ることができます。あるいは、Xcodeの「ヘルプ」でも良いでしょう。 http://www.linux.or.jp/JM/html/LDP_man-pages/man2/signal.2.html タイミング等の都合による sleep中のwakeupシグナルは、signalハンドラー登録後、kill()で強制的に起こしてやれば良いです。

回答No.3

ところで、ゲームの種類は? 画面の更新タイミングは、ジャンルによって違うと思いますよ。 あと、3Dゲームって作ったことありませんが、一定間隔ごとに画面更新するものなのですか? 2Dだと、表示内容に更新が発生したときに最後一括して更新していたものですが。 # ベンチマークは、秒間何回処理できるをはかるものなので # FPSが表示されているんじゃないかとちょっと思ってみたり(推測)

hira_kazu
質問者

お礼

 ゲームのジャンルはアクションです。詳しく言うとブロック崩しを作っているのですが、ボールは常に動いていますし、よくあるブロック崩しとちがって、ブロックも常に動いている(手前に前進してきている)状況です。  パズルゲーム等だったら、クリックされたときに更新などで、対応できそうなのですが><  でも、工夫すればWaitを掛けなくても良い方法もあるかもしれませんね。  回答ありがとうございました^^

  • tyatsumi
  • ベストアンサー率58% (30/51)
回答No.1

GLUTにglutTimerFunc()というのがあって、 指定した時間後に指定したコールバック関数が呼ばれるようです。 これを使えばどのOSでも同じように書けそうです。GLUTから離れられなくはなりますが。 試したことはないので、実用的なのかどうかは知りません。 ただ、こんな関数を見付けたので報告したところです。

hira_kazu
質問者

お礼

 GLUTにそんな関数があったんですね。  まさかGLUTの中にあるとは思っていなかったので、調べていませんでした><  ありがとうございます  また使ってみます^^

関連するQ&A

  • c言語でできること

    c言語は具体的には何ができるのでしょうか ものすごくがんばれば市販のゲームソフトなども作れるようになるのでしょうか というのは 今、僕はc言語のプログラミングを勉強しています コンパイルするとms-dosの黒い画面が表示されますよね。オセロなどのゲームはとても見にくいです。 あのようなゲームではなく、ちゃんと絵があるようなゲームは作れるのでしょうか?? また3Dのゲームはつくれるのでしょうか? 「c言語のゲーム」とググってもありません c言語だけではできなくてdirectxなどがいることは知っています。 プログラミングを学ぶ上でなにか目標ができたら それに向けてがんばれると思うので情報よろしくお願いします。 わかりにくい文章ですいません^^;

  • c言語プログラミングでの質問?です。

    学校でc言語プログラミングを使って簡単なゲームを作りなさい。 という課題が出ました。 下記の条件に沿って作れとのことです。 なかなかいいアイデアが浮かばないんですが、なにかちょうどいいものないですかね? ・scanf文を使うこと。。 ・if文を使うこと。 ・for文(while文)を使うこと。 ・rand関数を使うこと。 ・自分で定義した関数を使うこと。 ・配列または文字列を使うこと。

  • LinaxのC言語で100ミリ秒スリープさせたいのですが、どのような方法が良いでしょうか?

    LinaxのC言語で100ミリ秒スリープさせたいのですが、どのような方法が良いでしょうか? よろしくお願いします

  • 「INT86(・・・・・・);」 って何でしょう?(C言語)

    C言語のソースをみていると、その中に INT86(); という関数が出てきました。 しかし、ソースのどこを見ても その関数が定義されているところがありません。 ほかにIncludeされているファイルは Windows標準のヘッダーファイルだけでした。 そこで質問なのですが、 この「INT86()」というのは標準の関数なのでしょうか? ご回答お願いいたします。

  • 至急で、C言語の問題で解答解説お願いします。

    1実数を3つ(a,b,c)を読み込み3辺とする三角形ができるか判定(d(d-a)(d-b)(d-c)>0のとき三角形となる)しできなければ、三角形ではありません!というメッセージを表示し、できる場合は以下のヘロンの公式を用いて三角形の面積を求めるプログラムをC言語で答えてください。d=(a+b+c)/2 s=√{d(d-a)(d-b)(d-c) 2maxの整数値(≧1)をキーボードから入力し、その値に対応した図形を出力するプログラムをC言語で答えてください。 例 max1 max2 max3 * ** *** * ** *** * ** *** ** *** *** 3整数nをキーボード入力しnの値に応じて以下の図形を表示するプログラムをc言語で答えてください。 n=3 n=4 n=5 3 4 5 45 56 67 678 789 890 0123 1234 56789 4整数n(≧0)を入力し歯科の計算を実行するC言語プログラムを答えてください。2つの自然数nとmを読み込みn個の中からm個を取り出すときの組み合わせの数を計算せよ。ただし、n!を計算する関数long fact (int n)を定義し必ずそれを用いること。 5 1つのscanfで2つの10進数を入力し8進数と16進数で表示するプログラムをC言語で答えてください。 6 実数aを入力し少数第1位で四捨五入する関数g(a)をマクロ定義で入力した値の少数第1位を四捨五入して出力するプログラムをC言語で答えてください。 7 4つの実数w,x,y,zを読み込みその最大値を出力するプログラムをC言語で答えてください。ただし、2つの実数の大きいほうを求める関数 double my may (double x,double y)を定義し、その関数を用い、if文を用いないでc言語で答えてください。

  • objective-cにはCのような関数はない?

    c言語とobjective-cを並行して勉強しています。 c言語では機能をまとめるために関数を定義できますよね。 ----- void display(int a){ printf("%d" , a); } int main(void){ display(10); } --- これでdisplayという関数に10という引数を渡して表示させることができますよね? objective-cの場合は例えば以下のように書くことがわかり、コンパイルも通りました。 - (void)display{ NSlog(@" TEST "); } しかし・・・・呼び出すことができませんね。。。 objective-cの場合は[ インスタンス メソッド名 ]; のような呼び方なのですよね。 メソッドだけを呼び出すことはできない、ってことなのでしょうか・・・? 色々検索してみたのですが、 @implement~@endで囲んでクラスにして インスタンスを作って、メソッドを呼ぶ方法ばかりで、 上記のC言語の例のような、単純な関数定義→呼び出しの方法を見つけることができませんでした。 上記のようなC言語の例はよくあると思うのですが、 これと同じことがobjective-cで、できるともできないとも、書いてないように思います。 例えば上のc言語と同じ動作をobjective-c に移植するとどうなるのでしょうか・・・?というか、不可能、ということでしょうか・・・?

  • sleep()関数について

    "数秒おきに警報をn回鳴らすプログラム"をC言語で作成しようと 考えています。 プログラム実行環境はWindowsですが、 sleep()関数は使用できないのでしょうか?? 仮に使用できない場合、この関数に代わる関数や代替方法が あれば教えて頂けませんでしょうか? 宜しくお願いします。

  • C言語に関することについて教えてください

    学校の問題集にでてきた問題がわかりません、どうか教えてください 1 プログラムの役割、必要性について説明せよ 2 プログラムにおける変数と定数の役割を説明せよ。また、ローカル変数の有効な範囲について説明せよ。 3 C言語で使う変数が他について、宣言子と、printf関数、scanf関数それぞれにおいて対応する書式指定子を対応表にせよ。また、変数名を決める際に守るべき文法上の規則と、プログラマとして配慮すべき事項を説明せよ。 4 配列について、その役割と定義方法を説明せよ。 5 コンピュータにおける文字処理に必須なアスキーコードについて説明せよ。 6 C言語における文字列について、文字列定数、文字列変数を説明せよ。 7 C言語における繰り返し処理の文法(for,while,do~while)を、プログラムコード列を示して説明せよ。 8 C言語における条件判断の文法(if,else,else if)を、プログラム列を示して説明せよ。 9 繰り返し、条件判断において利用する論理式(等値演算子、関係演算子、論理演算子等で記迷する式)について、その記迷の方法を論理和、論理積も含めて説明せよ。 10 変数のアドレスについて説明せよ。また、ポインタについて、アドレスとの関連性を踏まえて、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 11 ポインタと配列の関係について、ポインタによる配列操作を列に説明せよ。 12 関数について、その役割と定義方法について説明せよ(戻りがた、関数名、引数リスト)。また、自作関数をそれらを利用するmain関数のプログラムコード例を示せ。 13 scanf関数の戻り値について、その内容を説明して、どのような際に利用すると便利か、プログラムコード例を示して説明せよ。 14 引数にポインタを利用する関数のプログラムコード例を示して、ポインタの必要性、重要性を説明せよ。 15 構造体について、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 16 ファイルポインタについて説明し、ファイル入出力の方法についてプログラムコード例を示して説明せよ。

  • C言語について。

    C言語プログラマとしては、スタートアップコードは・・・ ・自分が書いたプログラムを、直接動かすために必要なライブラリ ・それはコンパイル後、リンカによって追加されるライブラリこれは、 どういう意味でしょうか?分かりやすく教えていただけると幸いです。すみません。で、 以下のかぶくんまんさんの回答です。 https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11247611941 で、 C言語におけるプログラミングとは「main関数を書くこと」に他ならない。なぜ「main関数を書く」ことがC言語におけるプログラミングに他ならないのかと言えば、それは偏に「C言語のコンパイラはmain関数を呼び出すプログラムを生成するから」です。それがmain関数を求めるので結果的にmain関数がリンクされ、そしてmain関数が求めるままに他の関数もリンクされていくわけです。 で、その「main関数を呼び出すプログラム」こそが、C言語における「スタートアップコード」。 という回答で、main関数以降は、プログラマが書くのですよね?プログラマが関数をリンクさせる様なプログラムを書くということでしょうか?教えていただけると幸いです。すみません。 という所が分かりません。教えていただけると幸いです。すみません。以下のURL https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12247932542

  • MacでC言語を使いアプリケーションを作っています。

    前の質問でおかしな質問をしてしまったのでここで改めて質問します。 今、MacでWindowsのアプリケーションをつくろうとしています。しかし、Windows固有の関数をMacではどのように記述すればよいかが分からないので全然進みません。MacでC言語を解説しているページは少なく、Windows関数はMacでどうするのかといった解説はもちろんありません。Macにしようとしているアプリケーションはパワポケのパスメってやつで、プログラムの言語はC++言語です。 http://f1.aaa.livedoor.jp/~pasume/pass/pasume.htm 上のサイトの『PM_GB1 Ver1.0』というアプリケーションです

専門家に質問してみよう