[過去ログ] ゲームプログラミング相談室【Part5】 (970レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
415
(22): 03/11/15 16:51 ID:JXJsuPxy(1/5) AAS
議論白熱中のところお邪魔します

この度アクション系ゲームを作ろうと思い立ちました
これまではボード系ゲームのリアルタイム性の少ないプログラムしかしたことのないため
複数のキャラが同時に動いて判定をする、そんな仕組みの作り方に戸惑いを覚えています

そこで質問なのですが、開発環境の関係からこのプログラムにC言語を使っています
メモリ管理が不十分な動作環境なのでに動的なメモリの確保、開放を行うと
意図しない領域へのメモリアクセスが起こりハングする可能性を考えて
オブジェクト指向の言語を使わないようにしています

しかし、このようなオブジェクトが多いプログラムの場合
やはり各キャラ毎にオブジェクトを作成しながら出ないと、個々の動作制御や
判定、動作制限などの関連付けが上手くできません
なにか良い方法、教科書、参考書などありましたらお教えください
418
(1): 03/11/15 18:51 ID:ptxA9sKP(1/4) AAS
>>415
ぜひJavaで
>意図しない領域へのメモリアクセスが起こりハングする
プログラムを書いてみてください。
提出期限はおとといということでお願いします。
419
(1): 415 03/11/15 19:30 ID:JXJsuPxy(2/5) AAS
>416
説明が不十分でしたね
動的なメモリの確保を行うと使用しているメモリ総量、位置が確実に算出できないため
実装していないメモリ領域への確保が起こりハングアップするということです

>417
たとえC++であってもNew演算子等動的なメモリ確保命令を使用しないのであれば
C言語で十分ではないかとおもいC言語を使用することにしました

>418
可能ならJavaでの開発をしたいのですが
使用したいCPU用のクロスコンパイラが手に入らないのと
OSによって保護されてない環境でのプログラムなので
動的なメモリ確保、開放をプログラマ側で監視、調整しないといけません
このような用途には不向きな言語だと思い使用を断念しました

プログラム自身は簡単です
実装メモリ以上の領域を確保すればよいだけですので
そんなプログラムでもいいのでしょうか?
421: 415 03/11/15 19:57 ID:JXJsuPxy(3/5) AAS
>420

>メモリ管理が不十分な動作環境なのでに動的なメモリの確保、開放を行うと
これでは説明不足でしたか^^;
424: 415 03/11/15 20:04 ID:JXJsuPxy(4/5) AAS
>>422
質問の回答に必要な情報とは思えなかったので
特に明記しませんでした

OSというものは存在しません
あるらしいのですが使うつもりはありません
ハードウエアはかなり昔に生産中止となったドリームキャストです
426: 415 03/11/15 20:36 ID:JXJsuPxy(5/5) AAS
>425
質問に答えれば回答が得られるのでしょうか?

コンパイラはフリーのgccのSH4クロスコンパイラを使っています
ミドルウエアと呼べるようなものはありません
機器の制御関係はすべて自分で作ることになります
433: 415 03/11/16 02:57 ID:2l7gzWNA(1/12) AAS
>428
>Javaゼンゼン分かってない
>C++もゼンゼン分かってない
プログラムを専門に勉強したことがないため
十分に理解してるとは言えないので何か思い違いをしているのでしょうか?
どの部分がどのような理解不足をしているのか勉強のためにお教えください

>429
>432
new、mallocをオーバーライドするって考えは思いつきませんでした
確保したメモリアドレスを随時監視して未実装メモリの場合
エラーとして返すようにすればいいのですね
ちょっと考えてみます

>430
簡単にいえばそうなのですが
いつもはOSやコンパイラのメモリ管理に頼り切ってるので
オブジェクトに必要なメモリ量、その配置が実際どうなってるのか知らないのです
434
(2): 415 03/11/16 02:58 ID:2l7gzWNA(2/12) AAS
続き

少し前に同じような質問をプログラム板でもしたのですが
「メモリ管理機構を自前で作れ」という答えで終わってしまいました

数年前流行っていた時期に作ってみたときには用意するオブジェクト数が少なく
完璧とはいえませんが、何とかプログラマ側で管理しきれていました。
しかし、今回の企画にあわせてオブジェクトの数を増やしていくにしたがって
「どの状況下でどの程度の量がどの部分に配置されて使用されるのか」
が、把握できなくなってしまいました

そこで、ゲーム系プログラムならこのような多数のオブジェクトを使用する例が多いため
自分の知らない「ちょっとしたテクニック」であえて動的にオブジェクトを量産しなくても
静的、もしくは準静的な確保によって乗り越えることができるのでは?
はたまたオブジェクトを量産することなく動作させる方法があるのでは?
と思い質問してみた次第です

やはり根本的にコンパイラ自身を書き換えて問題のないメモリ確保の方法を確立する
といった考え方のほうがスマートだという意見ばかりですので
こちらの方向で考えてみようと思います
440
(1): 415 03/11/16 12:57 ID:2l7gzWNA(3/12) AAS
>>435
コンパイラを書き換えるという表現はよくなかったですね^^;
gccをつかっているとオープンソースであることの利点でコンパイラやライブラリ
今回の場合だとLibcあたりを簡単に書き換えれるのでオーバーライドするよりも
直接書き換えるほうが面倒がすく問題点がわかり易いので、そんな風に考えていました

>436
その最適なメモリ管理の方法を教えてもらいたかったのです
どういうソフトか?はオブジェクトをメモリ一杯まで量産するようなタイプって事なのですが

>437
たしかに今のOSとCPUとコンパイラに守られてかつメモリが豊富にある
現在の開発環境の状況からみれば、動的なメモリ管理自身をを疑って
あえて静的な方法を取ろうとする事は、時代に逆行しているような意見かもしれません

しかし、必要なオブジェクトを作成しようとして正常に動作せず
その原因がメモリが足りず実装外のアドレスに確保している
などということがあるため

この部分が解決されないとメモリ不足で動かないのか
それともバグで動かないのか把握できません
すくなくとも最低限の規則を作らないとダメなのではないでしょうか?

もっと簡単に質問するならば
みなさんは動的なメモリ確保で問題がでたとき
たとえばNew演算子を使った場合にエラーがでたとき
どのように対処しているのでしょうか?
441
(1): 415 03/11/16 13:05 ID:2l7gzWNA(4/12) AAS
>435
JAVAもインタプリタ、コンパイラ、JavaVMがそのCPUに対応していないと
動かないと思うのですが、それとも自分の知らない別のJAVA言語があるのでしょうか?

C++とC言語の根本的な違いはクラスオブジェクトを使用するオブジェクト指向型言語に
進化していると言うことだと理解していたのですが?

それとも、オブジェクト指向型言語はオブジェクト自身の完成度が高ければ
用意したオブジェクトを動的に追加,開放することで
コードの簡易化、開発効率の向上が見込めるが
生成されるオブジェクトにとって十分なメモリ領域が必要である
といった認識がまちがっているのでしょうか?

こちらはスレ違いなので・・・スルーしてもらってもよいです
442
(1): 03/11/16 14:13 ID:DmkNbY6h(1/8) AAS
>>415
自分で作ったメモリの動的確保なの?違うでしょ?
それなのに、そのメモリの動的確保がおかしいなんて言ってるのが房っぽい。

そもそもドリキャスで使える前提の物なのかな?
PS2だってee-gccって専用のコンパイラがあるのに、まさか普通のgcc使って
ドリキャスで上手く行かないって騒いでるの?

その開発が正規の手続きで不正な方法を使用してないならSEGAに相談すれば良いだろ。
仕事なら当然だろ。
446
(1): 415 03/11/16 15:02 ID:2l7gzWNA(5/12) AAS
>442
使用しているCPUが汎用のSH4ですのでsh4のgccノクロスコンパイラを使用しています
node,メモリ確保の方法malloc等はそのまま使えるもの(言語付属のもの?)を使っています
不正かどうかはまだはっきりしていませんが、正規の手続きでないので
SEGAに相談のはもってのほか、開発環境を明らかにするのもためらいます
もちろん、趣味でやってるだけなので仕事なわけではありません

>443
全然関係ない問題といわれる意味がわかりません
みなさんのメモリ管理の意識はどうなっているのでしょう?

OSによってメモリ領域が保護されている場合ならともかく
>ロードしないとオブジェクトが正しくロードできてるか どうかもわからない
は普通に起こりえる事態だと思うのですが、なにが間違ってるのでしょうか?

>444
べつに環境のせいやコンパイラのバグで騒いでいるわけではありません
問題がでるので別の回避方法を模索しているだけです
問題なく動くのであれば理論が判らなくて言語がなんでも気にしません

>445
専門に勉強していないので表現が正しくなく混乱を招くのは申し訳ないです
クロスコンパイラが必要というはその動作環境で動くように動作設定することと
大雑把に括って表現しました
JavaでいうのであればもちろんそのCPU用のJavaVMが必要なので
ということです
449: 415 03/11/16 15:27 ID:2l7gzWNA(6/12) AAS
すこし、話題がズレてきてしまっているので
もう一度整理しなおして質問しようと思います

OS等によってメモリ領域が管理されていない
かなり特殊な動作環境でのプログラムをしています

そのためメモリの確保、開放については
プログラム側で常に注意しないといけないと思っています
特にコード的には確保できる領域も実際には
実装されていない事も考慮にいれないといけません

静的なメモリ確保方法ではコンパイル時に確保位置が把握できるため
問題をみつけることが簡単です
しかし、動的なメモリ確保では変動するメモリ状況にあわせて
確保位置,量が変化するためプログラム側で逐次チェックするのが難しいです

つづく
450: 415 03/11/16 15:27 ID:2l7gzWNA(7/12) AAS
現在考えている企画はシューティングゲームのような
同時制御するキャラの多いプログラムです
各キャラを一つのオブジェクトとして構築したため
多種多なオブジェクトを量産する必要がでてしまいました

このときオブジェクトの生成によって確保された動的メモリの
状況把握が十分できない為コンパイル時には問題がなさそうでも
実際動かしてみるとメモリ状況によって動作しない事があります

このような場合、問題なく動かすためには
どのような仕組みを最低限用意しないといけないのでしょう?

現状では動的メモリの確保時に成功、失敗にかかわらずエラーは起きませんが
エラーであることを示すように改良することが可能かもしれません
が、できればその仕組みを作らなくても良い方法を教えていただきたいです

使用してるコンパイラはgccのSH4用クロスコンパイラです
452
(1): 415 03/11/16 15:29 ID:2l7gzWNA(8/12) AAS
>447
すみません、なぜ重要なのかが判りません
「一度溢れるまで」にはどのような意味が含まれているのでしょうか?
453
(1): 03/11/16 15:56 ID:DmkNbY6h(3/8) AAS
>>415
話を聞いてると、その症状自体が疑わしい。
その動的メモリ確保はシステムコールなのか?
OS無いって言ってが、その状況で

>確保された動的メモリの 状況把握が十分できない

で、どうやって動的メモリ確保してるの?
環境は全部把握出来てるのか?

自分のバグで動かないのを、メモリの所為にしてるとしか感じられん。
458
(1): 415 03/11/16 17:05 ID:2l7gzWNA(9/12) AAS
議論が「メモリ確保が失敗するわけがない」というその一点に絞られているようですが
どうやら、OSの無い状況下でのプログラムというのが
理解してもらえないようですね^^;
携帯電話、炊飯器などの組み込み機器などようなイメージで捕らえて貰えると
わかりやすいかと思います

>453
OSが存在しないのでメモリを確保するのにAPI等は使用しません
自由にメモリを使える反面、エラーが起きているのかも判断できません
自分で勝手に確保して勝手に開放します
正確にはmallocを定義しているLibcのコードにしたがって確保開放を行います

>454
オブジェクトはコードとデータの集合体という理解は間違ってないですよね?
「オブジェクトを量産する」という表現に誤解があるようですね
これは同じインスタンスのコピーを作るということです

一つ目のオブジェクトは仮にロードすることが出来たとしましょう
一つだけなら問題なく動作することが確認できます

次に、このオブジェクトを量産することにします
このオブジェクトに含まれるコード部分は共有できますが
含まれるデータについてはその独立性を保たないといけないので共有できません
そこでオブジェクトを量産するためには、追加されたオブジェクト用に
逐次動的にメモリを確保していくことになると思います
しかし今回の環境のような場合動的なメモリを確保できなかった場合に
成功したのか失敗したのかがわかりません
とりあえず確保成功したことにして動作を開始しますが
実は不確定なエリアのメモリを確保していたりすると正常に動作しません

専門用語についての知識が薄く表現が曖昧で申し訳ありません
459: 415 03/11/16 17:15 ID:2l7gzWNA(10/12) AAS
>457
まったくおっしゃる通りでこのまま作成するのは無理のある状況だと思います
しかし、無理を承知でなんとかこじつけながら作成していこうと考えています

プログラム自身が単純でメモリの残量についてあまり考慮しなくていい場合は
難しいメモリアロケートの心配などせずに、まさに適当に勝手に確保することで
それなりのモノが作れました

が、それでは上手くいかない事態に陥ったので、みなさんの知恵をかりにきた次第です
メモリとハードの仕様は不完全ながらも、使える程度には理解しているつもりです
460
(1): 03/11/16 17:16 ID:DmkNbY6h(5/8) AAS
>>415
ああ、君のレベルが理解出来たよ。
システムコールって分る?
>自分で勝手に確保して勝手に開放します
それがバグと言うか、決定的な間違い。

じぁ、メモリが実アドレス以外を確保するのは
”自分のバグじゃん”
そのバグ直せよ。
464: 415 03/11/16 17:53 ID:2l7gzWNA(11/12) AAS
>460
あまりレベルの高い話でなくてすみません
「システムコール」は
MS-DOSでいうシステムコール
WindowsシリーズでいうWin16、Win32API
もっとローレベルでいうならBIOSコールのことだと推察したのですが?
違っていたのでしょうか?

OSが存在せずメモリ確保のためにシステム側から用意された関数が無い場合
自分でメモリを確保しないといけないと思います
そのメモリ確保方式に問題があり、異常の原因となることは理解しているのですが
そのための良い解決方法が見つからないので相談にきました

>461
メモリ確保の方法についてはgccのmallocをそのまま使用しているので
gccのNewlib内のlibcのなかにmallocのコードがあるのでソレを参考にしてください
メモリマップ自身は不完全ながら資料としてあるので
「ほんとに使えない領域なのか」は判りませんが「問題なく使える領域」は判ります

「どういう基準で確保可能領域を割り当てるんだろうか?」
まったく同じ疑問をもっています
この環境においての動的なメモリ確保については完全に信頼できないと考えています
そこで動的なメモリ確保をすることなく、オブジェクトを量産したいのです
一番初めの投稿の形にもどってしまいましが^^;
465
(1): 03/11/16 18:02 ID:DmkNbY6h(7/8) AAS
>>415
OSが無いのにライブラリのmallocを使ってるのがありえない。

>まったく同じ疑問をもっています
>この環境においての動的なメモリ確保については完全に信頼できないと考えています
完全に自分に責任がある部分でこの発言では
君には無理だからプログラムを辞めなよ。趣味だろうがねってしか言えない。
468: 03/11/16 18:15 ID:shoK9bJg(1/3) AAS
>>415
やっと具体的な環境が出てきたね。
↓で聞いたほうが早いかもしれない。最近は止まってるから見てる人がいるのか分からんが。

そして僕はもういちど夢をみる[DCPrograming]
2chスレ:gamedev

newlibのmallocに問題があるって聞いたこと無いけど、本当なの?
469
(1): 415 03/11/16 18:18 ID:2l7gzWNA(12/12) AAS
>465
mallocの実装自身にOSは関係ないと思います
mallocの性能には関係するとおもいますが
一番単純な実装は指定された量確保してポインタをずらすだけですから
大雑把にいって今つかっているmallocのコードはそうなっています

「ありえない、出来ない、出来るようにしろ」の議論ばかりで
「問題を回避するためにどう工夫したらよいのか?」については意見がもらえないようですね
どうも、OSのない環境でのプログラムについての議論はここでは出来ないようなので
どこか別のスレッドを探して質問してみることにします
お騒がせしました
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.034s