[過去ログ]
ゲームプログラミング相談室 (986レス)
ゲームプログラミング相談室 http://game.5ch.net/test/read.cgi/gamedev/1005040025/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
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
858: 名前は開発中のものです。 [sage] 02/10/30 01:49 ID:??? >>857 > いや、freeに一個ラッパーを掛けて、そこへ渡すポインタを > 参照渡しにして関数内でNULLを代入しようってだけのことね。 それでは不正なメモリアクセスの問題は解決しないんだけど。実例が 想像つかない? http://game.5ch.net/test/read.cgi/gamedev/1005040025/858
859: 名前は開発中のものです。 [sage] 02/10/30 02:18 ID:??? >858 もともと不正なメモリアクセスは別問題。それは単にバグ。 >818を読む限り、単に解放済みポインタとそうでないポインタで 条件分けしたくないだけなら、NULLを代入すればいい。 NULLは解放済みを示すマークで、free(NULL)が素通りという 仕様はそのためにある。 ループのある枝分かれリストみたいのを解放するケースを 考えてるんだろうけど、そこまで来ると各ノードを直接freeで 解放しにいくのは無理でしょう。削除マーク付けといて、 後でGCで一括解放するしかない。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/859
860: 名前は開発中のものです。 [sage] 02/10/30 07:39 ID:??? 正直、メモリ管理は人間がやるべき仕事ではないような気がしますた。 生産性低くなる原因の一端。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/860
861: 名前は開発中のものです。 [sage] 02/10/30 08:46 ID:??? しかし明示的に開放する機能が無いとメモリが無駄になり、下手すると 足りなくなる罠。メモリ確保の機能がある限り人間が管理するしかない。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/861
862: 名前は開発中のものです。 [sage] 02/10/30 09:22 ID:??? 2重開放はエラー出たりしてすぐ発見できるからあまり問題にならない ような気がする。メモリリークは表面化しにくいから厄介なバグになるが。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/862
863: 846 [sage] 02/10/30 12:54 ID:??? 素通り・・・ http://game.5ch.net/test/read.cgi/gamedev/1005040025/863
864: 名前は開発中のものです。 [sage] 02/10/30 20:43 ID:??? >>862 > 2重開放はエラー出たりしてすぐ発見できるからあまり問題にならない そうでもない。 メモリ関係の問題はどれもそうなんだが、問題が出たときと原因が遙か彼方に 隔たってることが多い (二重 free なら一回目の free はどこで行ったんだ?) から、原因を突き止めるのは大変だよ。特に微妙な条件でのみ発生するとか、 マルチスレッドや DMA が絡むと死ねる。 >>859 818 はそもそも「free() しなくても良いやん」つー例のような気がする。その メモリ領域をプロセス内で再利用するなら free すべきだけど、コンパイラ の型システムの情報なんかは、 コンパイルが終わった時点でプロセス終了させるから、ちまちま free せずに 投げ捨てろ っつー情報だよな。 そこで労力をかけて free() したところで、 1. コンパイラのプロセスが終了するのを遅らせる 2. キャッシュを汚す 3. あまつさえ二重 free() なんてバグを埋め込んで SIGSEGV を食らった日には、 ただのバカ だろう。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/864
865: 名前は開発中のものです。 [sage] 02/10/31 00:04 ID:??? >864 一回目のfreeは、無効なデータを解放するつもりでやってるんだろ? それを問題が起こらないようにとただ消してしまうのは、 無効なデータへの不正なアクセスを隠してしまうだけだと思うが。 NULLポインタで明示的エラーを出させたほうが、安全。 落ちないバグの原因探すほうがよっぽどやっかいだろう。 こまめな解放はいらないとしても、一応プロセスの最後には明示的に 解放してやるべきだと思うが。 VC++だと、メモリリークが大量に警告されてうっとおしくない? http://game.5ch.net/test/read.cgi/gamedev/1005040025/865
866: 名前は開発中のものです。 [sage] 02/10/31 00:17 ID:??? boost::shared_ptrとSTLのコンテナを使えばいいのに... http://game.5ch.net/test/read.cgi/gamedev/1005040025/866
867: 名前は開発中のものです。 [sage] 02/10/31 09:37 ID:??? C#を使え http://game.5ch.net/test/read.cgi/gamedev/1005040025/867
868: 名前は開発中のものです。 [sage] 02/10/31 16:06 ID:??? ません http://game.5ch.net/test/read.cgi/gamedev/1005040025/868
869: 名前は開発中のものです。 [sage] 02/10/31 18:22 ID:??? か? http://game.5ch.net/test/read.cgi/gamedev/1005040025/869
870: 名前は開発中のものです。 [sage] 02/10/31 19:45 ID:??? チョトマテ! ココハ、 ゲームプログラミング相談室 デツヨ! http://game.5ch.net/test/read.cgi/gamedev/1005040025/870
871: 名前は開発中のものです。 [sage] 02/10/31 20:02 ID:??? >>865 状況によるだろう。アセンブラのラベル情報とか 864 が言ってるようなコンパイラ の型情報とかは、free したところで直後にプロセスが終了するのが目に見えてる ので、free せずに終わらせるのもアリだ。 そこで free しても単なる自己満足。ユーザにとっては、むしろ邪魔なだけ。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/871
872: 名前は開発中のものです。 [sage] 02/11/01 00:07 ID:??? >871 ちょいまち、ユーザの「邪魔」って、具体的にはなんのことだ? ユーザには関係ない、というのなら分かるんだが。 あとでメンテナンスする人のこと考えたらメモリリークつぶすくらいは 常識だと思うがな。大量の警告メッセージに埋もれて、つぶすべき メモリリークが見えにくくなる。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/872
873: 名前は開発中のものです。 [sage] 02/11/01 00:32 ID:??? >>872 > ちょいまち、ユーザの「邪魔」って、具体的にはなんのことだ? キャッシュを汚すわ、終了に(本来不要なはずの)余計な時間を食うわ、 開発コストは上がるわ。 > あとでメンテナンスする人のこと考えたらメモリリークつぶすくらいは > 常識だと思うがな。 プロセスの寿命とデータの寿命が一致してる場合にはメモリリークとは言わん だろ。メモリリークというのはその名の通り「漏れ」であって、使えないメモリ領 域が増えることを指すわけで。 > 大量の警告メッセージに埋もれて _CrtSetDbgFlag() なんかが実装してる「終了時に free してないメモリ領域の 一覧を表示する」機能のこと? あれはそれなりに便利だが、万能じゃない。 (っつか BoundsCheker 使え) http://game.5ch.net/test/read.cgi/gamedev/1005040025/873
874: 名前は開発中のものです。 [sage] 02/11/01 00:44 ID:??? >873 OSに暗黙的に解放してもらったって時間は掛かるだろ。 開発コストったって、ただメモリ確保に一枚ラッパーかませて 最悪の場合でも終了処理で明示的に解放されるように作るだけだろ。 その「万能じゃない」機能をさらに使いにくくしてどうするのだ。 俺は引き継いだソースがメモリリーク放置していたら、 ちょっとウンザリするがな。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/874
875: 名前は開発中のものです。 [] 02/11/01 00:54 ID:26Va0gRH この流れに便乗して質問させてください。 VC++でシューティングゲームを作っているのですが、敵や弾をたくさん表示させては 消すために、メモリをnew、deleteしまくっているのです。 ところが、実行しているとすぐに重くなってしまいます。 メモリリークに関しては、デバッグモードで _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF) を呼び出して確認したのですが、一つもありませんでした。 これって、ちゃんと解放していても、メモリの確保が原因で重くなることってあるのですか? ちなみに、表示させたオブジェクト(newしたインスタンス)の数に比例して 重くなっていくことは確認しました。 http://game.5ch.net/test/read.cgi/gamedev/1005040025/875
876: 名前は開発中のものです。 [sage] 02/11/01 01:02 ID:??? >>875 > 表示させたオブジェクト(newしたインスタンス)の数に比例して それって、ふつうに処理量が増えてるんじゃないの? http://game.5ch.net/test/read.cgi/gamedev/1005040025/876
877: 名前は開発中のものです。 [sage] 02/11/01 01:23 ID:??? >>875 敵や弾の画面表示だけしない場合も重くなるか? http://game.5ch.net/test/read.cgi/gamedev/1005040025/877
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 109 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.015s