
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とメモリはこんなもんですが、もう少し性能の低いパソコンにも対応させたいかな?)
No.2ベストアンサー
- 回答日時:
スリープはOSのシステムコールなので、マルチプラットホーム用のライブラリでもなければ共通で使うことのできる関数は存在しません。
なおビジーループでWaitするのは自プロセスだけでCPUを占有する、マルチタスクに対する悪行です。
1/60秒ごとにタイマー割り込み/イベントが発生するようにして、そのハンドラで処理した方が良いでしょう。
>>なおビジーループでWaitするのは自プロセスだけでCPUを占有する、マルチタスクに対する悪口です。
やっぱり、そうですよね。意味も無いループを繰り返してWaitしても、なんか気持ち悪いと思っていました><
あまりタイマー割り込みイベント等の知識は無いのですが、また勉強してみます^^
回答ありがとうございました。
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/man …
タイミング等の都合による sleep中のwakeupシグナルは、signalハンドラー登録後、kill()で強制的に起こしてやれば良いです。
No.3
- 回答日時:
ところで、ゲームの種類は?
画面の更新タイミングは、ジャンルによって違うと思いますよ。
あと、3Dゲームって作ったことありませんが、一定間隔ごとに画面更新するものなのですか?
2Dだと、表示内容に更新が発生したときに最後一括して更新していたものですが。
# ベンチマークは、秒間何回処理できるをはかるものなので
# FPSが表示されているんじゃないかとちょっと思ってみたり(推測)
ゲームのジャンルはアクションです。詳しく言うとブロック崩しを作っているのですが、ボールは常に動いていますし、よくあるブロック崩しとちがって、ブロックも常に動いている(手前に前進してきている)状況です。
パズルゲーム等だったら、クリックされたときに更新などで、対応できそうなのですが><
でも、工夫すればWaitを掛けなくても良い方法もあるかもしれませんね。
回答ありがとうございました^^
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C#で音楽の2曲同時再生の仕方
-
C、C++でもぐらたたき
-
Win32APIのゲームやアニメーシ...
-
ゲームの作り方解説してあるサ...
-
物理エンジンの自作はできるの...
-
COBOLでのNOT = の AND条件
-
C言語、C+、C++、C#の違い
-
アセンブリ名とは??
-
順列の内容をすべて表示するプ...
-
Excel VBAで文字化けする (英語...
-
リピート再生が出来ません
-
ノートPCについて 大学・専門へ...
-
プログラムに書かれる"%"記号の...
-
C言語とhtmlの違いを どな...
-
構造化手法、データ中心アプロ...
-
exeファイルを作ったり改造した...
-
TO_CHARで小数点以下がある場合...
-
HOLONついて教えてください。
-
Excelの開発言語ってなんですか?
-
C++ ってなんて読む?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ニンテンドーDSのソフト作成に...
-
ノベルゲームを作ろうとおもっ...
-
フリーゲームを解析したい
-
将来、ゲーム業界に就職してみ...
-
C#でのゲーム作成について
-
C言語始めようと思っています
-
JAVAで入門書の後に
-
ゲームを日本語化しようとする...
-
ゲームの開発言語(1980~2010年)
-
Now Loadingについて
-
HSPのソース
-
C言語・ゲーム作成で挫折気味の...
-
Cでゲーム
-
超絶初心者なのですが…
-
このゲームって楽しいと思いま...
-
processingの質問です。
-
abnormal program termination
-
ゲームやSNS プログラミング!
-
C、C++でもぐらたたき
-
linux+x での高速の画像描画
おすすめ情報