トップページgamedev
818コメント302KB

Windowsゲームプログラミング 質問スレ

■ このスレッドは過去ログ倉庫に格納されています
0001うゆ ◆vvvK3Fcqdg 2008/11/06(木) 21:28:45ID:lNn2skuQ
※回答する人も、質問する人も必ず読んでください

【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
 「ググれ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。

【 質問する香具師 】
・ どんな事で躓いているのか明確にしる。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書け。
0768名前は開発中のものです。2011/06/26(日) 02:36:36.47ID:C/6aPfwc
どう監視してもSleep()に0より大きい値入れると
FPSが安定しないので
もうウェイト処理にSleep(0)だけ入れる事にした ヽ(`Д´)ノ

Sleep()の仕様で、引数に与えた値以上、戻ってこない事があるらしいから
それが原因なのかな…
0769名前は開発中のものです。2011/06/26(日) 08:11:41.37ID:Fm5IE/R1
>>767
キーワードを入れて検索する程度のことすら出来ない怠け者にはプログラムは向いてないよ。
0770名前は開発中のものです。2011/06/26(日) 08:26:23.84ID:C/6aPfwc
>>769

>それを使えばSleep()しなくてもCPUに高負荷がかかりませんか?

すみません、この上記の質問だけ教えてもらえませんか?

Yes/No?
0771名前は開発中のものです。2011/06/26(日) 09:04:29.33ID:Fm5IE/R1
どれだけ怠け者なら気が済むんだよ。
やった上で、疑問に思ったことを聞くならともかく、
すぐに実験できることをやろうともしない人間にこれ以上答えることはない。
0772名前は開発中のものです。2011/06/26(日) 09:35:10.81ID:C/6aPfwc
>>771
すんませんす。
timeSetEvent()で指定してコールバックで
処理するという形になるんですね。
なるほど。

ただSleep()も試行錯誤してたら
引数の数値を大きく指定するようにすれば
そこそこの精度で安定するようにはなりました。
0773名前は開発中のものです。2011/06/26(日) 10:20:15.53ID:h26G+E5Y
>>772
ttp://dixq.net/rp/43.html
ここは既知?
自分の場合、垂直同期切り忘れとか実行中にクラスの生成と解放をしてたとかあったな…
0774名前は開発中のものです。2011/06/26(日) 10:54:34.44ID:C/6aPfwc
>>773
ご紹介ありがとうございます。

ただSleep()さえかけなければ
実際にはパフォーマンスカウンタを使うので
60fpsの誤差は殆どないんです。
ただCPU使用率が100%近くになったりしてたので
なるべく余った時間、CPU負荷をかけたくなく
Sleep()入れて休ませるつもりでいました。

とりあえずSleep()でも、なるべく大きな値を入れるようにしたら
fpsが安定するようになりました。
いくつかのPCで試しましたが、結構安定してます。
(パフォーマンスカウンタで計測すれば、殆ど60ピッタリです)

while(1){
stime = timeGetTime();
game_main();
if((dif = 1000 / 60 - (timeGetTime() - stime)) > 0){
Sleep(floor(dif));
}
while(timeGetTime() - stime < 1000 / 60){ Sleep(0); }
}
0775名前は開発中のものです。2011/06/26(日) 10:59:23.35ID:U4EFMTMz
sleep()というか、Windowsって10ms以下の値は指定できるけど保障なしじゃなかったか。
今は違うんだっけ。
0776名前は開発中のものです。2011/06/26(日) 12:33:06.53ID:B5xxb33H
見たところシングルスレッドでメッセージループにSleepを入れているようだけど、
厳密に言うとメインスレッドでSleepは使ってはダメ。
Sleep中はメッセージ処理が行えないから、ブロードキャストメッセージを使用している
他のアプリケーションのパフォーマンスに影響あったりする。
FPS調整用の短いSleepならほとんど問題ないけど、余裕があればSleepのかわりに
MsgWaitForMultipleObjectsを使った方がいい。

>>775
昔から、明文化はされてないけどSleepの元になるタイマーはtimeBeginPeriodの
影響を受けて精度が変わる。何も設定してないと10ms精度くらい。
0777名前は開発中のものです。2011/06/26(日) 12:38:17.18ID:C/6aPfwc
>>776
MsgWaitForMultipleObjects ですね。
調べてみます。情報ありがとうございます^^
0778名前は開発中のものです。2011/06/26(日) 13:34:56.21ID:Fm5IE/R1
>>772
コールバックじゃなくてイベントと書いているんだが。
0779名前は開発中のものです。2011/06/26(日) 13:55:56.88ID:h26G+E5Y
>>778
そこまで気にかけるならもう回答教えてあげてもいいんじゃないのw
0780名前は開発中のものです。2011/06/26(日) 14:04:02.65ID:h26G+E5Y
自分DelphiでSTG作ってるけど、OnIdleイベント内に↓これだけでFPS安定してるけどなあ。
小数点以下の話ならごめん(^_^;)

{
t = timeGetTime();
game_main();
while(timeGetTime() - t < 17)
{ Sleep(0); }
}
0781名前は開発中のものです。2011/06/26(日) 19:28:33.67ID:EEDTFaxz
>>780
それだとCPU使用率が下がらない。
0782名前は開発中のものです。2011/06/26(日) 20:31:02.39ID:h26G+E5Y
スマソ;
0783名前は開発中のものです。2011/06/26(日) 21:04:13.27ID:C/6aPfwc
>>778
ウィンドウズのイベントがコールバックで呼び出されるという話じゃないの??
0784名前は開発中のものです。2011/06/26(日) 21:49:54.06ID:Fm5IE/R1
>>783
ちゃんとヘルプを読め。
使うのはイベントオブジェクトであって、コールバックじゃない。
0785名前は開発中のものです。2011/06/27(月) 02:04:43.20ID:mjTrT8bw
>>784
イベントオブジェクトの設定もあるんですね^^;

みなさんありがとうございます。
とりあえず今回は、>>774の方法を中心に調整して行きたいと思います。
FPSの安定とCPU使用率を抑える事が大分両立出来ました。
0786名前は開発中のものです。2011/06/27(月) 13:05:38.66ID:5jj8qo/e
>>775
Sleep()するとスレッド スイッチするんじゃないの
でもって10msだか何だか戻ってこないでしょ?
だから10ms以下のSleepは保障できないのでは・・・

0787名前は開発中のものです。2011/06/27(月) 15:37:59.15ID:KSejmRDb
1以上10以下は、な
0788名前は開発中のものです。2011/07/27(水) 18:19:20.32ID:rtDjJBOt
このスレで語られる言語は何が多いですか?
0789名前は開発中のものです。2011/07/27(水) 20:08:07.17ID:d+vft6M6
日本語かな?

という冗談はおいておいて、見てのとおりC/C++かと。
0790名前は開発中のものです。2011/08/05(金) 02:02:20.66ID:iQzPAYN5
ファイル操作、パッキングに関する部分について質問です
必要な時にオープンして用が済んだらクローズするのがファイルを扱う基本だと思うのですが
ゲームデータ全て、または画像毎や音声毎などにまとめたパックファイルを利用する場合、
何度も同じファイルにアクセスすることになると思うのですが、例えばゲーム中ずっとオープンしっ放しで利用しても良いものでしょうか?
それともやはりデータにアクセスする度にオープン→クローズするべきなのでしょうか?
0791名前は開発中のものです。2011/08/05(金) 04:03:33.45ID:LUnU1i9G
どっちでもいい。

読み込みアクセスしかしてないなら、クローズなんて気にする必要ない。
0792名前は開発中のものです。2011/08/05(金) 21:10:30.95ID:2OzNzc7r
【原発問題】汚染水処理システム、パソコンのフリーズで稼働停止 パソコン再起動で完全復旧[08/05]
http://raicho.2ch.net/test/read.cgi/newsplus/1312544716/
0793アジェグ4倍 ◆4xAJeG.COM 2011/08/15(月) 12:14:45.95ID:pL1hbMOk
60FPSで動くソフトを作るなら、スレッドは必須だよ。
CreateWindowsの後のループは、GetMessageのままのほうがいい。

で、WM_CREATEのイベントのときに、60FPSでループするスレッドを作る。
スレッドのループは、何らかのフラグで抜けるようにして、
WM_DESTROYのイベント時に、そのフラグをセットさせるってとこだな。

キーとマウスのイベントは、フラグのセットなどだけにとどめて
すぐにイベント処理を終わらせること。
あと、Sleepと画面反映の順序を間違えないように。
計算して裏画面に描画して、Sleepで時間を調整してから反映、だぞ。


・・・と、イロイロ書いてみたが、理解してもらえるだろうか・・・
0794アジェグ4倍 ◆4xAJeG.COM 2011/08/15(月) 13:26:29.82ID:pL1hbMOk
なにやら、Sleepの制御のループを
ソースレベルでイロイロ書いてるみたいだから、
おれのやり方も書いてみよう。

DWORD StartTick = timeGetTime() ;
DWORD NowTick ;
DWORD NextTick ;
bool SkipFlg = false ;
for( int LoopCnt = 1 ; ExitFlg == false ; LoopCnt++ ) {
// 計算処理

if( SkipFlg == false ) {
// 描画処理
}

SkipFlg = false ;
NextTick = ( LoopCnt * 1000 ) / 60 ;
NowTick = timeGetTime() - StartTick ;
if( NowTick < NextTick ) {
Sleep( NextTick - NowTick ) ;
// 画面反映処理
}
else {
// フレームスキップが必要
SkipFlg = true ;
}
}

こんな感じかな。
0795名前は開発中のものです。2011/08/15(月) 13:40:49.56ID:cTd0dgcs
>>794
それ6月の話題だし、素晴らしいコードを披露するならともかく
今更unsignedとsignedの区別もついてないようなコード貼られても困る。
0796アジェグ4倍 ◆4xAJeG.COM 2011/08/15(月) 13:53:07.65ID:pL1hbMOk
>>795
はいはい。

というわけで、くれぐれもマネをしないように。
著作権の問題とか発生しかねないからねぇ。
0797名前は開発中のものです。2011/08/15(月) 15:59:55.34ID:71G/E+75
何この糞コテ
0798名前は開発中のものです。2011/08/15(月) 16:15:04.32ID:cxMX6aDk
まぁ、timeGetTimeとかやっちゃってる時点でw
0799アジェグ4倍 ◆4xAJeG.COM 2011/08/15(月) 16:38:36.57ID:pL1hbMOk
なんだ、この糞コテを知らんのか。

糞コテみたら、まずはググレカすことを覚えろよ。
0800名前は開発中のものです。2011/08/15(月) 16:40:46.38ID:726htfBM
無名コテ乙
0801アジェグ4倍 ◆4xAJeG.COM 2011/08/15(月) 16:44:14.52ID:pL1hbMOk
それはそうと、この板は完全に過疎板だと思ってたが、結構いるもんだな。

悪いことは言わん、今のうちにあぼーん登録しておくがよい。
0802名前は開発中のものです。2011/08/15(月) 20:09:42.78ID:WSvdh9Hq
親切でやったつもりがケチつけられて傷ついたのはわかるが
そこで自棄を起こして荒らし行為なんてせずに、おとなしく引き下がる事を望む。
0803アジェグ4倍 ◆4xAJeG.COM 2011/08/16(火) 08:37:55.17ID:t616+10I
嵐だと思うなら、返事しちゃダメじゃん。
過疎スレで、おれが来るまで10日も放置してたのに、
おれが来たとたん、タチマチこんなに集まっちゃってさ。
sageりゃいいってもんじゃねーんだぞ。

ほんとはうれしいんだろ?
寂しかったこのスレに、大物コテが現れてくれて。

ちなみにおれは、↓のようなMIDIアプリを開発している糞コテさ。
いまは、イロイロな機能追加を進めててね。
http://www2.ocn.ne.jp/~j3262il6/rds/

このソフト、ソースも公開してるけど、くれぐれもパクったり
参考にしたりしないように。
容赦なく、timeGetTimeとかやっちゃってるからね。
0804名前は開発中のものです。2011/08/16(火) 21:09:07.25ID:3+35ODV/
timeGetTime しちゃう奴は、リアルで jobGetJob できない
0805名前は開発中のものです。2011/08/17(水) 00:02:27.51ID:FbzsBwEq
仕事では、通信プログラムのテストで、あんまり厳密でない時間間隔で
パケット投げるのには手軽で便利だよ。
clock()よりは早く投げられるし。
0806名前は開発中のものです。2011/08/17(水) 02:21:39.99ID:H/5FPjKZ
timeGetTimeってなんかまずいのか?
0807アジェグ4倍 ◆4xAJeG.COM 2011/08/17(水) 09:06:45.15ID:4BdszuWf
>>806
強いて言えば、このクソコテが使ってるからだろう。

ホカの手段としては、QueryPerformanceCounterてのがあるようだが、
おれが試してみた限りでは、timeGetTimeと挙動に大差はなかったねぇ。

そうなるともう、アルゴリズムの問題だな。
上の方では、Sleep(0)などとも言ってるけど、
待ち時間が1ミリ秒を切るようなら、それはすでに処理オーバーだから、
フレームスキップの処理などを考えないと。
0808名前は開発中のものです。2011/08/25(木) 21:01:01.31ID:L1verjXw
jobGetJob
0809名前は開発中のものです。2011/08/30(火) 16:38:39.78ID:Y9y+EOaU?BRZ(10000)

こんにちは。初めてですがよろしくお願いします。
使用文法はcです。
今回おかしいなと思ったのはキャラクターが動かないというバグです。
使用している構造体は
unit_status[k].unit_member[i].xxx
となっていて、kがグループ(つまり味方か敵かなど)、iはその中での番号です。
kが1の時は敵、0の時は味方というかんじです。
(プレイヤーに割り当てられた構造体はkが0,iが0です。ループ中に遭遇した場合はスキップされます。)
敵はしっかり動きますが、味方がうんともすんとも言いません。どうしたらいいのでしょうか?
0810名前は開発中のものです。2011/08/30(火) 16:40:51.84ID:Y9y+EOaU?BRZ(10000)

void unit_ai_base_main(){
for(int k=0;k<UNIT_STATUS_MAX;k++){//動かすグループ
for(int i=0;i<UNIT_NUMBER_MAX;i++){//そのグループのmemberを動かすためのループ

if(k==0&&i==0)break;//プレイヤーだった場合ブレイク
testtest++;
if(unit_status[k].unit_member[i].life>0){//仲間が死んでたり居なかったりしたときの分岐

// aiの分岐。
}
}
}
}

コードをはっつける良い場所ないですかね・・・
0811名前は開発中のものです。2011/08/30(火) 17:19:22.22ID:84vu7iX6
そりゃbreakで内側のループを抜けたら同グループは動かないだろう
0812名前は開発中のものです。2011/08/30(火) 18:37:55.32ID:Y9y+EOaU?BRZ(10000)

(´・ω・`)あぁ・・
0813名前は開発中のものです。2011/08/30(火) 19:08:06.33ID:NWN85EFf
>>812
m9(^Д^)プギャー
0814名前は開発中のものです。2011/09/08(木) 18:29:05.58ID:Oef4cD8U
コードはっつけるのに、http://codepad.org/
とかどうだろう
0815名前は開発中のものです。2011/09/23(金) 20:05:36.80ID:8vj2FBxM
ゲームプログラマになる前に覚えておきたい技術を読んでいるんですが、さっぱり分かりません。
普通入門書終えたら読めるようになるのでしょうか?ワンクッションおけるような書籍があれば
教えてください。(DXライブラリは使わないものでお願いします)

0816名前は開発中のものです。2011/09/23(金) 20:12:31.42ID:BbPCTDgW
入門書が何をさすかしらないけど。
CとかC++の入門書を終えたレベルじゃあれを理解するのは無理だよ。

あの本はある程度、ゲーム作製の経験のある人間でも難解だったりする。

絶版になってるけど古本なら1000円で買えるし
http://www.amazon.co.jp/dp/4797325453

これでも買っておけば?
Windowsのゲームプログラミングの初歩の初歩が学べるよ?
0817名前は開発中のものです。2011/09/23(金) 20:21:43.07ID:Unh+z/jy
15歳からはじめるDirectX 9 3Dゲームプログラミング教室 大槻 有一郎

サンプル解説の初級本なら、これでいいんじゃね、
0818名前は開発中のものです。2011/11/29(火) 11:00:43.66ID:E9cixHcQ
>>814
codepadは最近遅くなってきたからこっちも試してみて
http://ideone.com/
■ このスレッドは過去ログ倉庫に格納されています