[過去ログ]
ゲームプログラミング相談室【Part5】 (970レス)
ゲームプログラミング相談室【Part5】 http://echo.5ch.net/test/read.cgi/gamedev/1036410116/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
415: 名前は開発中のものです。 [sage] 03/11/15 16:51 ID:JXJsuPxy 議論白熱中のところお邪魔します この度アクション系ゲームを作ろうと思い立ちました これまではボード系ゲームのリアルタイム性の少ないプログラムしかしたことのないため 複数のキャラが同時に動いて判定をする、そんな仕組みの作り方に戸惑いを覚えています そこで質問なのですが、開発環境の関係からこのプログラムにC言語を使っています メモリ管理が不十分な動作環境なのでに動的なメモリの確保、開放を行うと 意図しない領域へのメモリアクセスが起こりハングする可能性を考えて オブジェクト指向の言語を使わないようにしています しかし、このようなオブジェクトが多いプログラムの場合 やはり各キャラ毎にオブジェクトを作成しながら出ないと、個々の動作制御や 判定、動作制限などの関連付けが上手くできません なにか良い方法、教科書、参考書などありましたらお教えください http://echo.5ch.net/test/read.cgi/gamedev/1036410116/415
418: 名前は開発中のものです。 [sage] 03/11/15 18:51 ID:ptxA9sKP >>415 ぜひJavaで >意図しない領域へのメモリアクセスが起こりハングする プログラムを書いてみてください。 提出期限はおとといということでお願いします。 http://echo.5ch.net/test/read.cgi/gamedev/1036410116/418
419: 415 [sage] 03/11/15 19:30 ID:JXJsuPxy >416 説明が不十分でしたね 動的なメモリの確保を行うと使用しているメモリ総量、位置が確実に算出できないため 実装していないメモリ領域への確保が起こりハングアップするということです >417 たとえC++であってもNew演算子等動的なメモリ確保命令を使用しないのであれば C言語で十分ではないかとおもいC言語を使用することにしました >418 可能ならJavaでの開発をしたいのですが 使用したいCPU用のクロスコンパイラが手に入らないのと OSによって保護されてない環境でのプログラムなので 動的なメモリ確保、開放をプログラマ側で監視、調整しないといけません このような用途には不向きな言語だと思い使用を断念しました プログラム自身は簡単です 実装メモリ以上の領域を確保すればよいだけですので そんなプログラムでもいいのでしょうか? http://echo.5ch.net/test/read.cgi/gamedev/1036410116/419
421: 415 [sage] 03/11/15 19:57 ID:JXJsuPxy >420 >メモリ管理が不十分な動作環境なのでに動的なメモリの確保、開放を行うと これでは説明不足でしたか^^; http://echo.5ch.net/test/read.cgi/gamedev/1036410116/421
424: 415 [sage] 03/11/15 20:04 ID:JXJsuPxy >>422 質問の回答に必要な情報とは思えなかったので 特に明記しませんでした OSというものは存在しません あるらしいのですが使うつもりはありません ハードウエアはかなり昔に生産中止となったドリームキャストです http://echo.5ch.net/test/read.cgi/gamedev/1036410116/424
426: 415 [sage] 03/11/15 20:36 ID:JXJsuPxy >425 質問に答えれば回答が得られるのでしょうか? コンパイラはフリーのgccのSH4クロスコンパイラを使っています ミドルウエアと呼べるようなものはありません 機器の制御関係はすべて自分で作ることになります http://echo.5ch.net/test/read.cgi/gamedev/1036410116/426
433: 415 [sage] 03/11/16 02:57 ID:2l7gzWNA >428 >Javaゼンゼン分かってない >C++もゼンゼン分かってない プログラムを専門に勉強したことがないため 十分に理解してるとは言えないので何か思い違いをしているのでしょうか? どの部分がどのような理解不足をしているのか勉強のためにお教えください >429 >432 new、mallocをオーバーライドするって考えは思いつきませんでした 確保したメモリアドレスを随時監視して未実装メモリの場合 エラーとして返すようにすればいいのですね ちょっと考えてみます >430 簡単にいえばそうなのですが いつもはOSやコンパイラのメモリ管理に頼り切ってるので オブジェクトに必要なメモリ量、その配置が実際どうなってるのか知らないのです http://echo.5ch.net/test/read.cgi/gamedev/1036410116/433
434: 415 [sage] 03/11/16 02:58 ID:2l7gzWNA 続き 少し前に同じような質問をプログラム板でもしたのですが 「メモリ管理機構を自前で作れ」という答えで終わってしまいました 数年前流行っていた時期に作ってみたときには用意するオブジェクト数が少なく 完璧とはいえませんが、何とかプログラマ側で管理しきれていました。 しかし、今回の企画にあわせてオブジェクトの数を増やしていくにしたがって 「どの状況下でどの程度の量がどの部分に配置されて使用されるのか」 が、把握できなくなってしまいました そこで、ゲーム系プログラムならこのような多数のオブジェクトを使用する例が多いため 自分の知らない「ちょっとしたテクニック」であえて動的にオブジェクトを量産しなくても 静的、もしくは準静的な確保によって乗り越えることができるのでは? はたまたオブジェクトを量産することなく動作させる方法があるのでは? と思い質問してみた次第です やはり根本的にコンパイラ自身を書き換えて問題のないメモリ確保の方法を確立する といった考え方のほうがスマートだという意見ばかりですので こちらの方向で考えてみようと思います http://echo.5ch.net/test/read.cgi/gamedev/1036410116/434
440: 415 [sage] 03/11/16 12:57 ID:2l7gzWNA >>435 コンパイラを書き換えるという表現はよくなかったですね^^; gccをつかっているとオープンソースであることの利点でコンパイラやライブラリ 今回の場合だとLibcあたりを簡単に書き換えれるのでオーバーライドするよりも 直接書き換えるほうが面倒がすく問題点がわかり易いので、そんな風に考えていました >436 その最適なメモリ管理の方法を教えてもらいたかったのです どういうソフトか?はオブジェクトをメモリ一杯まで量産するようなタイプって事なのですが >437 たしかに今のOSとCPUとコンパイラに守られてかつメモリが豊富にある 現在の開発環境の状況からみれば、動的なメモリ管理自身をを疑って あえて静的な方法を取ろうとする事は、時代に逆行しているような意見かもしれません しかし、必要なオブジェクトを作成しようとして正常に動作せず その原因がメモリが足りず実装外のアドレスに確保している などということがあるため この部分が解決されないとメモリ不足で動かないのか それともバグで動かないのか把握できません すくなくとも最低限の規則を作らないとダメなのではないでしょうか? もっと簡単に質問するならば みなさんは動的なメモリ確保で問題がでたとき たとえばNew演算子を使った場合にエラーがでたとき どのように対処しているのでしょうか? http://echo.5ch.net/test/read.cgi/gamedev/1036410116/440
441: 415 [sage] 03/11/16 13:05 ID:2l7gzWNA >435 JAVAもインタプリタ、コンパイラ、JavaVMがそのCPUに対応していないと 動かないと思うのですが、それとも自分の知らない別のJAVA言語があるのでしょうか? C++とC言語の根本的な違いはクラスオブジェクトを使用するオブジェクト指向型言語に 進化していると言うことだと理解していたのですが? それとも、オブジェクト指向型言語はオブジェクト自身の完成度が高ければ 用意したオブジェクトを動的に追加,開放することで コードの簡易化、開発効率の向上が見込めるが 生成されるオブジェクトにとって十分なメモリ領域が必要である といった認識がまちがっているのでしょうか? こちらはスレ違いなので・・・スルーしてもらってもよいです http://echo.5ch.net/test/read.cgi/gamedev/1036410116/441
442: 名前は開発中のものです。 [sage] 03/11/16 14:13 ID:DmkNbY6h >>415 自分で作ったメモリの動的確保なの?違うでしょ? それなのに、そのメモリの動的確保がおかしいなんて言ってるのが房っぽい。 そもそもドリキャスで使える前提の物なのかな? PS2だってee-gccって専用のコンパイラがあるのに、まさか普通のgcc使って ドリキャスで上手く行かないって騒いでるの? その開発が正規の手続きで不正な方法を使用してないならSEGAに相談すれば良いだろ。 仕事なら当然だろ。 http://echo.5ch.net/test/read.cgi/gamedev/1036410116/442
446: 415 [sage] 03/11/16 15:02 ID:2l7gzWNA >442 使用しているCPUが汎用のSH4ですのでsh4のgccノクロスコンパイラを使用しています node,メモリ確保の方法malloc等はそのまま使えるもの(言語付属のもの?)を使っています 不正かどうかはまだはっきりしていませんが、正規の手続きでないので SEGAに相談のはもってのほか、開発環境を明らかにするのもためらいます もちろん、趣味でやってるだけなので仕事なわけではありません >443 全然関係ない問題といわれる意味がわかりません みなさんのメモリ管理の意識はどうなっているのでしょう? OSによってメモリ領域が保護されている場合ならともかく >ロードしないとオブジェクトが正しくロードできてるか どうかもわからない は普通に起こりえる事態だと思うのですが、なにが間違ってるのでしょうか? >444 べつに環境のせいやコンパイラのバグで騒いでいるわけではありません 問題がでるので別の回避方法を模索しているだけです 問題なく動くのであれば理論が判らなくて言語がなんでも気にしません >445 専門に勉強していないので表現が正しくなく混乱を招くのは申し訳ないです クロスコンパイラが必要というはその動作環境で動くように動作設定することと 大雑把に括って表現しました JavaでいうのであればもちろんそのCPU用のJavaVMが必要なので ということです http://echo.5ch.net/test/read.cgi/gamedev/1036410116/446
449: 415 [sage] 03/11/16 15:27 ID:2l7gzWNA すこし、話題がズレてきてしまっているので もう一度整理しなおして質問しようと思います OS等によってメモリ領域が管理されていない かなり特殊な動作環境でのプログラムをしています そのためメモリの確保、開放については プログラム側で常に注意しないといけないと思っています 特にコード的には確保できる領域も実際には 実装されていない事も考慮にいれないといけません 静的なメモリ確保方法ではコンパイル時に確保位置が把握できるため 問題をみつけることが簡単です しかし、動的なメモリ確保では変動するメモリ状況にあわせて 確保位置,量が変化するためプログラム側で逐次チェックするのが難しいです つづく http://echo.5ch.net/test/read.cgi/gamedev/1036410116/449
450: 415 [sage] 03/11/16 15:27 ID:2l7gzWNA 現在考えている企画はシューティングゲームのような 同時制御するキャラの多いプログラムです 各キャラを一つのオブジェクトとして構築したため 多種多なオブジェクトを量産する必要がでてしまいました このときオブジェクトの生成によって確保された動的メモリの 状況把握が十分できない為コンパイル時には問題がなさそうでも 実際動かしてみるとメモリ状況によって動作しない事があります このような場合、問題なく動かすためには どのような仕組みを最低限用意しないといけないのでしょう? 現状では動的メモリの確保時に成功、失敗にかかわらずエラーは起きませんが エラーであることを示すように改良することが可能かもしれません が、できればその仕組みを作らなくても良い方法を教えていただきたいです 使用してるコンパイラはgccのSH4用クロスコンパイラです http://echo.5ch.net/test/read.cgi/gamedev/1036410116/450
452: 415 [sage] 03/11/16 15:29 ID:2l7gzWNA >447 すみません、なぜ重要なのかが判りません 「一度溢れるまで」にはどのような意味が含まれているのでしょうか? http://echo.5ch.net/test/read.cgi/gamedev/1036410116/452
453: 名前は開発中のものです。 [sage] 03/11/16 15:56 ID:DmkNbY6h >>415 話を聞いてると、その症状自体が疑わしい。 その動的メモリ確保はシステムコールなのか? OS無いって言ってが、その状況で >確保された動的メモリの 状況把握が十分できない で、どうやって動的メモリ確保してるの? 環境は全部把握出来てるのか? 自分のバグで動かないのを、メモリの所為にしてるとしか感じられん。 http://echo.5ch.net/test/read.cgi/gamedev/1036410116/453
458: 415 [sage] 03/11/16 17:05 ID:2l7gzWNA 議論が「メモリ確保が失敗するわけがない」というその一点に絞られているようですが どうやら、OSの無い状況下でのプログラムというのが 理解してもらえないようですね^^; 携帯電話、炊飯器などの組み込み機器などようなイメージで捕らえて貰えると わかりやすいかと思います >453 OSが存在しないのでメモリを確保するのにAPI等は使用しません 自由にメモリを使える反面、エラーが起きているのかも判断できません 自分で勝手に確保して勝手に開放します 正確にはmallocを定義しているLibcのコードにしたがって確保開放を行います >454 オブジェクトはコードとデータの集合体という理解は間違ってないですよね? 「オブジェクトを量産する」という表現に誤解があるようですね これは同じインスタンスのコピーを作るということです 一つ目のオブジェクトは仮にロードすることが出来たとしましょう 一つだけなら問題なく動作することが確認できます 次に、このオブジェクトを量産することにします このオブジェクトに含まれるコード部分は共有できますが 含まれるデータについてはその独立性を保たないといけないので共有できません そこでオブジェクトを量産するためには、追加されたオブジェクト用に 逐次動的にメモリを確保していくことになると思います しかし今回の環境のような場合動的なメモリを確保できなかった場合に 成功したのか失敗したのかがわかりません とりあえず確保成功したことにして動作を開始しますが 実は不確定なエリアのメモリを確保していたりすると正常に動作しません 専門用語についての知識が薄く表現が曖昧で申し訳ありません http://echo.5ch.net/test/read.cgi/gamedev/1036410116/458
459: 415 [sage] 03/11/16 17:15 ID:2l7gzWNA >457 まったくおっしゃる通りでこのまま作成するのは無理のある状況だと思います しかし、無理を承知でなんとかこじつけながら作成していこうと考えています プログラム自身が単純でメモリの残量についてあまり考慮しなくていい場合は 難しいメモリアロケートの心配などせずに、まさに適当に勝手に確保することで それなりのモノが作れました が、それでは上手くいかない事態に陥ったので、みなさんの知恵をかりにきた次第です メモリとハードの仕様は不完全ながらも、使える程度には理解しているつもりです http://echo.5ch.net/test/read.cgi/gamedev/1036410116/459
460: 名前は開発中のものです。 [sage] 03/11/16 17:16 ID:DmkNbY6h >>415 ああ、君のレベルが理解出来たよ。 システムコールって分る? >自分で勝手に確保して勝手に開放します それがバグと言うか、決定的な間違い。 じぁ、メモリが実アドレス以外を確保するのは ”自分のバグじゃん” そのバグ直せよ。 http://echo.5ch.net/test/read.cgi/gamedev/1036410116/460
464: 415 [sage] 03/11/16 17:53 ID:2l7gzWNA >460 あまりレベルの高い話でなくてすみません 「システムコール」は MS-DOSでいうシステムコール WindowsシリーズでいうWin16、Win32API もっとローレベルでいうならBIOSコールのことだと推察したのですが? 違っていたのでしょうか? OSが存在せずメモリ確保のためにシステム側から用意された関数が無い場合 自分でメモリを確保しないといけないと思います そのメモリ確保方式に問題があり、異常の原因となることは理解しているのですが そのための良い解決方法が見つからないので相談にきました >461 メモリ確保の方法についてはgccのmallocをそのまま使用しているので gccのNewlib内のlibcのなかにmallocのコードがあるのでソレを参考にしてください メモリマップ自身は不完全ながら資料としてあるので 「ほんとに使えない領域なのか」は判りませんが「問題なく使える領域」は判ります 「どういう基準で確保可能領域を割り当てるんだろうか?」 まったく同じ疑問をもっています この環境においての動的なメモリ確保については完全に信頼できないと考えています そこで動的なメモリ確保をすることなく、オブジェクトを量産したいのです 一番初めの投稿の形にもどってしまいましが^^; http://echo.5ch.net/test/read.cgi/gamedev/1036410116/464
465: 名前は開発中のものです。 [sage] 03/11/16 18:02 ID:DmkNbY6h >>415 OSが無いのにライブラリのmallocを使ってるのがありえない。 >まったく同じ疑問をもっています >この環境においての動的なメモリ確保については完全に信頼できないと考えています 完全に自分に責任がある部分でこの発言では 君には無理だからプログラムを辞めなよ。趣味だろうがねってしか言えない。 http://echo.5ch.net/test/read.cgi/gamedev/1036410116/465
468: 名前は開発中のものです。 [sage] 03/11/16 18:15 ID:shoK9bJg >>415 やっと具体的な環境が出てきたね。 ↓で聞いたほうが早いかもしれない。最近は止まってるから見てる人がいるのか分からんが。 そして僕はもういちど夢をみる[DCPrograming] http://pc2.2ch.net/test/read.cgi/gamedev/1014389313/ newlibのmallocに問題があるって聞いたこと無いけど、本当なの? http://echo.5ch.net/test/read.cgi/gamedev/1036410116/468
469: 415 [sage] 03/11/16 18:18 ID:2l7gzWNA >465 mallocの実装自身にOSは関係ないと思います mallocの性能には関係するとおもいますが 一番単純な実装は指定された量確保してポインタをずらすだけですから 大雑把にいって今つかっているmallocのコードはそうなっています 「ありえない、出来ない、出来るようにしろ」の議論ばかりで 「問題を回避するためにどう工夫したらよいのか?」については意見がもらえないようですね どうも、OSのない環境でのプログラムについての議論はここでは出来ないようなので どこか別のスレッドを探して質問してみることにします お騒がせしました http://echo.5ch.net/test/read.cgi/gamedev/1036410116/469
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.026s