トップページgamedev
1001コメント280KB

やね本発売

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。02/06/01 20:01ID:Ffonx4Fc
LAOX Book館逝ったら、やねうらおの本が売ってました。
という訳で、とりあえず立ててみました。
0103名前は開発中のものです。02/06/02 20:52ID:???
こういうはなしじゃないの?

------------------
foo1 = new ...
+++++-------------
foo2 = new ...
+++++****---------
foo3 = new ...
+++++****#####----
delete foo2;
+++++----#####----
0104名前は開発中のものです。02/06/02 20:53ID:???
そんなコードがあるなら最初からmallocなんか存在 しねーよ

ハァ?
0105名前は開発中のものです。02/06/02 20:54ID:???
>>103
そういうときはfoo4をnewするときにfoo2の領域を再利用すれば良いだけ。
0106名前は開発中のものです。02/06/02 20:55ID:???
>>101
物凄くハズカチー発言なんですが、あなた頭大丈夫ですか?

new/deleteをオーバーライドして固定長のバッファを割り当ててやればいいだけ。
01078902/06/02 20:55ID:???
99は違う人です。

>>100
分断化に(?)つけてる奴に説明できる自信はありません。
とりあえず、Google 検索である程度いけるみたいだからそっちに逝ってくれ。
キーワードは ヒープ フラグメンテーション だ。
Windows好きなら「喜びと苦悩」とかも読んだらいいかモナぁ。
0108名前は開発中のものです。02/06/02 20:55ID:???
>>102
ヒープオンリーでメモリ管理できるなんてメモリを最大まで使わない
ギャルゲーぐらいじゃねーの?シーン毎に複雑なテクスチャやモデル
の入れ替えが発生するタイプのゲームではメモリなんてあっというま
にズタズタだよ。
01099902/06/02 20:56ID:???
>100
すまん、「プログラミング言語C」を出したのは煽りでは無くてAlloc
の書き方が載ってるんですよ。何ページかは忘れましたが。
もちろん一度newとdeleteしただけでは問題ないですよ。
01108902/06/02 20:57ID:???
>>106
その「固定長のバッファ」はどこからとってきて、いつ開放されます?
もしかして静的メモリですか?
01119902/06/02 20:58ID:???
そして「メモリの分断化」って一般的な用語じゃないのね。
混乱させてすまぬ。
0112名前は開発中のものです。02/06/02 20:58ID:???
>分断化に(?)つけてる奴に説明できる自信はありません。

すまないね。漏れは断片化って言うもんだと思ってたから、
分断化が一般なのか?って意味で(?)をつけた。
0113名前は開発中のものです。02/06/02 20:58ID:???
はっきりさせておくが、Windowsプログラマが全員、やねさまみたいなプログラマじゃねーぞ。
0114名前は開発中のものです。02/06/02 21:00ID:???
つーか>>86がヒープ云々を持ち出すから
訳がわからなくなった。
0115名前は開発中のものです。02/06/02 21:01ID:???
>>114
もちっと、勉強すれ。
0116名前は開発中のものです。02/06/02 21:01ID:???
>>110
機種依存で良いなら(スタック上など)どのようにでも
0117名前は開発中のものです。02/06/02 21:02ID:???
>>108
だからさぁ、一つのヒープで全部管理しようというのがそもそも間違いなわけよ。
テクスチャ用ヒープ、モデル用ヒープ、タスク用ヒープ、エフェクト用ヒープ、制御用ヒープ
それぞれ固定長で確保してその中でやりくりするわけ。
またシーンの切り替えなどで定期的にリセットしてやるわけ。
ゲームの進行に関わる重要な部分はスタティックなメモリを使えば良いだけ。
0118名前は開発中のものです。02/06/02 21:03ID:???
自前メモリマネージャでゲーム中にいつでも断片化状態を見れるようにしてる。
まあタイトな部分はすでメモリプールにしちゃっていたものの、
心配しすぎては損だとの印象を得た。
0119名前は開発中のものです。02/06/02 21:04ID:???
>116
そういう事ではないよ
君のアロケーターはサイズ指定が出来なくて、必ず同じ大きさの
メモリしか取れんのか?
0120名前は開発中のものです。02/06/02 21:04ID:???
やね様の本にヒープを前提にすると書いてありましたか?
たとえ書いてあったとしても、それは些細な問題で、
メモリさえ確保できればヒープ上だろうが静的領域だろうが問題じゃありません。
望みのままに逝けます。それを言語の機能やライブラリでサポートした物が
STLのアロケータだったり、newとdeleteのオーバーライドだったりします。

それから、好きな位置に確保できる配置newという構文も用意されてます。
01218902/06/02 21:05ID:???
>>112
あー、そういうことでしたか。
まぁ簡単な例だと、 >>102 あたりだとおもいます。
>>116
粘着ですんませんが、
どのように取ってきたメモリでも、固定長バッファとして割り当てられるような
new/deleteのオーバーロードの仕方を教えてください。
0122名前は開発中のものです。02/06/02 21:05ID:???
メモリ、メモリ、ってうるせーなー

メモリリークしたくらいで、プログラムが止まるわけねーだろ。
01238602/06/02 21:05ID:???
>>114
申し訳ないです。ここまでの流れを見てもらえば解るようにコンスマ
とウインにはメモリ管理に大きな壁があるのですよ。それはもう実績
から来る理論なのでここであーだこーだゆーても決着はつかんですね。

で、自分の目から見てコードサイズが膨れ上がるstlをベースにライブ
ラリ設計していたりとか、メモリへの危機感が少ないなーと。ただそ
れだけの感想です。

もちろん一般的なWinプログラマはちゃんと諸々の問題に真剣に取り組
んでいる事ぐらいは知っていますよ。(エログラマは怪しいが)
0124名前は開発中のものです。02/06/02 21:06ID:???
>117
やね本には、そんな高度な事は書いてないに違いない。
0125名前は開発中のものです。02/06/02 21:07ID:???
>>115

>>79はWinプログラマはメモリ管理が杜撰だと言ってるのに対して
>>86がヒープ使ってるから駄目だと言い出したのが原因じゃん。
メモリ管理と銘打つ以上スタックだろうがヒープだろうが
リークは起こるんだよ。
プログラム側で、スタックの上のあるメモリ領域が使用中だと判断すれば
他の目的には使えないことには変わりないんだから。
0126名前は開発中のものです。02/06/02 21:08ID:???
>>110
静的メモリでも、動的メモリでもお好きなように。
4byte要求されても、224byte要求されても256byteずつ割り当ていれば断片化は起こらんでしょ。
256byte以上要求されたら、NULLを返す。

当たり前だけど、汎用には使えないから対象となるクラスのnew/deleteだけをオーバーライドするんだけどね。
0127名前は開発中のものです。02/06/02 21:11ID:???
>122
>メモリリークしたくらいで、プログラムが止まるわけねーだろ。

メモリリークは >79 が、
>エロゲーでメモリーリーク起こして止まる奴とかが多い理由がよーく 解ったよ。
と知ったかぶりしてるだけなので、無視しときましょ。
0128名前は開発中のものです。02/06/02 21:12ID:???
>>123
今後は特殊な例を出してそれを一般化するのはヤメレ
0129名前は開発中のものです。02/06/02 21:13ID:???
>126も十分特殊だと思うが。
0130名前は開発中のものです。02/06/02 21:13ID:???
ゲ製板にmalloc論争スレがないのが前から気になってたんだよな
0131名前は開発中のものです。02/06/02 21:14ID:???
>>127
 いや、いろんなものの開放し忘れで止まるエロゲー多いよ。
大体は発売後のパッチで直るけどね。79は単純にそういう危機感の
無さを指摘してるだけだとおもうよ。ねぇ、やねうらおさん?
0132名前は開発中のものです。02/06/02 21:15ID:???
そりゃコンシューマとWinではメモリの使い方に対して方針が違ってきて当たり前でしょう
0133名前は開発中のものです。02/06/02 21:15ID:???
>>121
class Texture
{
 static void* heap;
 size_t index;
public:
 inline operator new(size_t size)
 { return static_cast<char*>(heap) + index; }
 operator delete();
};
void* Texture::heap = (望みのままに);
こんな感じでテクスチャごとだったり、モデルごとにヒープを確保できて、
勿論operator newの中身は書く。

void* global_heap = (利用可能なメモリすべて);
として、グローバルなoperator newを定義すればすべての管理を掌握出来、

char buf[0x1000];
new(buf) Object;
これでbuf上にオブジェクトを作成できる。

C++の基礎中の基礎
0134名前は開発中のものです。02/06/02 21:16ID:???
つーかコンピューターの進化って
大局的には、STLとかそういう便利な機能を
使えるようにする為にあると思うんだよなぁ。
文句を言うべきなのは、クラシックな方法を強いる
環境の方だよ。
0135名前は開発中のものです。02/06/02 21:17ID:???
smart_ptr等にはつかっちゃいけない場面があって、
それを知らないとハマるかもしれないことは分かります。
で、real smart pointerはそのへんの心配はないのでしょうか?
0136名前は開発中のものです。02/06/02 21:18ID:???
>>131
頼むから名前を挙げてくれ。
解放し忘れただけで止まるプログラムなんか知らない。
メモリを食いつぶすだけだろ。
(Winにおいて)リソースリークは深刻だが。
0137名前は開発中のものです。02/06/02 21:18ID:???
そもそもこの言い争いは、「GTLは日本最強」とか言い出した人がいたから
発生した気がする。
ライブラリスレも同じように荒れた記憶があるのだが。
0138名前は開発中のものです。02/06/02 21:18ID:???
Windowsプログラムはメモリーが無限大であることが前提
足りなければ増設してください、貧乏人
0139名前は開発中のものです。02/06/02 21:19ID:???
>>134
そうゆう方向に進化した唯一のハードであるXBOX様がいま命の灯火を消そ
うとしているところなのでヒープとの果てしない争いは終わる事が無いと
思われ。
0140名前は開発中のものです。02/06/02 21:19ID:???
boost::shared_ptr等に代表される参照カウント式のスマートポインタは、
巡回参照にさえ気をつけていれば問題ない(リークは起きない)。
real smart pointerって何か知らないんだけど、GCのサブセットか何か?
0141名前は開発中のものです。02/06/02 21:19ID:???
富豪的プログラミングはゲームにおいてはやはりまだ厳しいのか
0142名前は開発中のものです。02/06/02 21:20ID:???
>136
だから、知ったか厨は無視しましょ。
0143名前は開発中のものです。02/06/02 21:21ID:???
つーか俺はスマートポインタなんぞ使いたいと思ったことがないなぁ。
確保したら開放する、これの方がすっきりして気持ちイイじゃん。
皆さんはどう?
0144名前は開発中のものです。02/06/02 21:22ID:???
>>129
オヤジが良く使う、固定長バッファのタスクシステムと何が違うのかと小一時間・・・。
0145名前は開発中のものです。02/06/02 21:22ID:???
>>137
それって78の記事?
直接この流れには関係ないと思うが。
事実、裏男のライブラリよりもNxDrawよりもVafxImg(だっけ?)よりも
素晴らしいテンプレートの使い方をしていると思うよ、GTLは。
0146名前は開発中のものです。02/06/02 21:22ID:???
>>142
イタタ…。
0147名前は開発中のものです。02/06/02 21:22ID:???
STLってデバッカで追う時めんどくさくない?
漏れはそれだけの理由で避けてます(笑。

毎回似たようなクラス(双方向リストとか)書くのは
確かに効率悪いけど、自分の勉強の為には結構
役立ったと思うのだが。
0148名前は開発中のものです。02/06/02 21:24ID:???
>>140
0xffffffff回以上の参照が起こった場合は大丈夫なの?
あと、循環参照ってどこで発生するかわからないから怖いね。
相互参照ぐらいなら把握可能なのだが。
014914302/06/02 21:24ID:???
ああでもSTLは使ってるなあ。
あれもスマートポインタみたいなもんだなあ。
>>143は撤回しまぷ。
0150名前は開発中のものです。02/06/02 21:24ID:???
>>147
勉強にはなるだろうけど、実際に使うときは広く使われているものの方が
問題があるのかどうかが分かってていいでしょ(いろんな人の目に触れてるわけだから)
0151名前は開発中のものです。02/06/02 21:24ID:???
>>147
漏れの場合、はじめはSTLは無条件に正しいと信じてStepOverしてます。
で、どうしても解決しないときのみSTLの内部にStepInします。

>>146
142が痛いなら、メモリの解放し忘れで落ちるプログラムを上げてください。
別に市販のエロゲでも人命に関わるシステムでもかまいません。
0152おらうねや02/06/02 21:25ID:???
おまえら本買ってね、よろしこ!
0153名前は開発中のものです。02/06/02 21:25ID:???
アクセスバイオレーションはメモリリークに入る?
0154名前は開発中のものです。02/06/02 21:26ID:???
本の内容以上に高度なスレになっている
0155名前は開発中のものです。02/06/02 21:26ID:???
>>147
俺の場合逆。
STL自体にはバグがないことが保障されているから、安心して使える。
毎回似たようなクラスを書いていると、そこにいつバグが入るかわからないから不安。
0156名前は開発中のものです。02/06/02 21:26ID:???
結構スレが伸びたが、どれくらい売上に貢献するのだろう・・・
0157名前は開発中のものです。02/06/02 21:29ID:???
>>151
 何をムキになってんだか。

>>解放し忘れただけで止まるプログラムなんか知らない。

 これがイタイってだけですが?
0158名前は開発中のものです。02/06/02 21:29ID:???
>>153
入りません。ってか、ネタ?
0159名前は開発中のものです。02/06/02 21:31ID:???
アクセスバイブレーションで彼女に参照すると、液体がリークします
が、何か?
0160名前は開発中のものです。02/06/02 21:37ID:???
>これがイタイってだけですが?

解放忘れだけで止まるプログラムあるんですか?
マジでわからん。
0161名前は開発中のものです。02/06/02 21:40ID:???
>>160
1、スワップ大量に発生して、止まったように見える
2、newしたところ、NULLが返ってきて、NULL参照で落ちる。
のどっちかかと。
0162名前は開発中のものです。02/06/02 21:40ID:???
>>157
ま、そうムキにならずに。

エロゲなんで、プラットフォームはWinを前提に話すけど、
深刻なリソースリークを除いて、メモリリーク程度で止まるようなことはまずないよ。

強制終了するのは、ほとんどアクセス違反じゃねーの?
固まるってのは、ループの終了条件ミスってるとか。
マルチスレッドのゲームも珍しくないけど、デッドロックしてるのもあったし。
0163名前は開発中のものです。02/06/02 21:45ID:???
っていうか、なんで「メモリリーク」ごときでこんなに盛り上がれるのか、理由を言ってみろ。
0164名前は開発中のものです。02/06/02 21:45ID:???
>>161
1 普通はDMA転送になるから、スワップアウト程度でアプリが固まることはまず無い(9xは知らん)
2 それはリークではなくて、エラーリカバリが甘いだけ。
0165名前は開発中のものです。02/06/02 21:47ID:???
>>163
断片化の話題が終了したから(内心は79が謝らないから 藁)
0166おらうねや02/06/02 21:47ID:???
>>163
房やだからさ
016715702/06/02 21:48ID:???
>>162
 んにゃ、なんかスレの流れ上メモリリークの件が何故か漏れに
押し付けられてるんだけど、別にエロゲ云々言い出したのは別の
人なんだよね。

 まぁそれはともかく、止まる止まらないはともかく、メモリリーク
なんて恥ずかしい物を止まらないからOKってのがイタイなと思っただけ。
0168名前は開発中のものです。02/06/02 21:50ID:???
>>164
ハードディスクのスワップ領域を全部食い尽くしたら止まりそうな気が・・・。
0169名前は開発中のものです。02/06/02 21:50ID:???
>止まらないからOKってのがイタイなと思っただけ
だれもこんな事言ってないって。
79の記事から読めば分かるだろう
017016202/06/02 21:52ID:???
>>167
>メモリリークなんて恥ずかしい物を止まらないからOKってのがイタイなと思っただけ。
誰もそんなこと言ってませんがな(w

「メモリリークで止まるエロゲが多い」って言葉に、つっこんでるだけだと思ってたけど。
0171名前は開発中のものです。02/06/02 21:53ID:???
>>168
その時はネット空間にでもスワップさせますから
大丈V!!
0172名前は開発中のものです。02/06/02 21:53ID:???
>>169
ハードディスクのスワップ領域を食いつぶさなくても
ユーザーアドレスの空間をすべて(2Gだっけ?)食いつぶせば、
それ以上スワップは増えずにメモリは確保できなくなる。
確保できなくなるから、NULLが返ったり例外が発生したりする。
それを適切に処理出来ないから固まる。
適切に処理できているなら、いきなり固まらずに何かしらアクションを起こしてくるはず。
0173名前は開発中のものです。02/06/02 21:55ID:???
>172
まぁ、そこまで大量にメモリリークするゲームってのは滅多に無いけどね
0174名前は開発中のものです。02/06/02 21:56ID:???
>>172
メモリ確保するたびにNULLチェックをするような神経質な奴が、
そんな深刻なメモリリークを起こすとは思えない。
0175名前は開発中のものです。02/06/02 21:56ID:???
>>172
2G食いつぶすほどのメモリリークて・・。
メモリリークっていうよりメモリ堤防大決壊って感じ。
017615702/06/02 21:56ID:???
>>170
んじゃ根本的に論点がずれてるね。すまんそ。

ちなみにあたいは数キロの開放し忘れでメモリが確保できなくなる
環境でお仕事していますものでその辺シビアなのですよ。実はちょっ
と羨ましかったり。
0177名前は開発中のものです。02/06/02 21:57ID:???
>>176
そんなシビアな環境でヒープなんて使うなよという気がする。
0178名前は開発中のものです。02/06/02 21:58ID:???
>>176
ぴゅー太ですか?(ワラ
0179名前は開発中のものです。02/06/02 21:59ID:???
>>173-175
その通りだけど、メモリリークが原因で落ちると言うことの反論として(藁
実際に、そこまで激しくリークしてもリークが原因で死ぬことはないと。
0180名前は開発中のものです。02/06/02 22:04ID:rOylPC2c
スレと関係なくて申し訳ないのですが、助けてください。
VC++6.0でSTLを使おうと思ったのですが、サンプルに書いてある
通り
vector<int> test;
test.push_back( 42 );
と書いたらNULLでFreeして落ちるのですが。
どうも
_Firstも_Lastも_EndもNULLみたいなんですが。
0181名前は開発中のものです。02/06/02 22:06ID:???
>>180
F r e e す ん な タ コ

            解決
018218002/06/02 22:07ID:rOylPC2c
いえ、STL内部でFreeしてるので、もうにもこうにも。
0183名前は開発中のものです。02/06/02 22:09ID:???
NULLでFreeするってなんだ?
0184名前は開発中のものです。02/06/02 22:10ID:???
殺伐としたスレの流れを癒してくれた180に感謝。
それにしてもヒープ談義はプログラム板でも毎回盛り上がるねぇ。
0185名前は開発中のものです。02/06/02 22:11ID:???
>>180
君、事実を述べてないんじゃないの?
本当にint?
ポインタだったりするんじゃないの?
018618002/06/02 22:15ID:rOylPC2c
>185
いや、本当にこれしか書いてません。
どうも
vector<int> test;
と書いた時点で入れるデータ用にメモリを確保してないらしく、
test.push_back(42)
の中で末端を見てるのですが、末端は0x00000の割に何もチェック
をしてないみたいです。
0187名前は開発中のものです。02/06/02 22:16ID:???
SP当ててる?
018818002/06/02 22:17ID:rOylPC2c
>187
SP4を当ててます。
01898902/06/02 22:19ID:???
>>133
わざわざ、ありがとう。
派生、配列確保などを禁止してよい場合なら、そんな感じでいけます。
負け惜しみっぽい突っ込みでごめんよ。
もうこのスレではこの手の話はしないよ。
0190名前は開発中のものです。02/06/02 22:20ID:???
つーかさ、勝手に内部の_Firstとかをみてるわけ?
一度 test.begin() とかやってイテレータを生成してみたら?
0191!02/06/02 22:22ID:eI2bw8kM
http://www.twin.ne.jp/~ackey/
0192名前は開発中のものです。02/06/02 22:24ID:???
>派生、配列確保などを禁止してよい場合なら
頭、固いね。
0193名前は開発中のものです。02/06/02 22:25ID:???
include から、main からすべてのソースを書け。
そこ以外に原因があるとしか思えん
019418002/06/02 22:28ID:rOylPC2c
すいません、原因がわかりました。
STL以外にもライブラリを使ってるのですが、それがdeleteを
オーバーライドしてまして、それが悪さをしてたみたいです。
でも、FreeにNULLが渡る事は変らないです。
そういう仕様みたいですね。

大変お騒がせしました。
もう帰って寝ます。
0195名前は開発中のものです。02/06/02 22:29ID:???
>>130
そーなのか
この板あまり見ないけど、他板と同様に思い出したように
これと同じ話題・同じ展開を月1くらいでやってそうなイメージがある
0196名前は開発中のものです。02/06/02 22:30ID:???
>>194
そんなのやる前から予想できることじゃんか(藁
0197名前は開発中のものです。02/06/02 22:31ID:???
メモリリークより、ファイルをオープンしっぱなしのほうが深刻だと思うぞ。

(って、もう鎮火しちゃったのね…残念
0198名前は開発中のものです。02/06/02 22:32ID:???
>>195
たててみようか。Win対コンシューマの暑い論争キボン
0199おらうねや02/06/02 22:33ID:???
>>198
そゆことするから厨房ってゆうんよ
0200名前は開発中のものです。02/06/02 22:35ID:???
>>198
いや、辞めようよ。プラットフォームが違うんだから問題点も違う
のは当たり前で
「メモリリークぐらいじゃ止まらんわボケ」
「メモリ断片化の恐怖を知らんのかボケ」
の両意見が相容れる事なんてありえない。
0201名前は開発中のものです。02/06/02 22:37ID:???
>>198
中途半端な知識を用いた香ばしい戦いの予感


  糞 ス レ 立 て る な
020219802/06/02 22:42ID:???
http://game.2ch.net/test/read.cgi/gamedev/1013512099/l50
ウフフフ
■ このスレッドは過去ログ倉庫に格納されています