ゲームプログラミング相談室【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:4R6gqBFc0592名無しさん@そうだ選挙に行こう
2005/09/11(日) 01:44:55ID:VkAkPVlEver9しかないみたいなんだけど、
ひょっとしてもう8は
CD付きの古本とか探すしかないですか?
98SEだと9のSDKが使えないらしいんで…
(入門サイトに2000以上って書いてた)
0593名無しさん@そうだ選挙に行こう
2005/09/11(日) 11:35:06ID:2BgVInhkつMicrosoft download
0594名無しさん@そうだ選挙に行こう
2005/09/11(日) 14:27:23ID:3zrye/oeここですよね…
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+6KO8は9の中にあるんだけどな。
0596名前は開発中のものです。
2005/11/30(水) 18:14:19ID:NRCIXxVfCをマスターしていればC++のマスターにどれくらい労力がかかるとか。
0597名前は開発中のものです。
2005/11/30(水) 20:18:12ID:/kKwaLK2しかし構文などは似ている部分が多いので、
C++を扱ってた人ならすぐ修得できるよ。
0598596
2005/11/30(水) 20:46:37ID:NRCIXxVfなるほど。ありがとう
ついでに聞いておきたいんだが、そこから派生してWindowsプログラミングってのはやっぱり難しいんだろうか?
今はCでのいわゆるコンソールアプリってのを学んでいる訳なんだが……。
0599名前は開発中のものです。
2005/11/30(水) 22:15:01ID:3MglgmXZいやいや、互換性はあるから。
基本的に、C++ は C に仕様を追加したものだから。
そりゃ、細かいところではルールが違うとかはあるけどさ。
C++ のソースコード内に C のコードを書くことはできるよ。
だから…
- 最初は C で書いて、後々 C++ に書き直す
- C++ で書いていって、どうしても分からない場所を C で書く
っていう勉強方法が使えるよ。
0600名前は開発中のものです。
2005/11/30(水) 22:18:26ID:3MglgmXZ> そこから派生してWindowsプログラミングってのはやっぱり難しいんだろうか?
Windows の API は C ベース。
なので、最低限 C のコードを書ける程度の力は必要です。
ともあれ、「猫でも分かるプログラミング」を見て勉強してみることをお勧めします。
0602名前は開発中のものです。
2005/12/25(日) 18:32:09ID:QPxHAtwCHandleクラスやHandleMgrクラス内に出てくるマジックナンバーとは、一体どのような役割をする為のものなのでしょうか?
本を読んでもソースを読んでも、全く何のために存在するものなのか理解できません。
初歩的な質問かもしれませんが、マジックナンバーとは何なのか、解る方教えて下さい。お願いいたします。
0603名前は開発中のものです。
2005/12/25(日) 21:16:44ID:10j12RX3Handle のマジックナンバーは、
ハンドルが指すオブジェクトを区別するための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 が一致した場合は、ハンドルが指す位置のオブジェクトは存在していると分かる。
0604603
2005/12/25(日) 21:17:35ID:10j12RX3とまあこんな感じに、マジックナンバーは、ハンドルの指す位置のオブジェクトが、
ハンドル取得時と同じオブジェクトであるかどうかの判定に使われている。
これで分かんなかったら、
上の例と同じケースをマジックナンバーを使わずにやった場合を考えてみると良いよ。
0605602
2005/12/26(月) 03:37:22ID:XvOO4Glh返信ありがとうございます。
非常に丁寧に解凍して頂いてありがたいです。
マジックナンバーが識別子であると言うことを理解し、順を追って考えたら理解することが出来ました。
0606名前は開発中のものです。
2005/12/30(金) 22:08:40ID:0oupnfaCスーパーマリオワールドのマップが自分で作れるエディタ
http://www.pankura.org/archives/005368.php
これみたいに、アニメのプレビューができるマップエディタを作りたいです。
アニメ部分のプレビューの実装でつまづいてます。
どんな実装にすればよいか情報いただけるとありがたいです。
0607名前は開発中のものです。
2005/12/30(金) 23:30:17ID:aGBuMIZJstruct _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:p1M3DQqdhttp://jp2.php.net/get/php-5.1.2.tar.bz2/from/jp.php.net/mirror
0610名前は開発中のものです。
2006/01/14(土) 12:40:01ID:ldillV2zスクリプトを実装して何をしたいかを、教えてもらえれば
サンプルを載せま〜す。
0611名前は開発中のものです。
2006/01/14(土) 14:12:50ID:ENjm6BLu<?= ?>があれば楽にノベルが作れそう。
0612名前は開発中のものです。
2006/01/14(土) 14:21:04ID:p1M3DQqdだからこれを使えよ。
自分のプログラムに取り込むことも出来るし、拡張も出来る。
何が不満なんだ?
0613名前は開発中のものです。
2006/01/14(土) 15:00:41ID:ENjm6BLu0614名前は開発中のものです。
2006/01/14(土) 15:20:52ID:p1M3DQqd0615名前は開発中のものです。
2006/01/14(土) 15:43:22ID:FTUE3moY0616名前は開発中のものです。
2006/01/14(土) 15:52:59ID:IKOpDFffコア部だけなら100k切るし。
0617名前は開発中のものです。
2006/01/14(土) 16:24:39ID:9Bbt7+hj0618名前は開発中のものです。
2006/01/14(土) 18:07:00ID:p1M3DQqdDLL化すらする必用もなくプログラムに組み込める。
ソースのリンクまで張ってあるのに、なんでその程度のことすら確認しないんだろう。
0619名前は開発中のものです。
2006/01/14(土) 19:32:16ID:XGcvBkdjPHPを使うってのは聞いたことないな
0620名前は開発中のものです。
2006/01/14(土) 19:43:15ID:j0Ue+PIMサウンドは、MIDINのストリーム再生とかやってるわけ?
0621名前は開発中のものです。
2006/01/14(土) 20:40:32ID:ENjm6BLuえー、本当に?
PHP側のソース変更なしで出来るなら、もっと使われてると思うけどなぁ。
0622名前は開発中のものです。
2006/01/14(土) 21:57:58ID:zrpnKi1a0623名前は開発中のものです。
2006/01/17(火) 17:27:10ID:5EkVe52dこの本ってどうかな。
というかまだ出てないんだけど。
買うか激しく迷ってる。
0624名前は開発中のものです。
2006/01/17(火) 18:34:07ID:OAcYDX6e頼んだぞ!
0625名前は開発中のものです。
2006/01/17(火) 21:01:42ID:MfScR0E60626名前は開発中のものです。
2006/01/17(火) 21:43:04ID:YlbHfDfM考えてるんだけど、馬の速さのバランスを考えるのが難しい・・。
ちょっと速い馬を作ろうと考えたらえらく速くなったり、逆をすると
えらく遅くなったり・・。
なんかコツって無いかな?
競馬ゲーム作った事ある人いない?
0627名前は開発中のものです。
2006/01/17(火) 21:51:41ID:a7PR7pCq前半でスタミナを温存した馬は、ラストスパートでダッシュできるようにすればいい。
0628名前は開発中のものです。
2006/01/17(火) 21:54:11ID:PElCyB9t個々の馬を勝手に走らせるんじゃなくて、全体を見る視点を入れてみたらどう?
たとえば、混戦を演出したいんだったら、重みをつけてみるとか。
馬群の平均位置より後ろにいる馬には、根性補正をかけて足を早くする。
逆に平均位置よりも前にいる馬には、油断補正をかけて足を遅くする。
0629626
2006/01/17(火) 22:13:17ID:YlbHfDfM>>627,628
ちなみに一応
力、
スタミナ、
スピード
調子
のパラメタを持たせてる。
あと追いか逃げで二つのタイプを作ってる。
そんで、力が強い方が馬同士がぶつかった時に相手からスタミナを奪え
るようにして、調子がいい方が持ってる最高スピードで走れるようにしてる。
スタミナが無くなると遅くして、あまってたらラストスパートができるように
してる。
まぁ結局いろいろパラメタを作ったんでそれらを上手く調整できなくなっ
ちゃってるのよね・・。
でも628が出してくれた案はなるほどーって感じ。
ちょっと実装してみます!
0630名前は開発中のものです。
2006/01/19(木) 12:30:42ID:abptcwuQそこでこんな書籍が参考になる等アドバイスを頂けたらありがたいのですが
よろしくご教授のほどお願いします
0631名前は開発中のものです。
2006/01/19(木) 12:37:44ID:FNLWz9b/0632名前は開発中のものです。
2006/01/19(木) 12:43:06ID:abptcwuQわかりました自分で調べます
0633名前は開発中のものです。
2006/01/20(金) 03:49:36ID:AJrpxY2i3Dゲームを作るには、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確かに技術は向上するが、近道ではないと思う。
探す時間を読むのに割り当てたほうが効率的。
(自分で解決しないのが癖になったら問題だが)
0635名前は開発中のものです。
2006/01/20(金) 05:04:24ID:cuy72tDdDirectPlayでピアツーピアアプリを開発しようとしていたのですが、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本代を惜しむな。
0637名前は開発中のものです。
2006/01/20(金) 08:22:06ID:2iTzpS+yまずNATとIPマスカレードを混同するのをやめること。
それからIPマスカレードでUDPが使えなかったら、ドメインを引くことすら出来なくなるぞ。
0638名前は開発中のものです。
2006/01/20(金) 08:28:59ID:xWSHaoVX0639名前は開発中のものです。
2006/01/20(金) 10:45:30ID:cuy72tDd>>IPマスカレードでUDPが使えなかったら、ドメインを引くことすら出来なくなるぞ。
えーと、DNSサーバーへの問い合わせにはUDPが使われているのでしたよね?
>>NATとIPマスカレードを混同するのをやめること。
ちょっと勉強し直してきます。
0640名前は開発中のものです。
2006/01/20(金) 13:09:31ID:cuy72tDd板違いなような気がする初歩的な疑問がわいてきたのですが、どうかお教え下さい。
NATと静的IPマスカレードは以前ルーターに設定した事があり、外側からアクセスできる事
も確認していました。でも普通のIPマスカレードに関しては特に設定した事がなく、きっと設定
が難しいのだろうと関わらないようにしていました。
ところが今勉強してきた内容によると、特にルータへの設定はいらないと思ったのですが、こ
れは正しいのでしょうか?
最近のルーターは特に設定しない限り(グローバルIP設定等の設定以外)IPマスカレードが
基本なのでしょうか?
0641名前は開発中のものです。
2006/01/20(金) 13:40:27ID:cuy72tDd>まずNATとIPマスカレードを混同するのをやめること。
外側からアクセスできないのはIPマスカレード(動的)の場合のみという事で正しいでしょうか?
>それからIPマスカレードでUDPが使えなかったら、ドメインを引くことすら出来なくなるぞ。
UDP も IP も扱いは同じと言う事でしょうか?
となるとやはり、IPマスカレードの場合、ゲートウェイ内部から外側へのアクセスはできるが、外側から
内側へのアクセスはできないという事になるのですか?UDP、IPに関わらず。
あ、またちょっと勉強してきます。
0642名前は開発中のものです。
2006/01/20(金) 16:06:33ID:f4A/Q0C3WM_PAINTが呼ばれたときのみ描画するという方法以外に何かないでしょうか。
ありましたらご教授願います。
0643名前は開発中のものです。
2006/01/20(金) 18:36:33ID:kMfWH2Ff徹底的に軽量化しる。あとWM_PAINTを使うのはなんか間違ってる希ガス
0644名前は開発中のものです。
2006/01/20(金) 21:52:48ID:lXuWX4xzFPSちゃんと考えてる?
0646642
2006/01/20(金) 22:13:41ID:1+fLDQsB返答ありがとうございます。
>>643
十分軽くしてるつもりなんですが・・・。
>>644
考えてません。タスクシステムを使えということでしょうか。
0647名前は開発中のものです。
2006/01/21(土) 04:36:25ID:mg8wRruj0648名前は開発中のものです。
2006/01/21(土) 10:52:47ID:FcJBx5+Jまずは部分毎に時間を測って
どの処理に時間が掛かっているのか特定しよう。
0649名前は開発中のものです。
2006/01/21(土) 11:12:25ID:E5l3VzaB0650642
2006/01/21(土) 11:39:57ID:7OciQh2jif(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
if(msg.message == WM_QUIT)
break;
else {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else {
Paint(); // 描画処理です
}
Sleep(1);
}
0652名前は開発中のものです。
2006/01/21(土) 11:57:20ID:cOBg8t3k0653名前は開発中のものです。
2006/01/21(土) 11:59:39ID:7OciQh2j返答ありがとうございます。さっそくやってみます。
0654名前は開発中のものです。
2006/01/21(土) 12:17:55ID:E5l3VzaB0655名前は開発中のものです。
2006/01/21(土) 12:24:15ID:gndLCiDdうちはこんな感じ。スレッドなんかいらん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:nqZd1DMC0657名前は開発中のものです。
2006/01/21(土) 12:41:58ID:FcJBx5+JPaint(); をコメントアウトした場合と
掛かる時間を比較しよう。
劇的に速度が違うなら Paint() の中に問題があるんじゃないのかな。
0658名前は開発中のものです。
2006/01/21(土) 12:58:21ID:gndLCiDdそうなん?どこが駄目か教えて。
ちなみに少し前のDirectXSDKサンプルのまんまです。
0659642
2006/01/21(土) 13:08:25ID:7OciQh2jみなさんありがとうございます。
>>655
うらやましい
>>657
大きな違いはありませんでした。
DirectXを使わなければ問題は起こらないので、初期化の地点で問題があるのかもしれません。
もう少し見直してみます。
0660642
2006/01/21(土) 13:54:29ID:7OciQh2jD3DCREATE_MIXED_VERTEXPROCESSING を
D3DCREATE_SOFTWARE_VERTEXPROCESSING に代えるだけでした。
まさか初期化にミスがあるとは思わなかったもので・・・。
アドバイスを下さった皆さん本当にありがとうございました。
0661名前は開発中のものです。
2006/01/21(土) 14:07:21ID:/mV6xXb2ここのサンプルを実行してみたのですが
画面消去の命令があるにもかかわらず、
画面が更新されないで指定画像が重なって表示されてしまいます。
ClsDrawScreen() ;だけが効いていないようなのですが、何が問題なのでしょうか。
ClsDrawScreen() ;をコメントアウトしてもしなくても同じ結果になります。
0662名前は開発中のものです。
2006/01/21(土) 15:26:20ID:+T+cr/VJSleepしないと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;
0665名前は開発中のものです。
2006/01/21(土) 16:56:03ID:gndLCiDdスレッドの話をすると荒れるのでやめとこうw
0666名前は開発中のものです。
2006/01/21(土) 17:14:45ID:VeQ0DG52DirectXのサンプル自体はあくまでサンプルであって、
あくまでDirectXの機能を紹介するために作られただけであのままでは実用出来ない。
理由はサンプルのままだとFlip時にV-Sync相当のウエイトを入れているので、
フレームスキップや、動作が重くなった場合に描画以外の処理だけ先に進めることが出来なくなる。
逆にウエイトを外すと無限にぐるぐるまわすことになり、
ベンチマーク用に能力を測るのなら適切だけど、実際のプログラムとしては不適切。
またループの内側でSleepをすると、その間ウインドウメッセージが処理できなくなる。
だからDirectXの機能紹介と能力測定のサンプルとしては適切なソースでも、
実際のプログラムには不適切な書き方なんだよ。
0667名前は開発中のものです。
2006/01/21(土) 18:00:17ID:gndLCiDdメッセージ処理のことなら上の3つは同じことだと思うが違うかな。
スレッドのことなら荒れるので(ry
0668名前は開発中のものです。
2006/01/21(土) 18:09:01ID:cOBg8t3kさらに間違ったままそれを広めようとする奴とか。
0669名前は開発中のものです。
2006/01/21(土) 18:11:30ID:gndLCiDd0670名前は開発中のものです。
2006/01/21(土) 19:30:15ID:ZH97Dxy8for( ; ; ) {
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そしてしったかしたいだけのオマエとかな
0672661
2006/01/22(日) 06:34:40ID:4Vf7TlrBそちらでお伺いさせていただくことにしました。
スレ汚しすいません。
0673名前は開発中のものです。
2006/01/23(月) 14:58:01ID:yyObefN6閉じられたハンドルにはまた新しいデータが割り当てられますよね。
これって閉じたハンドルを閉じられたとは知らずに保持していて
ハンドルを参照した時に別のデータを取得してしまう危険性は無いでしょうか?
マジックナンバーがラップして同じインデクスに同じマジックナンバーが
割り当てわれる可能性は十分にあると思うのですがどうなんでしょう?
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マジックナンバーの値は増加する一方だから
基本的に同じマジックナンバーは割り当てられない。
ただしマジックナンバーを保持する変数には当然上限があるから
ハンドルの生成数にも限りがある。
と俺は思う。
0675673
2006/01/23(月) 15:55:07ID:yyObefN6ハンドル生成数はインデクスの方ですよね?
マジックナンバーは正当性を保証するだけのもので。
ハンドル数に関係なくハンドルの生成/破棄を繰り返せばそれだけでマジックナンバーは増加します。
マジックナンバーはインデクスとは比べ物にならない位インクリメントされるので
意外とすぐ上限に達してしまうような。
0676名前は開発中のものです。
2006/01/23(月) 16:00:23ID:EPKLYP2E違うんじゃない?
インデックスの方はマジックナンバーがあるお陰でループしても平気だけど
マジックナンバーの方はそうは行かない。
0677673
2006/01/23(月) 16:24:21ID:yyObefN6それだとハンドル数が例え1個でも生成/破棄の回数が決まってしまいますよね?
インデクスは破棄されたハンドルのものを再利用するのでインデクスに16bit割り振れば
65536個持てるわけですよね。
なんだか本題より前の段階で意見の相違があるみたいですね。
実装はgemsの1.6項のものです。
0678名前は開発中のものです。
2006/01/23(月) 16:27:52ID:EPKLYP2Eハンドルをコピーするだけではマジックナンバーは増えないのでは?
0679673
2006/01/23(月) 16:32:22ID:yyObefN6ええ、確かにハンドルのコピーだけではマジックナンバーは増えません。
ですがマネージャにハンドルを要求すればその分マジックナンバーは増えますよね?
ゲームを動かしていて2時間くらいしたら
「マジックナンバーが一杯なので終了します」じゃ話にならないですよね・・・?
gemsのP73 でもマジックナンバーのラップ処理は記述されてるので、
マジックナンバーはラップ前提なはずですよ。
0680名前は開発中のものです。
2006/01/23(月) 16:53:58ID:EPKLYP2Eそうでしたか。今手元にGems無いんで家に帰ったら確認してみます。
>マネージャにハンドルを要求すればその分マジックナンバーは増えますよね?
>ゲームを動かしていて2時間くらいしたら
>「マジックナンバーが一杯なので終了します」じゃ話にならないですよね・・・?
だから種類ごとにハンドルマネージャ作れるようにテンプレートにしてあるのでは。
無限にというのはいくらなんでも無理だからその中で想定最大数を見積もって
バランスよく分けて管理すると。
0681673
2006/01/23(月) 17:19:16ID:yyObefN6>だから種類ごとにハンドルマネージャ作れるようにテンプレートにしてあるのでは。
と言う事はマジックナンバーがラップして同じインデクスに
同じマジックナンバーが割り当てられてしまうのは仕様って事ですかね。
>無限にというのはいくらなんでも無理だからその中で想定最大数を見積もって
ですね。
ですがgemsでは「インデクスの範囲内でユニークを保証する」といった意味で書かれていると解釈したため
ゲームオブジェクトのようなものにハンドルを割り当てようと思ったわけです。
ですがテクスチャやサウンドなどのリソースに割り当てるなら問題ないってレベルなんでしょうね。
0682名前は開発中のものです。
2006/01/23(月) 17:30:41ID:EPKLYP2E同インデックス、同マジックナンバーってのはそうそうでないのではないかな
Gemsでも8-24とかになってたような 気のせいだったかな?
記憶があやふやでスマソ。
0683673
2006/01/23(月) 17:56:28ID:yyObefN6>16bit-16bit みたいにインデックスとマジックナンバーで半々にしなけりゃ
>同インデックス、同マジックナンバーってのはそうそうでないのではないかな
でも確立的に低いからといってゲームオブジェクトなどの場合
オブジェクトの摩り替わりは絶対にあってはならない事ですよね。
しかも一番見つけにくい部類のハグになりそうですし。
>Gemsでも8-24とかになってたような 気のせいだったかな?
たしか半々だったような。テクスチャリソースの管理ならどんな割合でも問題なさそうですけど。
マジックナンバーを本物のGUIDにしたらどんくらい遅くなるんだろうか。
他に早くて確実なユニークIDって何かないかなぁ。
0684名前は開発中のものです。
2006/01/24(火) 01:14:06ID:tH1FX6650685名前は開発中のものです。
2006/01/24(火) 01:23:48ID:TYtG+MJgどういうこと?
void* p = malloc(1);
free(p);
void* q = malloc(1);
assert(p != q);
こうは言えないだろ。
0686名前は開発中のものです。
2006/01/24(火) 02:27:10ID:tH1FX665開放済みのアドレス参照するようなアホはハングアップでもなんでもすればいいんじゃね?
0687673
2006/01/24(火) 04:33:44ID:YZe4vdms685氏はアドレスじゃdangling pointerは防げないよって意味でmallocの例を出したんじゃないんですか?
pを他のやつにばらまいて誰かがpを開放したらpの有効性を誰が保証してくれるんでしょう。
上記のハンドルだと再割り当ての可能性があるし、
スマートポインタじゃオーバースペックだから他にユニーク性を保証するものってないだろうかっていう話ですよ。
でももう面倒だから参照カウンタで管理します。
■ このスレッドは過去ログ倉庫に格納されています