[過去ログ]
ゲームプログラミング相談室 (986レス)
ゲームプログラミング相談室 http://game.5ch.net/test/read.cgi/gamedev/1005040025/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
777: 名前は開発中のものです。 [sage] 02/10/26 01:46 ID:??? メモリ確保して開放せずに終了したら駄目じゃん。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/777
778: 名前は開発中のものです。 [sage] 02/10/26 02:48 ID:??? >>777 プロセス終了時のメモリ解放は OSの管轄ですが何か? メモリリークが問題になるのは 長時間常駐するプロセスだけ http://game.5ch.net/test/read.cgi/gamedev/1005040025/778
779: 名前は開発中のものです。 [sage] 02/10/26 02:55 ID:??? 不正な処理で終了した場合も開放してくれる? http://game.5ch.net/test/read.cgi/gamedev/1005040025/779
780: 名前は開発中のものです。 [sage] 02/10/26 03:54 ID:??? >>779 まさか、しないと思ってるのか? http://game.5ch.net/test/read.cgi/gamedev/1005040025/780
781: 名前は開発中のものです。 [sage] 02/10/26 04:37 ID:??? Win95のころはひどかったな。 一応OSが開放してくれるハズだが、 それを過度に期待したプログラムを組むのは避けた方が無難。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/781
782: 名前は開発中のものです。 [sage] 02/10/26 04:44 ID:??? 関係ないけど、windowsでプログラム書くんだったら 確保したメモリは必ず自分で解放しなくちゃダメだよ。 OSを信用する方が悪い。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/782
783: 名前は開発中のものです。 [sage] 02/10/26 07:46 ID:??? OSが開放してくれるとしても、それはあくまでも開放ミスに対する 救済措置と思ったほうがいい。確保したメモリは必ず開放するのが鉄則。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/783
784: 名前は開発中のものです。 [sage] 02/10/26 10:14 ID:??? またmalloc&freeネタか・・・飽きないねえ http://game.5ch.net/test/read.cgi/gamedev/1005040025/784
785: 名前は開発中のものです。 [sage] 02/10/26 12:43 ID:??? >>783 > OSが開放してくれるとしても、それはあくまでも開放ミスに対する > 救済措置と思ったほうがいい そりゃ違うだろ。 そもそも仮想記憶を使ってる OS の場合、ページテーブルやら TLB (*1) やら は OS 以外は触れない。そこにバグがあると疑い始めたら、もはやアプリケー ション側でとれる対策は何もないよ。 (*1) IA-32 だと TLB はソフトウェアからいじる必要はない(ページテーブルをハード が勝手にコピーしてくれる)けど、MIPS などは TLB ミスが起きると例外を発生 して、OS が自前で埋める必要がある。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/785
786: 名前は開発中のものです。 [sage] 02/10/26 14:26 ID:??? どんな環境でも開放しなかったメモリの後始末をしてくれる という保証は無いからメモリリークするようなプログラムは そもそも欠陥品と見ていい。だから開放しないと駄目。 それにOSが開放しなかったからといって、それはOSの 過失ではない。プログラム作った奴が悪い。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/786
787: 名前は開発中のものです。 [sage] 02/10/26 14:35 ID:??? 786でまとまりました。 では次の話題。 ↓ http://game.5ch.net/test/read.cgi/gamedev/1005040025/787
788: 名前は開発中のものです。 [sage] 02/10/26 15:24 ID:??? 実験に使いたいのですがOSがリソースを開放できない終了方法を教えてください いくらやってもけしからんことに勝手に開放されてしまいます http://game.5ch.net/test/read.cgi/gamedev/1005040025/788
789: 名前は開発中のものです。 [sage] 02/10/26 16:18 ID:??? >>788 Win98でRPCだか何だかを使うと起こりやすいそうだ 使ったことないけど http://game.5ch.net/test/read.cgi/gamedev/1005040025/789
790: 名前は開発中のものです。 [ ] 02/10/26 16:22 ID:??? >>788 DOS環境とかゲーム専用機等ならたぶん開放しないのでは。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/790
791: 名前は開発中のものです。 [sage] 02/10/26 22:41 ID:??? >>745 アルゴリズムが公開されている暗号もある。 >>755 タスクと再帰処理がなぜ両立できないのか分からん。 >>788 何の実験に使うのか知らんが。 ファイルや共有メモリ等、OSが勝手に解放することがないリソースは存在する。 存分に使え。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/791
792: 名前は開発中のものです。 [sage] 02/10/27 01:11 ID:??? >>786 そもそも「どんな環境でも」なんて言い出したら、それこそ malloc/free がない 世界とか、あっても C 言語の規格書に従ってない環境まで出てくるから、議論 にならんよ。 規格書を行間まで読めば、C 言語の hosted environment を前提とする限り malloc したメモリは OS に解放されるはず、が結論。 だいたいヒープの仕組みとか仮想記憶の仕組みを知っていれば、そんなに ビクビクする必要はないと思うんだが。解放されないって、実際にどんな環境 を想定してるんだ? (スタイルとして解放する方が良いかは別問題な) http://game.5ch.net/test/read.cgi/gamedev/1005040025/792
793: 名前は開発中のものです。 [sage] 02/10/27 01:28 ID:??? つーか、解放しないと再利用できないじゃん? こまめに解放してメモリを開けたほうがいいと思うんだが。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/793
794: 名前は開発中のものです。 [] 02/10/27 01:52 ID:xQ8SKzdu PS2のアルファブレンド設定を DirectXでもやりたいのですが、 そういうことはできないのでしょうか? たしか こんな計算式 C = (A+B)>>7+D A: と B: ソースのカラーか フレームバッファのカラー D: ソースかフレームのアルファ値 http://game.5ch.net/test/read.cgi/gamedev/1005040025/794
795: 名前は開発中のものです。 [sage] 02/10/27 03:45 ID:??? >>794 IDirect3DDevice8::SetTextureStageState( ) http://game.5ch.net/test/read.cgi/gamedev/1005040025/795
796: 名前は開発中のものです。 [sage] 02/10/27 05:52 ID:??? >>793 ところが大抵の処理系では freeは解放済みフラグが立つだけで 実際に解放されるのはプロセス終了時なんだな・・・ http://game.5ch.net/test/read.cgi/gamedev/1005040025/796
797: 名前は開発中のものです。 [sage] 02/10/27 06:27 ID:??? JAVAなんかはガベッジコレクションを行ってくれるけどね。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/797
798: 名前は開発中のものです。 [sage] 02/10/27 09:49 ID:??? >>796 それじゃfree自体存在意義ねーじゃん http://game.5ch.net/test/read.cgi/gamedev/1005040025/798
799: 名前は開発中のものです。 [sage] 02/10/27 10:25 ID:??? >>798 けど同じプロセスが再び○allocするときは その解放済みの領域からメモリ確保するので あながち無意味とも言えない http://game.5ch.net/test/read.cgi/gamedev/1005040025/799
800: 名前は開発中のものです。 [sage] 02/10/27 10:53 ID:??? >>798 一種のキャッシュだよ。まっとーなメモリ保護のある環境下で OS を呼び出して メモリを割り当ててもらうのは ソフトウェア割り込みによる特権モード変更 割り込みハンドラでのレジスタの待避などの定型処理 (ここで OS のメモリ割り当て関係のコードに入って) 各種制限のチェック(たとえばユーザあたりのメモリ割り当て越えてないか、 とか) 仮想記憶のページテーブル、TLB の変更 OS の持つ仮想記憶レイヤーにおけるページエントリの変更 と、いろいろ手間がかかる。ユーザ空間で完結できれば、それに越したことはな い。 このあたりは使ってるライブラリによっても変わってくるけど、昔の UNIX だと 一度 malloc したら二度と OS には返さないのが一般的で、最近でも条件 (*1) が揃わない限りはまず返さない。 本当に OS からメモリを短時間・大量に借りたいなら malloc/free なんか使っ ちゃダメです。mmap() とか VirtualAlloc() とか使いましょう。 (*1) ヒープの端っこが free() されるとか、ページ単位で連続した空間が free される とか。この条件を緩くして OS 側に返すチャンスを増やそうとすればするほど、 malloc/free が内部で管理・チェックするデータが増え、割り当て・解放に掛か る時間もメモリ消費も大きくなるというトレードオフがある。 たとえば Solaris だと libc, libmalloc, libmapalloc あたりに実装が異なる malloc/free がいくつかあるから、ソースを眺めながら処理速度を比べてみると 勉強になるよ。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/800
801: 名前は開発中のものです。 [sage] 02/10/27 11:02 ID:??? 検索で調べてみたが、実際メモリリークは問題になって るからメモリ開放しないプログラムを書くのは良くないと思う。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/801
802: 名前は開発中のものです。 [] 02/10/27 17:34 ID:PvYfeL9I >>800 Win32の場合、mallocもVirtualAlloc呼び出してんじゃないの? 同様に、freeはVirtualFreeって感じで。 メモリマップはこれらとは違うだろうけど。 思い切り勘違いなら、ごめんな。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/802
803: 名前は開発中のものです。 [sage] 02/10/27 17:36 ID:??? >Win32の場合、mallocもVirtualAlloc呼び出してんじゃないの? Win32じゃなくてCのランタイムライブラリの実装次第 >思い切り勘違いなら、ごめんな。 あやまるくらいなら最初からいい加減なことは書くな http://game.5ch.net/test/read.cgi/gamedev/1005040025/803
804: 名前は開発中のものです。 [sage] 02/10/27 17:49 ID:??? >>802 malloc() したら毎回 VirutalAlloc(), free() したら毎回 VirtualFree() してると 思ってる? んなこたないって。ソース読めば明白なんだが、msvcrt.dll だと 1. VirutalAlloc() 系ではなく一つ抽象度が高いHeapAlloc() 系を使っていて、 こいつがユーザ空間でいろいろメンテナンスしていてる。 2. それに加え C Runtime Library 内部でも、小規模なメモリ割り当てに関して 毎回 HeapAlloc(), HeapFree() を呼ばないで良いようにキャッシュしている。 と、OS 直のメモリインターフェースから 2 枚の皮をかぶせてある。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/804
805: 名前は開発中のものです。 [sage] 02/10/27 17:57 ID:??? あと OS が提供するメモリ割り当てのインターフェースは、基本的にページ単位 でしかメモリを割り当ててくれない。VM とか CPU アーキテクチャによるんだが、 たいてい 1 ページは 8192 バイト前後。 だから小さなメモリブロックを割り当てるときに毎回 OS を呼んでるとムダに なるメモリも莫大になるんで、 でっかいメモリブロックを OS からもらってきて そいつを小さく切り刻んだ上で malloc 呼び出してきた側に返す っつー仕組みにしてる面もある。 (あと昔の OS だと、そもそもメモリブロックを割り当てるような API を提供 してなかったりな。brk() とか sbrk() で検索してみ) http://game.5ch.net/test/read.cgi/gamedev/1005040025/805
806: 名前は開発中のものです。 [age] 02/10/27 18:15 ID:??? メ モ リ リ ー ク が イ ヤ な ら J a v a で も つ か っ て い ろ http://game.5ch.net/test/read.cgi/gamedev/1005040025/806
807: 名前は開発中のものです。 [sage] 02/10/27 19:01 ID:??? >>804 2. はたしか廃止されたような気がする 今手元にないのでわからんが、どっかで見た http://game.5ch.net/test/read.cgi/gamedev/1005040025/807
808: 名前は開発中のものです。 [sage] 02/10/27 23:24 ID:??? 802だけどよ malloc=VirtualAlloc呼び出しで解決されてるんじゃないか、 と思ったんで、質問の意味もあって書いてみたんだが。 それをいい加減とか決め付けてる>>803氏んどくように。 あと、HeapAllocは既に廃止されてるはず(MSDN libに載ってたと思う) 今のWin32では、HeapAllocは内部でVirtualAllocを呼び出してるんじゃなかったかな。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/808
809: 名前は開発中のものです。 [sage] 02/10/27 23:34 ID:??? いろんなmallocの実装を紹介するスレはここですか? http://game.5ch.net/test/read.cgi/gamedev/1005040025/809
810: 名前は開発中のものです。 [sage] 02/10/27 23:47 ID:??? >>808 HeapAlloc が内部で VirtualAlloc を呼び出してるのは確かだが、単なる ラッパじゃない。内部で色々処理をしてる。 それと廃止されたのは GlobalAlloc(), LocalAlloc() だろうが。嘘八百を 並べるなよ……。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/810
811: 名前は開発中のものです。 [sage] 02/10/28 01:58 ID:??? >>810 訂正さんくす。 HeapAllocが廃止されたってのは、勘違いだったよ。 廃止されたのはGlobalAlloc/Freeで、HeapAlloc/FreeはVirtualAllocで 確保したメモリをヒープ構造で管理してるってことなのね。 Win32APIで開発する時は、たいていHeapAllocと同じことを自前でしてるせいで、 よく知りませんですた。 ご指摘さんくす、と同時に、嘘八百とか書くなよ、ぼけ。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/811
812: 名前は開発中のものです。 [sage] 02/10/28 02:03 ID:??? それじゃ今後は同様の事態を表現するときは嘘七百五十くらいで。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/812
813: 名前は開発中のものです。 [sage] 02/10/28 03:11 ID:??? >>811 > HeapAlloc/FreeはVirtualAllocで > 確保したメモリをヒープ構造で管理してるってことなのね。 全然違うぞ…。なんでそこでヒープ構造が出てくる? http://game.5ch.net/test/read.cgi/gamedev/1005040025/813
814: 名前は開発中のものです。 [sage] 02/10/28 09:40 ID:??? >>802,808,811 いいかげん。うそはっぱく。よくしらないのにしったかぶり。 晒しsage http://game.5ch.net/test/read.cgi/gamedev/1005040025/814
815: 名前は開発中のものです。 [sage] 02/10/28 11:02 ID:??? >>806 JavaやC#がメモリリークないと思ってるヤツ発見 http://www-6.ibm.com/jp/developerworks/java/010824/j_j-leaks.html http://game.5ch.net/test/read.cgi/gamedev/1005040025/815
816: 名前は開発中のものです。 [sage] 02/10/28 11:57 ID:??? うーん、微妙に話題ズレてない? >799も言うとおり、解放済みマークのついた領域は再利用される。 (そのためのfreeだろ?) だから、mallocにラッパーが掛かってようが掛かってまいが、 >793が原則として正しいということでいいんでないの? http://game.5ch.net/test/read.cgi/gamedev/1005040025/816
817: 名前は開発中のものです。 [sage] 02/10/28 12:05 ID:??? 確保したら必ず開放しなくてはいけないと思ってたほうが無難だよ。 そのほうが余計なトラブルの心配しなくて済むじゃん。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/817
818: 名前は開発中のものです。 [sage] 02/10/28 20:30 ID:??? >>817 俺は free(p); free(p); とかやって、メモリ領域壊したことがある。実際にはこんな簡単なコードじゃ なくて、サイクルのある複雑なデータ構造で、遠く離れた関数で実行されて たんだが。 結局、そのデータ構造扱う部分は「でっかくメモリを取って中で使い回し、 使い終わったら丸ごと free する」っつー方針で書き換えました。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/818
819: 名前は開発中のものです。 [sage] 02/10/28 20:38 ID:??? 普通、 free(p); p=NULL; ってしない? http://game.5ch.net/test/read.cgi/gamedev/1005040025/819
820: 名前は開発中のものです。 [sage] 02/10/28 20:49 ID:??? >>819 しない。そもそも p に相当するものが関数の引数として渡ってくる場合には、 それって無理だし。 free_something(void* p) { free(p); p = NULL; } func() { free_something(p); // p は相変わらず NULL じゃない } これは極端な例だけど。あとサイクルがあるデータ構造だと、解体する順番 やタイミングが非常に難しい。コンパイラを書くときに良く出てくる DAG 程度 のデータ構造でも、気を付けないとすぐ二重 free しちゃうよ。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/820
821: 名前は開発中のものです。 [sage] 02/10/28 21:14 ID:??? ttp://isweb43.infoseek.co.jp/art/yn515/game.gif こういった感じのゲームを作ろうと試みています。 フィールド上をクリックすると、キャラがそこへ歩いて行くような。 ですが、障害物なんかを遠回りして避けていくようにするにはどうすれば いいのか見当もつきません。どうしても凹んでいるところでつっかかってしまいます。 皆様のお知恵をお貸しください。おながいします。 ちなみに言語はHSPです。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/821
822: 名前は開発中のものです。 [sage] 02/10/28 22:37 ID:??? >>821 絶対に答えが出るアルゴリズムだと A* とかかねぇ。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/822
823: 821 [sage] 02/10/28 22:50 ID:??? >822 検索してみましたが、適当なところが見つかりませんでした。 A*とはなんでしょうか? http://game.5ch.net/test/read.cgi/gamedev/1005040025/823
824: 名前は開発中のものです。 [] 02/10/28 23:11 ID:Y1mIhqb7 クォータビューのマップで当たりをとりたいんですけど 高速なやり方ってあります? 内部的にはトップビューというのではなく、 クォータビューそのままでマップとキャラの菱形の当たりをとりたいのですけど…。 動作環境はへちょいので浮動小数点とか線分の交点などを求めないような軽いのを考えているのですが。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/824
825: 名前は開発中のものです。 [sage] 02/10/28 23:30 ID:??? その当たり判定で何をやりたいかによると思うんだが http://game.5ch.net/test/read.cgi/gamedev/1005040025/825
826: 名前は開発中のものです。 [sage] 02/10/28 23:47 ID:??? >>821 とりあえず障害物で行き詰まったら、障害物の表面に沿って 目標に到達できそうな位置まで移動してみるというのはどうか。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/826
827: 824 [] 02/10/28 23:51 ID:Y1mIhqb7 >>825 クォータビューのマップを主人公が歩くとき、マップと当たりをとりたいのです。 高さがない似非クォータビューなので、それほど苦労しまい、と思っていたら あまり芳しい結果になりませんでして。 マップが歩けるような当たりなので、常時判定するという方向性で軽くしたい、とそういうことなのです。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/827
828: 821 [sage] 02/10/28 23:55 ID:??? >>826 その障害物が岩とかだったら、どっち側に避けても目的地までいけるんですが、 ___ ____■=キャラ ○=クリックした場所 / \ ■ | |○ \_/ この場合、上を周って行こうとすると当然ひっかかっていけませんが 下を通って避ければ目的地までいけますよね。 こういう風にケースバイケースでどっち側に避けるかどうやって 判断させればいいのかがわからないんです。 わかりにくかったらスミマセン… http://game.5ch.net/test/read.cgi/gamedev/1005040025/828
829: 821 [sage] 02/10/28 23:58 ID:??? ずれちゃった…なんとかわかってください(汗 <図 つまり、出っ張った障害物なんかをちゃんと キャラが通れるコースを歩いてくれるようにしたいのです http://game.5ch.net/test/read.cgi/gamedev/1005040025/829
830: 名前は開発中のものです。 [sage] 02/10/29 00:00 ID:??? >>824 1)床だけの画像を描画する 2)キャラの足元付近のドットの有無で判定する 3)マップの残りとキャラを上書き描画する http://game.5ch.net/test/read.cgi/gamedev/1005040025/830
831: 名前は開発中のものです。 [sage] 02/10/29 00:05 ID:??? >>828 ひっかかったら辿りかたを反転させれば? http://game.5ch.net/test/read.cgi/gamedev/1005040025/831
832: 824 [] 02/10/29 00:24 ID:UKOhyL2z >>830 ワンダーウィッチなのでそうもいかないのですよ…。すみません。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/832
833: 821 [sage] 02/10/29 00:28 ID:??? >>831 やはりそれしかないですかねぇ…(汗 下手したら明らかに違う方向へ歩いていって、引っかかったら 今気付いたように遠回りをする…なんかスマートじゃなくないですか(・-・;; http://game.5ch.net/test/read.cgi/gamedev/1005040025/833
834: 名前は開発中のものです。 [sage] 02/10/29 00:32 ID:??? >>833 それじゃ内部的に表示より先行して動かしておいて、未来の自分が 引き返してきたらその場で反転するようにすれば多少マシになるのでは。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/834
835: 821 [sage] 02/10/29 00:34 ID:??? あーなるほどぉ…それもそうですね どうもありがとうございます。試してみます。(_ _ http://game.5ch.net/test/read.cgi/gamedev/1005040025/835
836: 名前は開発中のものです。 [sage] 02/10/29 01:11 ID:??? >>824 マップの床が碁盤の目のようになっていて、床の升目が全て同じ大きさ 同じ形であるなら、床の升目と全く同じ形状のイメージデータを配列 などで用意して、升目の座標と判定点の座標からイメージ内に対応する 座標を求め、その座標の点がセット状態であれば当たりとする。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/836
837: 名前は開発中のものです。 [sage] 02/10/29 01:19 ID:??? >>828 一番いいのは、袋小路にならないマップを作ることですが。 そうもいかない、というなのなら、下の図みたいにマップを 大きなブロック(エリア)に分けてやるとか。 (いつかこの板で公開された進路探索方法) A1 A2 A3 ___ ____ / \ ■ |B2 |○ B1 \_/ B3 C1 C2 C3 B1 → C1 → C2 → C3 → B3 http://game.5ch.net/test/read.cgi/gamedev/1005040025/837
838: 837 [sage] 02/10/29 01:21 ID:??? うわー、直したはずが大きくずれた。 すまん。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/838
839: 名前は開発中のものです。 [sage] 02/10/29 02:19 ID:??? >>821 1:現在位置から目的地までの直線を引く 2:その直線が障害物と交差していたら交差した点から 移動できる方向へ直線を引いてみる(左右どちらにも行けるならどちらも) 3:枝分かれした線分はできるかぎり目的地へ向かうように折り曲げていく 4:現在の走査位置と目的地とを結ぶ直線が 走査線の角度と同じになったら1へ戻る N:先に目的地にたどり着いた方が正解ルート 折れ曲がった位置と角度を配列に保存しておけば それをトレースするだけ 計算中も枝分かれする直前までの移動をしていけば 迷路にでも迷い込まない限りそれほど時間はかからない http://game.5ch.net/test/read.cgi/gamedev/1005040025/839
840: 名前は開発中のものです。 [sage] 02/10/29 02:20 ID:??? 図解するとこう ____________ /_,,. \-─●目的地 ☆-─''''''''│~ │ ↑\__/ 交差点 ____________ /_,,. \-─●目的地 ☆-─'''''''|.│~ │ iヽ\__/ : \ できるだけ目的地の方向へ : \→ ____________ /_,,. \-─●目的地 ☆-─'''''''|.│~ │ / iヽ\__/ / : \__/ http://game.5ch.net/test/read.cgi/gamedev/1005040025/840
841: 名前は開発中のものです。 [sage] 02/10/29 06:41 ID:??? >820 解放したポインタにNULL代入するのは作法でしょう。 どうしてもめんどうなら、ちょっと気持ち悪いけど free_something (void **p) { free(*p); *p=NULL; } func() { free_something(&p); //p=NULL } でいいのでは。 というか、そういうところで面倒くさがる人はC++を使うべきでは。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/841
842: 名前は開発中のものです。 [sage] 02/10/29 07:51 ID:??? なんでややこしい方へ向かうかなぁ… _______■=キャラ ○=クリックした場所 / \ ■| |○ \_/ A ひっかかりそうなところにはポインタを作っておく。 ■から○へ行く時、間にポインタがあれば まずそこへ向かうようにする。 ■ | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| | A | | | |________| ○ ポインタの捜索範囲はキャラ→クリック間の長方形。 以上! http://game.5ch.net/test/read.cgi/gamedev/1005040025/842
843: 821 [sage] 02/10/29 07:52 ID:??? ttp://isweb43.infoseek.co.jp/art/yn515/game2.gif 例えば、こういう場面でカーソルのあるところをクリックすると 池の周りを遠回りして歩いていきます。 ですが、このゲームのすごいところはカクカクした動きじゃなくて ちゃんと池の形にぴったり沿って歩いていくということです。 もしよろしければ、実際にやってみていただけませんでしょうか? 見たほうが早いと思いますので… isweb43.infoseek.co.jp/art/yn515/kyran.zip pc9801です。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/843
844: 名前は開発中のものです。 [sage] 02/10/29 09:31 ID:??? 障害物のまわりにガイドラインのような情報をもたせて、 それに沿って移動するようにすれば? http://game.5ch.net/test/read.cgi/gamedev/1005040025/844
845: 名前は開発中のものです。 [sage] 02/10/29 11:30 ID:??? 今まで考えもしなかった方法がいろいろ出てくるんでおもろい。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/845
846: 名前は開発中のものです。 [sage] 02/10/29 12:45 ID:??? ________ |\_______\ | │ ___________ | | │|タマちゃん失踪?|│ | │| ,,,,,,,, ,,,,,,,,,、 |│ | │l (゚∀゚) ,jj゚ー゚jjj |│ | │|l´ lyl`l l´ : `i |│ | │` ̄ ̄ ̄ ̄ ̄ ̄ | │ | l ̄ ̄ ̄:l: ̄ ̄ ̄l | \| l___:l:___l |  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ __________ ||\ \ ||\\ まずかったかな・・・ || \\ ────y──── \\ ____ ∧ ∧∧__\ ゚ 。 .゚ チャプ \||______ (゚ ≡;゚Д)_____|| ,. -‐/⌒ヽ ─- 、 チャプ || | ヽ. || (〜ミ(ω・` \〜 ,) || ヽ___) || | ` ー‐-ミU -─‐'´ | \ ヽ、..,,_ _,,.ノ  ̄ ̄ http://game.5ch.net/test/read.cgi/gamedev/1005040025/846
847: [sage] 02/10/29 13:09 ID:??? >>821 ttp://www.campus.ne.jp/~ishigami/CREATION/MAKING/index.html を読むと多少はイメージできるかも。 2次元配列でマップを管理しているのなら,再帰関数っていうのを使って 考えていくんだけど(うまく言ったときのうれしさといったら・・・), 他の方法で管理しているとなると,上で書いているような方法しかないかな。 2次元配列を用意して,障害物のある座標に1とか入れて,再帰関数を使えばいいとは思うけど。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/847
848: [sage] 02/10/29 13:10 ID:??? >>846 まずいと思う。 こっそりかえしてきな。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/848
849: 755 [sage] 02/10/29 13:58 ID:??? >>771 759さん、ありがd。 これをヒントにがんばってみます。 >>791 ターゲット&要件によっては両立できない場合もあるんでつよ。(つД`) http://game.5ch.net/test/read.cgi/gamedev/1005040025/849
850: 名前は開発中のものです。 [sage] 02/10/29 20:23 ID:??? >>823 "A star algorithm" で再検索。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/850
851: 名前は開発中のものです。 [sage] 02/10/29 20:32 ID:??? ttp://www.geocities.com/jheyesjones/astar.html http://game.5ch.net/test/read.cgi/gamedev/1005040025/851
852: 名前は開発中のものです。 [sage] 02/10/29 20:44 ID:??? >>841 > 解放したポインタにNULL代入するのは作法でしょう。 気休めに過ぎない作法なんか、やめとけよ……。 だいたい複数のポインタが同一の領域を指している環境では、そんな手は 使えないし。 > どうしてもめんどうなら その程度の「手間」で済むのは free_something() なんてオモチャみたいな コードだから。現実に面倒なデータ構造を操作するコードだと、そんな単純 にはいかんよ。 特にデータ構造が複雑な場合には、そのデータを辿るのがクリティカルパス になるケースが多い(逆にクリティカルじゃなければ、そんな頑張って面倒 なデータ構造をメンテナンスなんかしないで、単純配列を全部検索、とかで 済ませられる)。 そこで「すべての要素に pointer の pointer を持たせて、二回 dereference しましょう」ってのはかなり厳しいよ。 > というか、そういうところで面倒くさがる人はC++を使うべきでは。 全部 boost::shared_ptr にするとか? それは性能上の問題に加えて、解放の タイミングを計るのが難しくなる(解放したつもりが、余計なところで shared_ptr が一つ生きてた、とか)という問題がある。 もちろん「ここで最後の筈」ってことで assert() 入れてチェックすることはでき るんだが、assert() に引っかかったときに じゃあ、いったいどこで参照が残ってるんだ? っつーのは、やっぱり探すのが大変だよ。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/852
853: 名前は開発中のものです。 [sage] 02/10/30 00:06 ID:??? >>852 >そこで「すべての要素に pointer の pointer を持たせて、二回 dereference >しましょう」ってのはかなり厳しいよ。 PalmOSの開発環境では、ヒープメモリを確保するときにポインタのポインタしかくれない (OS側でガベコレするため)のだけど、それでもなんとかなっているのは興味深い。 ポインタのポインタで生きていくための知恵が、Palm界では蓄積されてるのかもね。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/853
854: 名前は開発中のものです。 [sage] 02/10/30 00:13 ID:??? >>853 それはコンパクションしたいからだろう。Win16 のグローバルヒープとか、昔の MacOS とかもお仲間。 まっとーな MMU が使えない環境でもメモリの断片化が防げる代わりに、デ バッグと処理速度に悪影響が出る。智恵というか、血と汗が蓄積されてると 思われ。 (俺も Win16 時代には泣いた覚えが) http://game.5ch.net/test/read.cgi/gamedev/1005040025/854
855: 名前は開発中のものです。 [sage] 02/10/30 00:33 ID:??? >852 俺の場合、free後NULL代入してないだけで怒られたもんだが……。 二重ポインタっても、C言語に参照がないから代用してるだけだ。 参照で実装してもいいかもね。値渡しでfreeする関数に渡した つもりのfree後のポインタが実は参照渡しで暗黙でNULLに 書き換わっていたとして、なんら問題あるまい? むしろ、解放後のポインタにアクセスするという潜在的バグをつぶせる。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/855
856: 名前は開発中のものです。 [sage] 02/10/30 00:49 ID:??? >>855 > 参照で実装してもいいかもね C++ の参照のことを言ってるなら、初期化のタイミングの制約がキツいから、 完全にポインタの代用にはならんよ。 ポインタの実体を一つにして、常にポインタのポインタを使え主義が破綻す るのは、「そのポインタの実体を解放してしまったら、やっぱり不正なメモリ アクセスが検出できない」っつートコロなんだよな。そのための細工を積み 重ねると、結局 GC 実装した方が確実って話になる。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/856
857: 名前は開発中のものです。 [sage] 02/10/30 01:01 ID:??? >856 いや、freeに一個ラッパーを掛けて、そこへ渡すポインタを 参照渡しにして関数内でNULLを代入しようってだけのことね。 実際はメモリをマネジメントするクラスなり関数郡なり作って GCをそこで実装したほうがいい、っていうのにはもちろん同意。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/857
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 129 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.016s