Re: DX アーカイブについて ( No.1 ) |
- 名前:softya(ソフト屋) 日時:2014/03/11 21:46
実行ファイルが巨大化するのですが、それはよろしいのでしょうか?
つまり、常駐メモリ用がすごく増えます。
|
Re: DX アーカイブについて ( No.2 ) |
- 名前:ジンセイ 日時:2014/03/11 23:52
実行ファイルが「巨大化」するかは使用するリソースのサイズに因ります
メモリ使用量が「すごく」増えるかどうかも同様です
|
Re: DX アーカイブについて ( No.3 ) |
- 名前:管理人 日時:2014/03/12 01:16
DXライブラリ内部にはメモリ上に展開されたDXアーカイブを扱うための
機能が既にあります
ただ、それは通常のDXアーカイブの機能である
『DXアーカイブをファイルシステム上のフォルダに見立てる』
というものではなく、メモリ上のDXアーカイブから指定のファイルが
格納されているメモリアドレスとファイルサイズを取得するだけの機能や、
せいぜい FileRead_open, FileRead_read, FileRead_close でファイル内容に
アクセスする程度の機能しかありません
その機能だけでも問題ないとのことでしたら直ぐに使うことができますが、
そうではなくメモリ上に展開されたDXアーカイブをファイルシステム上の
フォルダに見立てる機能をご所望でしたら、まだ機能が無いので実装するだけの
お時間を頂くことになります
|
Re: DX アーカイブについて ( No.4 ) |
- 名前:ジンセイ 日時:2014/03/12 18:50
返信ありがとうございます。
こちらの希望と致しましては、
ファイルかメモリかの違いを意識せずに FileRead*、LoadGraph*、LoadSound* などの関数を、
ファイル版DXアーカイブと同じインターフェース(ファイルパス渡し)で使用出来ればと思っています。
お時間がある時にでも対応して頂けるとうれしい限りでございます。
お手数おかけしますが、宜しくお願いいたします。
|
Re: DX アーカイブについて ( No.5 ) |
- 名前:管理人 日時:2014/03/16 11:18
メモリ上に展開したDXアーカイブを特定のパス上に存在するものとして扱うための関数を追加しました
よろしければこちらのバージョンをダウンロードしてください
http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用
http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
追加した関数は以下の二つです
// メモリ上に展開されたDXAファイルを指定のファイルパスにあることにする
// ( EmulateFilePath は見立てる dxa ファイルのパス、
// 例えばDXAファイルイメージを Image.dxa というファイル名で c:\Temp にあることにしたい場合は
// EmulateFilePath に "c:\\Temp\\Image.dxa" を渡す、
// SetDXArchiveExtension で拡張子を変更している場合は EmulateFilePath に渡すファイルパスの拡張子も
// それに合わせる必要あり )
int DXArchiveSetMemImage( void *ArchiveImage, int ArchiveImageSize, const TCHAR *EmulateFilePath, int ArchiveImageCopyFlag = FALSE ) ;
// DXArchiveSetMemImage の設定を解除する
int DXArchiveReleaseMemImage( void *ArchiveImage ) ;
DXArchiveSetMemImage でメモリに読み込んだDXアーカイブを EmulateFilePath で指定する
ファイルパスにあることにすることができます、
必要がなくなった場合は DXArchiveReleaseMemImage でその設定を解除します
ArchiveImageCopyFlag を TRUE にすると ArchiveImage の内容を丸ごとコピーして使用するので、
DXArchiveSetMemImage の直後に ArchiveImage が示すメモリ領域を解放してしまっても大丈夫になります
( が、コピー用のメモリ確保とそのメモリ領域へのコピーの処理が発生します )
こちらにサンプルプログラムを載せておきますので、よろしければご覧ください
// C:\Game\DataFile\Image.dxa を C:\Temp に存在することにしたあと、Image.dxa の中の PlayerImage.bmp を読み込む
#include "DxLib.h"
#include <malloc.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )
{
int GrHandle ;
int FileHandle ;
void *FileImage ;
int FileImageSize ;
ChangeWindowMode( TRUE ) ;
if( DxLib_Init() == -1 )
return -1;
// DXアーカイブファイルを丸ごとメモリに読み込む
FileImageSize = FileRead_size( "C:\\Game\\DataFile\\Image.dxa" ) ;
FileImage = malloc( FileImageSize ) ;
FileHandle = FileRead_open( "C:\\Game\\DataFile\\Image.dxa" ) ;
FileRead_read( FileImage, FileImageSize, FileHandle ) ;
FileRead_close( FileHandle ) ;
// 読み込んだDXアーカイブファイルを C:\Temp に存在することにする
DXArchiveSetMemImage( FileImage, FileImageSize, "C:\\Temp\\Image.dxa" ) ;
// C:\Temp\Image.dxa の中の PlayerImage.bmp を読み込む
GrHandle = LoadGraph( "C:\\Temp\\Image\\PlayerImage.bmp" ) ;
// 読み込んだ画像を画面に描画する
DrawGraph( 0, 0, GrHandle, FALSE ) ;
WaitKey() ;
// C:\Temp に存在することにする設定を解除する
DXArchiveReleaseMemImage( FileImage ) ;
// 読み込むために確保したメモリを解放する
free( FileImage ) ;
DxLib_End() ;
return 0 ;
}
|
Re: DX アーカイブについて ( No.6 ) |
- 名前:ジンセイ 日時:2014/03/16 19:21
早速のご対応ありがとうございます。
確認してみましたが printfDx が正常に表示出来ないようです。
それともう一つ問題があるのですが、
実行ファイルにDXアーカイブを埋め込んだ場合、
リソースが ROM に配置されているようで、
ArchiveImageCopyFlag を TRUE にするとメモリアクセス違反が起こってしまいました。
そうなると実行ファイルにDXアーカイブを埋め込んだ場合、
リソースサイズの倍メモリを使うことになってしまいます。
DXArchiveSetMemImage では ArchiveImage をコピーせず、
LoadGraph 等の関数が呼ばれた時に指定されたファイルだけを
その時にコピーするという風に出来ないでしょうか?
宜しくお願い致します。
|
Re: DX アーカイブについて ( No.7 ) |
- 名前:ジンセイ 日時:2014/03/16 19:22
すみません誤記がありました。
- ArchiveImageCopyFlag を TRUE にするとメモリアクセス違反が起こってしまいました。
+ ArchiveImageCopyFlag を FALSE にするとメモリアクセス違反が起こってしまいました。
|
Re: DX アーカイブについて ( No.8 ) |
- 名前:管理人 日時:2014/03/21 22:14
> 確認してみましたが printfDx が正常に表示出来ないようです。
すみません、不具合を確認しました、修正しました
> 実行ファイルにDXアーカイブを埋め込んだ場合、
> リソースが ROM に配置されているようで、
> ArchiveImageCopyFlag を TRUE にするとメモリアクセス違反が起こってしまいました。
渡したファイルイメージの内容を書き換えるかどうかを指定する引数を追加しました
int DXArchiveSetMemImage(
void *ArchiveImage,
int ArchiveImageSize,
const TCHAR *EmulateFilePath,
int ArchiveImageCopyFlag = FALSE,
int ArchiveImageReadOnly = TRUE // ←こちら
) ;
デフォルトではイメージを書き換えないようにしました
よろしければ上記の変更と printfDx の修正をしたこちらのバージョンをお試しください
http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用
http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用
http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』を、VCをお使いの場合は『リビルド』を、
Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
|
Re: DX アーカイブについて ( No.9 ) |
- 名前:ジンセイ 日時:2014/03/22 12:36
修正ありがとうございます!
問題なく動作しています。
管理人様の丁寧で迅速な対応に感謝致します。
ありがとうございました。
|