トップページgamedev
981コメント424KB

ゲームプログラミング相談室【Part6】

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。04/03/06 01:25ID:d2e/eEyg
ゲームプログラミング全般の質問スレッド。
扱う話題のダイナミックレンジはやや広め。包容力高め。
他の初心者質問スレとの棲み分けを探りつつ
これからもマターリと活用しておくれ。
 
■過去スレ
【Part2】http://pc.2ch.net/tech/kako/985/985540361.html
【Part3】http://pc.2ch.net/tech/kako/1002/10028/1002894129.html
【Part4】http://game.2ch.net/gamedev/kako/1005/10050/1005040025.html
【Part5】http://pc2.2ch.net/test/read.cgi/gamedev/1036410116/
■関連スレなど
>>2-5
0588名前は開発中のものです。2005/08/27(土) 01:15:27ID:ZquWVtNI
特に目的がねーんならプログラミングそのものを目的にするしかねーってこった
ゲームプログラミングなんて漠然とし過ぎだって
0589名前は開発中のものです。2005/08/27(土) 01:18:02ID:4R6gqBFc
やっぱやりたいジャンルって最初に絞った方がいいんですかね
アクションとかRPGとか
0590名前は開発中のものです。2005/08/27(土) 03:15:29ID:+qa4qoic
ジャンルはあんま関係ねーな。
つか、仕事にするんじゃこんなとこで聞くなよ
それっぽい定番の本買って、そこから参考文献のリンクやら必要な資料を辿って必要なことから身につけろ。
0591名前は開発中のものです。2005/08/27(土) 03:20:16ID:4R6gqBFc
すみません、ありがとうございました
0592名無しさん@そうだ選挙に行こう2005/09/11(日) 01:44:55ID:VkAkPVlE
DirectXのSDK落とそうとしたら
ver9しかないみたいなんだけど、
ひょっとしてもう8は
CD付きの古本とか探すしかないですか?

98SEだと9のSDKが使えないらしいんで…
(入門サイトに2000以上って書いてた)
0593名無しさん@そうだ選挙に行こう2005/09/11(日) 11:35:06ID:2BgVInhk
>>592

つMicrosoft download
0594名無しさん@そうだ選挙に行こう2005/09/11(日) 14:27:23ID:3zrye/oe
>>593
ここですよね…
ttp://www.microsoft.com/downloads/results.aspx?NextOrPrevClause=6%7c%2b6562&
productID=9C954C37-1ED1-4846-8A7D-85FC422D1388&CategoryID=&freetext=&
DisplayLang=en&DisplayEnglishAlso=&sortCriteria=popularity&startDate=&period=0&
type=&sortOrder=ascending&nr=20

何遍見ても8本体が見つからない_M○
ランタイムやupデータはあるのに…
探し方悪いのかな
0595名前は開発中のものです。2005/09/19(月) 23:40:13ID:92cy+6KO
9のインストールも出来ないのかな?
8は9の中にあるんだけどな。
0596名前は開発中のものです。2005/11/30(水) 18:14:19ID:NRCIXxVf
今大学でC言語やってるんだが、C++との互換性はどんなもんなんだ?
CをマスターしていればC++のマスターにどれくらい労力がかかるとか。
0597名前は開発中のものです。2005/11/30(水) 20:18:12ID:/kKwaLK2
互換性は無い。
しかし構文などは似ている部分が多いので、
C++を扱ってた人ならすぐ修得できるよ。
05985962005/11/30(水) 20:46:37ID:NRCIXxVf
>>597

なるほど。ありがとう
ついでに聞いておきたいんだが、そこから派生してWindowsプログラミングってのはやっぱり難しいんだろうか?
今はCでのいわゆるコンソールアプリってのを学んでいる訳なんだが……。
0599名前は開発中のものです。2005/11/30(水) 22:15:01ID:3MglgmXZ
>>596
いやいや、互換性はあるから。
基本的に、C++ は C に仕様を追加したものだから。
そりゃ、細かいところではルールが違うとかはあるけどさ。

C++ のソースコード内に C のコードを書くことはできるよ。
だから…

 - 最初は C で書いて、後々 C++ に書き直す
 - C++ で書いていって、どうしても分からない場所を C で書く

っていう勉強方法が使えるよ。
0600名前は開発中のものです。2005/11/30(水) 22:18:26ID:3MglgmXZ
連投スマンです…

> そこから派生してWindowsプログラミングってのはやっぱり難しいんだろうか?

Windows の API は C ベース。
なので、最低限 C のコードを書ける程度の力は必要です。

ともあれ、「猫でも分かるプログラミング」を見て勉強してみることをお勧めします。
06015962005/11/30(水) 22:32:57ID:NRCIXxVf
>>596-600
詳しくトンクス。
「猫でも分かる〜」は一応見てみた。つーか今日の課題やってるときもお世話に(ry
0602名前は開発中のものです。2005/12/25(日) 18:32:09ID:QPxHAtwC
最近 Game Programming Gems を読みはじめたのですが、
HandleクラスやHandleMgrクラス内に出てくるマジックナンバーとは、一体どのような役割をする為のものなのでしょうか?
本を読んでもソースを読んでも、全く何のために存在するものなのか理解できません。
初歩的な質問かもしれませんが、マジックナンバーとは何なのか、解る方教えて下さい。お願いいたします。
0603名前は開発中のものです。2005/12/25(日) 21:16:44ID:10j12RX3
>>602
Handle のマジックナンバーは、
ハンドルが指すオブジェクトを区別するためのID(識別値)。

詳しく説明すると、
HandleMgr はメモリを節約するためにデータ配列の同じ位置を何度も再利用する。
そのため、ハンドルを参照したとき、それが指す位置のオブジェクトが入れ替わっている可能性がある。
これを判断するのに必要なのがマジックナンバー(=ID)。

例えば、下の様なデータ配列があるとする(数字はID)。
データ { 1, 2, 3 }

このとき 0 番目のハンドルを取得する。
ハンドルA { index=0, ID=1 }

次にIDが 1 のオブジェクトをデータから削除すると、その位置は空になる。
データ { 0, 2, 3 }  // 0 番目に 0 が入った

次にオブジェクトをデータに追加すると新しい ID が割り振られ、空の位置に入る。
データ { 5, 2, 3 }  //  0 番目に 5 が入った

このとき、さっき作ったハンドルAを参照してみる。
データの ハンドルA.index 位置の ID は 5。
ハンドルA.ID は 1。
ID が一致しないので、ハンドルは無効になった(オブジェクトは削除された)と分かる。
逆に ID が一致した場合は、ハンドルが指す位置のオブジェクトは存在していると分かる。
06046032005/12/25(日) 21:17:35ID:10j12RX3
>>602
とまあこんな感じに、マジックナンバーは、ハンドルの指す位置のオブジェクトが、
ハンドル取得時と同じオブジェクトであるかどうかの判定に使われている。

これで分かんなかったら、
上の例と同じケースをマジックナンバーを使わずにやった場合を考えてみると良いよ。
06056022005/12/26(月) 03:37:22ID:XvOO4Glh
>>603
返信ありがとうございます。
非常に丁寧に解凍して頂いてありがたいです。
マジックナンバーが識別子であると言うことを理解し、順を追って考えたら理解することが出来ました。
0606名前は開発中のものです。2005/12/30(金) 22:08:40ID:0oupnfaC

スーパーマリオワールドのマップが自分で作れるエディタ
http://www.pankura.org/archives/005368.php

これみたいに、アニメのプレビューができるマップエディタを作りたいです。
アニメ部分のプレビューの実装でつまづいてます。
どんな実装にすればよいか情報いただけるとありがたいです。

0607名前は開発中のものです。2005/12/30(金) 23:30:17ID:aGBuMIZJ
仕様を固める前に実装を聞くなよ。

struct _anime_chr {
 int number;
 int max;
 int **anime;
} anime_chr[MAP_PATTERN_MAX];

int map[MAP_Y_MAX][MAP_X_MAX];

int main(void) {
 int i, x, y;
 while (1) {
  for (i = 0; i < MAP_PATTERN_MAX; i++) {
   _anime_chr *anime = anime_chr[i];
   if (++anime->number > anime->max) {
    anime->number = 0;
   }
   /* マップチップをタイルに転送する */
   TransferChipToTile(i, anime->anime, anime->number);
  }
  for (y = 0; y < MAP_Y_MAX; y++) {
   for (x = 0; x < MAP_X_MAX; x++) {
    /* マップ番号を元に、タイルをVRAMに転送する */
    TransferTileToVram(x, y, map[y][x]);
   }
  }
 }
}

こんな感じでどうだ。中身は自分で考えて!
0608名前は開発中のものです。2006/01/14(土) 12:30:32ID:pizx291y
スクリプトの実装方法のサンプルをください
言語は問いません
0609名前は開発中のものです。2006/01/14(土) 12:36:40ID:p1M3DQqd
ほらよ。
http://jp2.php.net/get/php-5.1.2.tar.bz2/from/jp.php.net/mirror
0610名前は開発中のものです。2006/01/14(土) 12:40:01ID:ldillV2z
JavaScript or PHP についてなら、多少教えれると思います。

スクリプトを実装して何をしたいかを、教えてもらえれば
サンプルを載せま〜す。
0611名前は開発中のものです。2006/01/14(土) 14:12:50ID:ENjm6BLu
PHP風のスクリプトってないのかな。
<?= ?>があれば楽にノベルが作れそう。
0612名前は開発中のものです。2006/01/14(土) 14:21:04ID:p1M3DQqd
http://jp2.php.net/get/php-5.1.2.tar.bz2/from/jp.php.net/mirror
だからこれを使えよ。
自分のプログラムに取り込むことも出来るし、拡張も出来る。
何が不満なんだ?
0613名前は開発中のものです。2006/01/14(土) 15:00:41ID:ENjm6BLu
外部プログラムからは使いにくいんじゃないの?
0614名前は開発中のものです。2006/01/14(土) 15:20:52ID:p1M3DQqd
使いもしないうちから使いにくいって、あまりに愚かすぎて話にならない。
0615名前は開発中のものです。2006/01/14(土) 15:43:22ID:FTUE3moY
で、phpはDLL化などして相手にPHPをインストールさせずにC言語から呼べるのか?
0616名前は開発中のものです。2006/01/14(土) 15:52:59ID:IKOpDFff
Luaは? 組み込み用途に特化してるからライブラリ感覚で使えるよ。
コア部だけなら100k切るし。
0617名前は開発中のものです。2006/01/14(土) 16:24:39ID:9Bbt7+hj
何を与えても、なんだかんだ言い訳して使わないに決まってる。
0618名前は開発中のものです。2006/01/14(土) 18:07:00ID:p1M3DQqd
>>615
DLL化すらする必用もなくプログラムに組み込める。
ソースのリンクまで張ってあるのに、なんでその程度のことすら確認しないんだろう。
0619名前は開発中のものです。2006/01/14(土) 19:32:16ID:XGcvBkdj
ECMAScriptやLuaを組み込みスクリプトにするってのはよく聞くけど
PHPを使うってのは聞いたことないな
0620名前は開発中のものです。2006/01/14(土) 19:43:15ID:j0Ue+PIM
猫でもわかるゲームプログラミングってどうよ?
サウンドは、MIDINのストリーム再生とかやってるわけ?
0621名前は開発中のものです。2006/01/14(土) 20:40:32ID:ENjm6BLu
>>618
えー、本当に?
PHP側のソース変更なしで出来るなら、もっと使われてると思うけどなぁ。
0622名前は開発中のものです。2006/01/14(土) 21:57:58ID:zrpnKi1a
php_embed_shutdown(ぬるぽ);..._〆(゜▽゜*)
0623名前は開発中のものです。2006/01/17(火) 17:27:10ID:5EkVe52d
ttp://www.cbook24.com/bm_detail.asp?sku=4797332956

この本ってどうかな。
というかまだ出てないんだけど。
買うか激しく迷ってる。
0624名前は開発中のものです。2006/01/17(火) 18:34:07ID:OAcYDX6e
それは是非おまいが買ってレポよろしく。
頼んだぞ!
0625名前は開発中のものです。2006/01/17(火) 21:01:42ID:MfScR0E6
なんだか普通にCG系の書籍や雑誌を参考にしたほうが良さそうな本に思えるが……。
0626名前は開発中のものです。2006/01/17(火) 21:43:04ID:YlbHfDfM
10年位前のメダルゲームであったような競馬ゲームを作ろうと
考えてるんだけど、馬の速さのバランスを考えるのが難しい・・。
ちょっと速い馬を作ろうと考えたらえらく速くなったり、逆をすると
えらく遅くなったり・・。

なんかコツって無いかな?
競馬ゲーム作った事ある人いない?
0627名前は開発中のものです。2006/01/17(火) 21:51:41ID:a7PR7pCq
スタミナを設定して、前半で速く走りすぎたら後半で速度を落とし、
前半でスタミナを温存した馬は、ラストスパートでダッシュできるようにすればいい。
0628名前は開発中のものです。2006/01/17(火) 21:54:11ID:PElCyB9t
>>626
個々の馬を勝手に走らせるんじゃなくて、全体を見る視点を入れてみたらどう?
たとえば、混戦を演出したいんだったら、重みをつけてみるとか。

馬群の平均位置より後ろにいる馬には、根性補正をかけて足を早くする。
逆に平均位置よりも前にいる馬には、油断補正をかけて足を遅くする。
06296262006/01/17(火) 22:13:17ID:YlbHfDfM
ありがとう!
>>627,628

ちなみに一応
力、
スタミナ、
スピード
調子
のパラメタを持たせてる。
あと追いか逃げで二つのタイプを作ってる。

そんで、力が強い方が馬同士がぶつかった時に相手からスタミナを奪え
るようにして、調子がいい方が持ってる最高スピードで走れるようにしてる。
スタミナが無くなると遅くして、あまってたらラストスパートができるように
してる。

まぁ結局いろいろパラメタを作ったんでそれらを上手く調整できなくなっ
ちゃってるのよね・・。

でも628が出してくれた案はなるほどーって感じ。
ちょっと実装してみます!
0630名前は開発中のものです。2006/01/19(木) 12:30:42ID:abptcwuQ
4月からパソの専門学校のソフト科に入学するのですが、プログラミング技術向上の為に3D格闘ゲームを作りたいと思っています。
そこでこんな書籍が参考になる等アドバイスを頂けたらありがたいのですが
よろしくご教授のほどお願いします
0631名前は開発中のものです。2006/01/19(木) 12:37:44ID:FNLWz9b/
まずそれを自分で調べることが技術向上の近道。
0632名前は開発中のものです。2006/01/19(木) 12:43:06ID:abptcwuQ
>>631
わかりました自分で調べます
0633名前は開発中のものです。2006/01/20(金) 03:49:36ID:AJrpxY2i
>>630
3Dゲームを作るには、OpenGLやDirectXといったAPIの知識の他に、
数学 (3次元の幾何) も必要になる。
お前さんの数学レベルにもよるが、得意でないならこの本は読んでおくといい。
(中学レベルから高校レベルまで、必要な部分だけを効率的に書いてある)

ttp://www.amazon.co.jp/exec/obidos/ASIN/4797329076/249-0216458-7341971

読み終えたら、同じシリーズのこれかな。

ttp://www.amazon.co.jp/exec/obidos/ASIN/4797331976/ref=pd_bxgy_text_2/249-0216458-7341971

このシリーズは初心者が挫折しかねない内容をあえて省き、
逆に初心者は知らない怖れがある内容は簡単なことでも解説する、
というスタンスで書かれていると思った。

いきなり網羅的な本を読むと途中で挫折する怖れがあるから、
この2冊を読んで動くものを作ってみて、
物足りなくなってきたらもっと詳しい本を読めばいいと思う。
0634名前は開発中のものです。2006/01/20(金) 04:01:10ID:AJrpxY2i
>>631
確かに技術は向上するが、近道ではないと思う。
探す時間を読むのに割り当てたほうが効率的。
(自分で解決しないのが癖になったら問題だが)
0635名前は開発中のものです。2006/01/20(金) 05:04:24ID:cuy72tDd
 こんばんわ。初心者の疑問にどなたかお答え頂けないでしょうか?

 DirectPlayでピアツーピアアプリを開発しようとしていたのですが、WEBで検索していて、
以下のように変化してきています。

1.ピアツーピアは NAT 越えできないから、費用かかってもクラサバでやるべきだろう。
2.DirectPlay は推奨されていない(MS自身を含めて)から Socket でやるべきだろう。

 で、今はサーバーを NAT の外に置き、クライアントはどこでも可、通信は Socket で行う。
という環境を想定しています。

 そこで以下の疑問が発生して悩んでいます。

1.部分的に UDP を使いたいのですが、UDP もやはり NAT 越え出来ないのでしょうか?
  今回の環境でいうと クライアントからの送信は UDP で行えるが、サーバーからクライアント
  への送信に UDP は使えないのでしょうか?
2.速さを要求する部分には UDP を使うべきでしょうか?TCP-IP と UDP ではかなり差があるもの
  なのでしょうか?

どうかよろしくご教授下さい。
0636名前は開発中のものです。2006/01/20(金) 05:54:22ID:ts2pcmWN
>>630
本代を惜しむな。
0637名前は開発中のものです。2006/01/20(金) 08:22:06ID:2iTzpS+y
>>635
まずNATとIPマスカレードを混同するのをやめること。
それからIPマスカレードでUDPが使えなかったら、ドメインを引くことすら出来なくなるぞ。
0638名前は開発中のものです。2006/01/20(金) 08:28:59ID:xWSHaoVX
>>633>>636ありがとうございまし
0639名前は開発中のものです。2006/01/20(金) 10:45:30ID:cuy72tDd
>637 ありがとうございます。ネットワークの基礎ができてないようです...orz


>>IPマスカレードでUDPが使えなかったら、ドメインを引くことすら出来なくなるぞ。

えーと、DNSサーバーへの問い合わせにはUDPが使われているのでしたよね?


>>NATとIPマスカレードを混同するのをやめること。

ちょっと勉強し直してきます。
0640名前は開発中のものです。2006/01/20(金) 13:09:31ID:cuy72tDd
>>637 ちょっと勉強してきました。

 板違いなような気がする初歩的な疑問がわいてきたのですが、どうかお教え下さい。

 NATと静的IPマスカレードは以前ルーターに設定した事があり、外側からアクセスできる事
も確認していました。でも普通のIPマスカレードに関しては特に設定した事がなく、きっと設定
が難しいのだろうと関わらないようにしていました。

 ところが今勉強してきた内容によると、特にルータへの設定はいらないと思ったのですが、こ
れは正しいのでしょうか?
 最近のルーターは特に設定しない限り(グローバルIP設定等の設定以外)IPマスカレードが
基本なのでしょうか?


0641名前は開発中のものです。2006/01/20(金) 13:40:27ID:cuy72tDd
>>637 度々すみません。 >>637様に指摘して頂いた内容がちょっとだけ分かってきたような気がします。

>まずNATとIPマスカレードを混同するのをやめること。

 外側からアクセスできないのはIPマスカレード(動的)の場合のみという事で正しいでしょうか? 

>それからIPマスカレードでUDPが使えなかったら、ドメインを引くことすら出来なくなるぞ。

 UDP も IP も扱いは同じと言う事でしょうか?
 となるとやはり、IPマスカレードの場合、ゲートウェイ内部から外側へのアクセスはできるが、外側から
内側へのアクセスはできないという事になるのですか?UDP、IPに関わらず。

 あ、またちょっと勉強してきます。
0642名前は開発中のものです。2006/01/20(金) 16:06:33ID:f4A/Q0C3
DirectXを使用しているのですが、メッセージの来てない時に描画処理を行うというゲームループだと動作が重くゲームになりません。
WM_PAINTが呼ばれたときのみ描画するという方法以外に何かないでしょうか。
ありましたらご教授願います。
0643名前は開発中のものです。2006/01/20(金) 18:36:33ID:kMfWH2Ff
>>DirectXを使用しているのですが、メッセージの来てない時に描画処理を行うというゲームループだと動作が重くゲームになりません。
徹底的に軽量化しる。あとWM_PAINTを使うのはなんか間違ってる希ガス
0644名前は開発中のものです。2006/01/20(金) 21:52:48ID:lXuWX4xz
>>642
FPSちゃんと考えてる?
06456422006/01/20(金) 22:12:05ID:1+fLDQsB
>>643
06466422006/01/20(金) 22:13:41ID:1+fLDQsB
すいません。間違って書き込んでしまいました。
返答ありがとうございます。
>>643
十分軽くしてるつもりなんですが・・・。
>>644
考えてません。タスクシステムを使えということでしょうか。
0647名前は開発中のものです。2006/01/21(土) 04:36:25ID:mg8wRruj
タスクシステムとか関係ない。
0648名前は開発中のものです。2006/01/21(土) 10:52:47ID:FcJBx5+J
>>642
まずは部分毎に時間を測って
どの処理に時間が掛かっているのか特定しよう。
0649名前は開発中のものです。2006/01/21(土) 11:12:25ID:E5l3VzaB
DirectXだと描画命令の時点では、時間が掛からないと思う
06506422006/01/21(土) 11:39:57ID:7OciQh2j
while(TRUE) {
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
if(msg.message == WM_QUIT)
break;
else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else {
Paint(); // 描画処理です
}
Sleep(1);
}
06516422006/01/21(土) 11:40:57ID:7OciQh2j
>>650
このようなゲームループにしてるんですが、ここに問題はないでしょうか。
0652名前は開発中のものです。2006/01/21(土) 11:57:20ID:cOBg8t3k
まず描画処理とイベント処理のスレッドを分ける。
0653名前は開発中のものです。2006/01/21(土) 11:59:39ID:7OciQh2j
>>652
返答ありがとうございます。さっそくやってみます。
0654名前は開発中のものです。2006/01/21(土) 12:17:55ID:E5l3VzaB
スレッド
0655名前は開発中のものです。2006/01/21(土) 12:24:15ID:gndLCiDd
>>642
うちはこんな感じ。スレッドなんかいらんw

INTRun()
{
MSG msg;

msg.message = WM_NULL;
PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);

while (WM_QUIT != msg.message)
{
if (PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE))
{
if (GetMessage(&msg, NULL, 0U, 0U))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
//ゲームの処理へ
}
}

return (INT)msg.wParam;
}
0656名前は開発中のものです。2006/01/21(土) 12:41:58ID:nqZd1DMC
駄目な書き方の見本提示乙。
0657名前は開発中のものです。2006/01/21(土) 12:41:58ID:FcJBx5+J
>>650
Paint(); をコメントアウトした場合と
掛かる時間を比較しよう。
劇的に速度が違うなら Paint() の中に問題があるんじゃないのかな。
0658名前は開発中のものです。2006/01/21(土) 12:58:21ID:gndLCiDd
>>656
そうなん?どこが駄目か教えて。
ちなみに少し前のDirectXSDKサンプルのまんまです。
06596422006/01/21(土) 13:08:25ID:7OciQh2j
スレッドを使用してみましたが、多少動作が軽くなった感じはするものの大差はありませんでした。
みなさんありがとうございます。
>>655
うらやましい
>>657
大きな違いはありませんでした。
DirectXを使わなければ問題は起こらないので、初期化の地点で問題があるのかもしれません。
もう少し見直してみます。
06606422006/01/21(土) 13:54:29ID:7OciQh2j
解決しました。
D3DCREATE_MIXED_VERTEXPROCESSING を 
D3DCREATE_SOFTWARE_VERTEXPROCESSING に代えるだけでした。
まさか初期化にミスがあるとは思わなかったもので・・・。
アドバイスを下さった皆さん本当にありがとうございました。
0661名前は開発中のものです。2006/01/21(土) 14:07:21ID:/mV6xXb2
ttp://lacc.biz/cpp/cpp07.html
ここのサンプルを実行してみたのですが
画面消去の命令があるにもかかわらず、
画面が更新されないで指定画像が重なって表示されてしまいます。
ClsDrawScreen() ;だけが効いていないようなのですが、何が問題なのでしょうか。
ClsDrawScreen() ;をコメントアウトしてもしなくても同じ結果になります。
0662名前は開発中のものです。2006/01/21(土) 15:26:20ID:+T+cr/VJ
>>654
SleepしないとCPUの処理時間を占有するからじゃないかなぁ…。
急いで書いたから汚いけど、スレッド分けるとセオリー的にはこんな感じかな?

DWORD WINAPI gMainLoop(LPVOID lpDone){//ゲームのメインループ
  bool* pDone = dynamic_cast<bool *> (lpDone);
  while(!(*pDone));//ここでループ
  ExitThread(0L);
}

class CGameMain{/ゲームクラス
public:
  CGameMain():done(false){CreateThread(NULL, 0, gMainLoop, &done, 0, NULL);}
  ~CGameMain(){done = true;WaitForSingleObject(hThread, INFINITE);}//スレッド終了
  bool CGameMain::IsDone(void){return done;}
  void CGameMain::Kill(void){done=true;}
private:
  bool done;
  HANDLE hThread;
};

// WinMain側の処理
  MSG msg;
  CgameMain *pGMain = new CgameMain();
  do{
    if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)){
      TranslateMessage(&msg);DispatchMessage(&msg);
    }else{
      if (pGMain->IsDone()) DestroyWindow(g_hWindow);
    }
  } while (msg.message != WM_QUIT);
  delete pGMain;
06636622006/01/21(土) 15:26:40ID:+T+cr/VJ
>>668の間違いでした。
06646632006/01/21(土) 15:27:18ID:+T+cr/VJ
さらにまちがい、662は>>658へのレスです。
酔いが回りすぎです。
0665名前は開発中のものです。2006/01/21(土) 16:56:03ID:gndLCiDd
まあ、656は単発IDの煽りでしょう。
スレッドの話をすると荒れるのでやめとこうw
0666名前は開発中のものです。2006/01/21(土) 17:14:45ID:VeQ0DG52
>>665
DirectXのサンプル自体はあくまでサンプルであって、
あくまでDirectXの機能を紹介するために作られただけであのままでは実用出来ない。
理由はサンプルのままだとFlip時にV-Sync相当のウエイトを入れているので、
フレームスキップや、動作が重くなった場合に描画以外の処理だけ先に進めることが出来なくなる。
逆にウエイトを外すと無限にぐるぐるまわすことになり、
ベンチマーク用に能力を測るのなら適切だけど、実際のプログラムとしては不適切。
またループの内側でSleepをすると、その間ウインドウメッセージが処理できなくなる。

だからDirectXの機能紹介と能力測定のサンプルとしては適切なソースでも、
実際のプログラムには不適切な書き方なんだよ。
0667名前は開発中のものです。2006/01/21(土) 18:00:17ID:gndLCiDd
>>666
メッセージ処理のことなら上の3つは同じことだと思うが違うかな。
スレッドのことなら荒れるので(ry
0668名前は開発中のものです。2006/01/21(土) 18:09:01ID:cOBg8t3k
目的の違うサンプルソースをみて、それで正しいと思ってしまうことに問題があるんだろう。
さらに間違ったままそれを広めようとする奴とか。
0669名前は開発中のものです。2006/01/21(土) 18:11:30ID:gndLCiDd
何も考えず変なソース張った俺が悪いなこれはwすまそん
0670名前は開発中のものです。2006/01/21(土) 19:30:15ID:ZH97Dxy8
おし。おれもなにもかんがえずに貼ってみようかな

for( ; ; ) {

MSG msgmouse;
msgmouse.message = WM_NULL;
while(PeekMessage(&msgmouse, NULL, WM_MOUSEMOVE, WM_MOUSEMOVE, PM_REMOVE)) Sleep(0);
if(msgmouse.message == WM_MOUSEMOVE) DispatchMessage(&msgmouse);
MSG msg;
while(PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE )) DispatchMessage(&msg);

if(fpstimer.PeekElapsedTime() > MIN_ELAPSED_TIME_FOR_FRAME)
{
 fpstimer.Reset();

 HRESULT hr;
 if( FAILED( hr = Render3DEnvironment() ) ) { break; }
 if(hr == S_OK) m_pd3dDevice->Present( NULL, NULL, NULL, NULL );

 if(msg.message != WM_CHAR && msg.message != WM_KEYDOWN && msgmouse.message == WM_NULL &&
            fpstimer.PeekElapsedTime() + 0.002 < MIN_ELAPSED_TIME_FOR_FRAME)
  MsgWaitForMultipleObjects(0,NULL,FALSE,2,QS_ALLEVENTS); // sleep until messages come
 else
  Sleep(0);
}
}
0671名前は開発中のものです。2006/01/21(土) 21:35:41ID:bEVxbAiq
>>668
そしてしったかしたいだけのオマエとかな
06726612006/01/22(日) 06:34:40ID:4Vf7TlrB
DXライブラリさんのほうのサンプルでも同じ現象がおきたので、
そちらでお伺いさせていただくことにしました。
スレ汚しすいません。
0673名前は開発中のものです。2006/01/23(月) 14:58:01ID:yyObefN6
>> 602-605
閉じられたハンドルにはまた新しいデータが割り当てられますよね。
これって閉じたハンドルを閉じられたとは知らずに保持していて
ハンドルを参照した時に別のデータを取得してしまう危険性は無いでしょうか?
マジックナンバーがラップして同じインデクスに同じマジックナンバーが
割り当てわれる可能性は十分にあると思うのですがどうなんでしょう?

1. AがHというハンドルを持っていたとします。
2. AはBにHを分け与えました。
3. BはHを破棄したくなりその場で破棄(mgr.Release(H))しました。
4. AはHを参照するも無効なハンドルだと知ることが出来ました。
ここまではいいんですよ。生ポインタじゃこのシナリオは書けません。

上の3.と4.の間で大量のハンドルの生成が行われた場合、
4.でAが(閉じているはずの)Hを参照した時にHと同じインデクス/マジックナンバーの
ハンドルの再割り当てが行われるとAは別のデータを参照してしまいます。
0674名前は開発中のものです。2006/01/23(月) 15:33:46ID:EPKLYP2E
>>673
マジックナンバーの値は増加する一方だから
基本的に同じマジックナンバーは割り当てられない。
ただしマジックナンバーを保持する変数には当然上限があるから
ハンドルの生成数にも限りがある。

と俺は思う。
06756732006/01/23(月) 15:55:07ID:yyObefN6
>>674
ハンドル生成数はインデクスの方ですよね?
マジックナンバーは正当性を保証するだけのもので。
ハンドル数に関係なくハンドルの生成/破棄を繰り返せばそれだけでマジックナンバーは増加します。
マジックナンバーはインデクスとは比べ物にならない位インクリメントされるので
意外とすぐ上限に達してしまうような。
0676名前は開発中のものです。2006/01/23(月) 16:00:23ID:EPKLYP2E
>>675
違うんじゃない?
インデックスの方はマジックナンバーがあるお陰でループしても平気だけど
マジックナンバーの方はそうは行かない。
06776732006/01/23(月) 16:24:21ID:yyObefN6
>>676
それだとハンドル数が例え1個でも生成/破棄の回数が決まってしまいますよね?
インデクスは破棄されたハンドルのものを再利用するのでインデクスに16bit割り振れば
65536個持てるわけですよね。

なんだか本題より前の段階で意見の相違があるみたいですね。
実装はgemsの1.6項のものです。
0678名前は開発中のものです。2006/01/23(月) 16:27:52ID:EPKLYP2E
いやいや、参照カウンタではないから
ハンドルをコピーするだけではマジックナンバーは増えないのでは?
06796732006/01/23(月) 16:32:22ID:yyObefN6
>>678
ええ、確かにハンドルのコピーだけではマジックナンバーは増えません。
ですがマネージャにハンドルを要求すればその分マジックナンバーは増えますよね?
ゲームを動かしていて2時間くらいしたら
「マジックナンバーが一杯なので終了します」じゃ話にならないですよね・・・?

gemsのP73 でもマジックナンバーのラップ処理は記述されてるので、
マジックナンバーはラップ前提なはずですよ。
0680名前は開発中のものです。2006/01/23(月) 16:53:58ID:EPKLYP2E
>マジックナンバーはラップ前提なはずですよ。
そうでしたか。今手元にGems無いんで家に帰ったら確認してみます。

>マネージャにハンドルを要求すればその分マジックナンバーは増えますよね?
>ゲームを動かしていて2時間くらいしたら
>「マジックナンバーが一杯なので終了します」じゃ話にならないですよね・・・?
だから種類ごとにハンドルマネージャ作れるようにテンプレートにしてあるのでは。
無限にというのはいくらなんでも無理だからその中で想定最大数を見積もって
バランスよく分けて管理すると。
06816732006/01/23(月) 17:19:16ID:yyObefN6
>>680
>だから種類ごとにハンドルマネージャ作れるようにテンプレートにしてあるのでは。
と言う事はマジックナンバーがラップして同じインデクスに
同じマジックナンバーが割り当てられてしまうのは仕様って事ですかね。

>無限にというのはいくらなんでも無理だからその中で想定最大数を見積もって
ですね。
ですがgemsでは「インデクスの範囲内でユニークを保証する」といった意味で書かれていると解釈したため
ゲームオブジェクトのようなものにハンドルを割り当てようと思ったわけです。
ですがテクスチャやサウンドなどのリソースに割り当てるなら問題ないってレベルなんでしょうね。
0682名前は開発中のものです。2006/01/23(月) 17:30:41ID:EPKLYP2E
16bit-16bit みたいにインデックスとマジックナンバーで半々にしなけりゃ
同インデックス、同マジックナンバーってのはそうそうでないのではないかな
Gemsでも8-24とかになってたような 気のせいだったかな?
記憶があやふやでスマソ。
06836732006/01/23(月) 17:56:28ID:yyObefN6
>>682
>16bit-16bit みたいにインデックスとマジックナンバーで半々にしなけりゃ
>同インデックス、同マジックナンバーってのはそうそうでないのではないかな
でも確立的に低いからといってゲームオブジェクトなどの場合
オブジェクトの摩り替わりは絶対にあってはならない事ですよね。
しかも一番見つけにくい部類のハグになりそうですし。

>Gemsでも8-24とかになってたような 気のせいだったかな?
たしか半々だったような。テクスチャリソースの管理ならどんな割合でも問題なさそうですけど。

マジックナンバーを本物のGUIDにしたらどんくらい遅くなるんだろうか。
他に早くて確実なユニークIDって何かないかなぁ。
0684名前は開発中のものです。2006/01/24(火) 01:14:06ID:tH1FX665
アドレスだと確実にユニークです。
0685名前は開発中のものです。2006/01/24(火) 01:23:48ID:TYtG+MJg
>>684
どういうこと?

void* p = malloc(1);
free(p);
void* q = malloc(1);
assert(p != q);

こうは言えないだろ。
0686名前は開発中のものです。2006/01/24(火) 02:27:10ID:tH1FX665
アドレス空間より広いサイズのIDは保持不可能という前提で言ってたんだが。
開放済みのアドレス参照するようなアホはハングアップでもなんでもすればいいんじゃね?
06876732006/01/24(火) 04:33:44ID:YZe4vdms
>>686
685氏はアドレスじゃdangling pointerは防げないよって意味でmallocの例を出したんじゃないんですか?
pを他のやつにばらまいて誰かがpを開放したらpの有効性を誰が保証してくれるんでしょう。

上記のハンドルだと再割り当ての可能性があるし、
スマートポインタじゃオーバースペックだから他にユニーク性を保証するものってないだろうかっていう話ですよ。
でももう面倒だから参照カウンタで管理します。
■ このスレッドは過去ログ倉庫に格納されています