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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラム内から、MIDIファイルの一部分だけを再生する方法 1 2023/02/15 11:08
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- 画像編集・動画編集・音楽編集 【急】【Zbrush】3DCG初心者です。ノートPCでのZbrush動作環境につきまして 1 2023/08/19 17:38
- C言語・C++・C# win10で、正確な待ち時間の作り方 6 2023/02/14 18:28
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- モニター・ディスプレイ PCゲームで急にFPSが落ちました 2 2022/11/18 00:42
- CPU・メモリ・マザーボード パソコン購入でCPUについて(長文ですいません。) 26 2022/04/05 15:26
- CPU・メモリ・マザーボード 2009年のHPのデスクトップPCはCPU交換等して活用できますか/する価値はありますか? 9 2022/09/27 16:43
- オンラインゲーム Valorantの最低・推奨スペックについて質問させてください。 2 2022/09/07 17:48
- ノートパソコン このノートパソコンで大丈夫でしょうか? 2 2023/04/22 21:01
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Javascriptでpk戦のゲームを...
-
abnormal program termination
-
中学生です。C++のわかりやすい...
-
Pythonってどういった場所で使...
-
FLASHでゲームを作っていた人は...
-
シーケンス制御を用いたゲーム...
-
ニンテンドーDSのソフト作成に...
-
ゲーム制作に於けるC/C++の学び...
-
エラー内容について
-
高校に入ったら独学でプログラ...
-
ゲームの開発言語(1980~2010年)
-
Lispでゲーム制作
-
Unityでブラックジャックゲーム
-
ゲームを作るときに必要なプロ...
-
ゲームプログラミングは難しい...
-
ゲームプログラマーとシステム...
-
ゲームのソースコードを解析し...
-
processingの質問です。
-
トランプゲームのプログラミング
-
ゲームサイトのログイン機能の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ゲームの開発言語(1980~2010年)
-
フリーゲームを解析したい
-
ニンテンドーDSのソフト作成に...
-
Now Loadingについて
-
ゲームを日本語化しようとする...
-
C言語でのsleep機能について
-
シーケンス制御を用いたゲーム...
-
javaでゲームを作りたいです。...
-
恋愛シミュレーション制作にゲ...
-
C#で音楽の2曲同時再生の仕方
-
ノベルゲームを作ろうとおもっ...
-
高校生むけC++参考書
-
C#でゲームのチートを作ること...
-
Win32APIのゲームやアニメーシ...
-
乱数について(Rnd関数)
-
processingの質問です。
-
ゲームのソースコードを解析し...
-
インスタグラムのapiを利用して...
-
一番簡単にトランプゲームを作...
-
ゲームプログラマーとシステム...
おすすめ情報