dポイントプレゼントキャンペーン実施中!

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とメモリはこんなもんですが、もう少し性能の低いパソコンにも対応させたいかな?)

A 回答 (4件)

スリープはOSのシステムコールなので、マルチプラットホーム用のライブラリでもなければ共通で使うことのできる関数は存在しません。



なおビジーループでWaitするのは自プロセスだけでCPUを占有する、マルチタスクに対する悪行です。
1/60秒ごとにタイマー割り込み/イベントが発生するようにして、そのハンドラで処理した方が良いでしょう。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/09/16 00:10

Unix系のsleepには、1秒毎のsleep()と、精度をナノ(?)に上げたnanosleep()の2つがあります。


質問は「1/60のsleepがしたい」とのことですので、nanosleep() を使うことになります。
その機能については、terminal から「man nanosleep」とすれば知ることができます。あるいは、Xcodeの「ヘルプ」でも良いでしょう。
http://www.linux.or.jp/JM/html/LDP_man-pages/man …

タイミング等の都合による sleep中のwakeupシグナルは、signalハンドラー登録後、kill()で強制的に起こしてやれば良いです。
    • good
    • 0

ところで、ゲームの種類は?


画面の更新タイミングは、ジャンルによって違うと思いますよ。

あと、3Dゲームって作ったことありませんが、一定間隔ごとに画面更新するものなのですか?
2Dだと、表示内容に更新が発生したときに最後一括して更新していたものですが。

# ベンチマークは、秒間何回処理できるをはかるものなので
# FPSが表示されているんじゃないかとちょっと思ってみたり(推測)
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/09/16 00:16

GLUTにglutTimerFunc()というのがあって、


指定した時間後に指定したコールバック関数が呼ばれるようです。
これを使えばどのOSでも同じように書けそうです。GLUTから離れられなくはなりますが。

試したことはないので、実用的なのかどうかは知りません。
ただ、こんな関数を見付けたので報告したところです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/09/16 00:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!