トップページ > 過去ログ > 記事閲覧
メモリに関する諸質問
名前:dal 日時: 2009/02/21 23:18

 <質問1> DXLibを使って、PSPで動作可能なゲームが作製できると耳にしました。 なので、Windows用に現在作っているものを、PSP移植を視野に入れようと思い、 ネックとなるであろう、動作速度、メモリについて早めに対応しておこうと思い至りました。 そこで、現在作っているものが、速度的、メモリ的に、 PSPにで動作可能かどうか調べたいのですが、どうすれば調べることができるでしょうか。 また、どれくらいだと余裕、どれくらいなら普通、どれくらいなら危険帯と 考えられるものでしょうか。よろしくお願いします。 DQ風の2DなRPGを作っています。マップチップは、 int mapimage[500]=LoadDivGraph("….PNG"); // 画像ファイルを分ける面倒なので多めに int mapdata[256][256]; // 下3桁:最下層 その上3桁:上層 その上1桁:高さを示す値 その上1桁:通行可能フラグ LoadDivGraph("….PNG" , 500 , 10 , 50 , 32 , 32 , mapimage); を、1マスあたりのサイズ24×24〜64×64ぐらいに拡大描画(DrawRotaGraph) ちなみに、関係ありそうだと思ってこんなことしました ・txtファイルから不変データや音楽、画像など一通り読み込んだ後に  DxGetAllocSize( )が返した値は6209265。DxGetAllocNum( )が返した値は872 ・DxAlloc(sizeof(int));を一個したらSizeは4増え、Numは1増えた。 ・グローバル変数を適当にint a = 1; とすることで増やしても  DxGetAllocSize()などの値は変わらなかったので、DxGetAllocSize( )の  値はあまり目安にならないのではないかと考えた。 ・そもそもメモリというものが基本的にわかっていないのが  悪いんだろうなぁと思う今日この頃。 ・タスクマネージャーは約40,000Kの値を示していた。  <質問2> 上記のように読み込んだマップチップ画像は 描画すると拡大率と描画モードによっては、各マスごとに 黒い縁ができてしまいます。描画モードと拡大率を変えずにどうにかなりませんか? 最終手段として、32×32の各チップ画像の隙間に透過色境界線を入れ 33×33にすると縁が消えるのではないかなと考えているのですが…。  <質問3> DXLibで作ったあるプログラムで使用しているグローバル変数を、 DXLib等で作った他のプログラムを使って外部から 値を書き換えることはできますか?  <質問4> 現在単純にLoadSoundMemで再生しているmp3ファイルを、 暗号化した場合、暗号化されたmp3ファイルは、 どのように読み込み、復号化すればよいのでしょうか。

Page: 1 |

Re: メモリに関する諸質問 ( No.1 )
名前: 日時:2009/02/23 09:19

質問1 まず、動作するOSが異なれば 当然メモリの管理方法も異なります。 以下参考程度に。 ・txtファイルから不変データや音楽、  画像など一通り読み込んだ後に  DxGetAllocSize( )が返した値は6209265  DxGetAllocNum( )が返した値は872 この数はDXライブラリが内部でどう管理しているか にもよりますが、メモリのブロックサイズなどの 関係で変化することがありますし、画像を どういう風に分割アロケートしたのかにもよります ・DxAlloc(sizeof(int));を一個したら  Sizeは4増え、Numは1増えた。 これはWindowsでさらにintが32bit=4byteである 環境でAllocateされたからサイズは4byte個数は 1個増えたということでしょう。 # PSPの開発経験はありませんのでPSP上で # intが32bit=4byteであるかどうか私には # わかりませんが。。。 ・グローバル変数を適当にint a = 1; とする  ことで増やしてもDxGetAllocSize()などの値は  変わらなかったので、DxGetAllocSize( )の値は  あまり目安にならないのではないかと考えた。 グローバル変数は静的メモリ領域に確保されます。 静的メモリ領域とはコンパイル時に既にメモリが どこに配置されるかが決まっており、 実行時、一番最初に確保されプログラム終了時まで 残ります。 Allocateとは動的メモリ確保に当たります。 DxGetAllocSize関数の仕様が、動的に確保した メモリ領域のサイズを返すのであればそもそも、 何か勘違いしていると思われる。 ・そもそもメモリというものが基本的にわかっていないのが悪いんだろうなぁと思う今日この頃。 先も書いたように、メモリの構造や管理方法は、 osや環境によって異なります。 そういう使用率などを気にするならば、 動かす実機で検証するのが一番手っ取り早いでしょう ・タスクマネージャーは約40,000Kの値を タスクマネージャのどの値を見たのか 分かりませんが、PSP上では上記の値は 全く関係が無いと考えるべき。 質問2 もう少し具体的に、コードがあると 分かりやすいかもしれませんが、 タイトルと別な内容になりそうなので、 別途質問するほうがいいかもしれません。 質問3 質問されている内容が良く分かりませんが、 同じDXライブラリを使ってるからグローバル変数 が共有されているか?という質問でいいでしょうか Windows95以上の俗にWIN32と呼ばれる環境では メモリはプロセス毎に32ビットOSであれば、 最大4GB(実質3GBくらい)の仮想メモリが割り当て られ、各プロセスは完全に独立しています。 メモリ領域を改変する作業は、同じライブラリを 使っているからといって行えるものではありません #ただし、何度も書きますがPSPが #どうなっているかは分かりませんので #参考程度に。。。 質問4 これも質問の意図が良く見えませんが、 暗号化して保存したなら、読み込んで複合化 すればよいのでは?
Re: メモリに関する諸質問 ( No.2 )
名前:管理人 日時:2009/02/23 14:01

私もご返信します <質問1 DXLibを使って、PSPで動作可能なゲームが作製できると耳にしました。> PSP用DXライブラリ(DXライブラリPortable)は憂煉さんが製作されているものですので、 どの程度のメモリ使用量ならPSPで動作するかどうかは憂煉さんにお問い合わせください (DXライブラリPortable工事現場) http://yureeeeeeeeen.blog79.fc2.com/ DxGetAllocSize ですが、通さんも仰っていますがこの関数は DxAlloc や DxCalloc を使用して 確保されたメモリサイズで、更に DxAlloc や DxCalloc に要求したサイズの合計となっていて 確保メモリを管理するための情報に必要なメモリ容量等は含まれていません なので、実際にアプリがどれだけのメモリを使用しているかという点ではタスクマネージャの プロセス一覧で確認できるメモリ使用量の方が当てになります ただ、こちらもDXライブラリ自体が必要としている情報を格納するためのメモリ容量や プログラム自体を格納するためのメモリ容量も加わっていますので、どちらにしても PSPで動作するかどうかの目安にはなりません (DXライブラリPortableではDXライブラリのプログラムを直接使用してはいないと思いますので) <質問2 読み込んだマップチップ画像は描画すると拡大率と描画モードによっては、各マスごとに黒い縁ができてしまいます> 黒い淵が出る描画モードとはバイリニアフィルタリングのことでしょうか? だとしますと、残念ながらバイリニアフィルタリングの特性上32x32サイズのままでは黒い淵を消すことはできません 対処方法としてdalさんが考案された方法ですが、恐らく今度は黒い淵の変わりに透明な淵ができると思います (バックが黒ならやはり黒い淵になるかも・・・) バイリニアフィルタリングはテクスチャ中の参照する座標に近い4ピクセルのブレンドする というアルゴリズムなので、一番端のピクセルを描画する際に一つ隣のチップのピクセルも 描画結果に影響してしまうという問題があります なので、面倒な方法ですが、この特性を考えて対処する場合は チップのサイズを34x34にして、32x32のチップ画像の周りに1ピクセル分の、チップの端の ピクセルと同じ色のピクセルで構成された枠を用意するしかありません 例:元が4x4のチップの場合 赤青赤赤 緑赤緑緑 青青青青 青青赤緑 ↓ 端の色と同じ色で構成された枠を追加して6x6のチップにする 赤赤青赤赤赤 赤赤青赤赤赤 緑緑赤緑緑緑 青青青青青青 青青青赤緑緑 青青青赤緑緑 <質問3 DXLibで作ったあるプログラムで使用しているグローバル変数を、DXLib等で作った他のプログラムを使って外部から値を書き換えることはできますか?> 通さんが仰られている通り他プロセスの変数に直接値を代入するようなことはできません <質問4 現在単純にLoadSoundMemで再生しているmp3ファイルを、暗号化した場合、暗号化されたmp3ファイルは、どのように読み込み、復号化すればよいのでしょうか。> ファイルを丸ごとメモリに読み込み、複合化した後、LoadSoundMemByMemImage 関数で読み込めば良いと思います // メモリ上に展開されたファイルイメージからハンドルを作成する int LoadSoundMemByMemImage( void *FileImageBuffer, int ImageSize ) ; 独自に暗号化されたファイルをストリーミング再生する手段はDXライブラリには用意されていません・・・

Page: 1 |