トップページ > 記事閲覧
VisualC# 用パッケージのサンプルコードについて
名前:ArtLehock 日時: 2024/01/31 22:24

DXライブラリのダウンロードページ(.../dxlib.xsrv.jp/dxdload.html)の VisualC# 用パッケージ内の Program.cs のサンプルコードでは DX.DeleteGraph(GraphHandle); がありませんが、本来は必要なのではないでしょうか? int GraphHandle = DX.LoadGraph("Src1.bmp"); した画像はアンマネージドメモリにロードされていると思います。 DX.DeleteGraph(GraphHandle); を実行しないとメモリは解放されないのではありませんか? C/C++のサンプルコードでは LoadGraph() したものは DeleteGraph() しています。 メモリの解放に関して C/C++ API と差があるのでしょうか? アプリケーション終了後に Windows OS がアプリケーションプロセスが使用したメモリを解放することを考慮しているのかはわかりませんが、サンプルコード上の違いの理由がわかりません。
メンテ

Page: 1 |

Re: VisualC# 用パッケージのサンプルコードについて ( No.1 )
名前:管理人 日時:2024/02/02 03:33

> DXライブラリのダウンロードページ(.../dxlib.xsrv.jp/dxdload.html)の VisualC# 用パッケージ内の Program.cs のサンプルコードでは > DX.DeleteGraph(GraphHandle); > がありませんが、本来は必要なのではないでしょうか? いえ、DX.DeleteGraph(GraphHandle); が無くても問題はありません > int GraphHandle = DX.LoadGraph("Src1.bmp"); > した画像はアンマネージドメモリにロードされていると思います。 > DX.DeleteGraph(GraphHandle); > を実行しないとメモリは解放されないのではありませんか? DX.DxLib_End(); の中で DX.DeleteGraph(GraphHandle); と同等の処理が行われるのでメモリは解放されます > C/C++のサンプルコードでは LoadGraph() したものは DeleteGraph() しています。 > メモリの解放に関して C/C++ API と差があるのでしょうか? メモリの解放に関して C/C++ API と差はありません つまり C/C++ のサンプルコードでも DeleteGraph() を呼ばなくても、サンプルコードのように GPU の VRAM を使い切ったり、グラフィックハンドルの最大数を超えたりしないようなプログラムの場合は DeleteGraph() を呼ばなくても問題ありません > アプリケーション終了後に Windows OS がアプリケーションプロセスが使用したメモリを解放することを > 考慮しているのかはわかりませんが、サンプルコード上の違いの理由がわかりません。 『小さなプログラムでは VRAM を使い切ったりグラフィックハンドル最大数を超えることは無い』ので 元々は C++ のサンプルコードでも DeleteGraph は使用していなかったのですが、それが 『サンプルプログラムで DeleteGraph でグラフィックハンドルを削除していないので、 グラフィックハンドルが不要になっても別に DeleteGraph で削除する必要はない』 という誤解を与えてしまうかもしれないと思ったので、後から DeleteGraph を呼ぶコードを追加しました C# のサンプルコードはその時の追加作業で見落としてしまっていたので DeleteGraph を呼ぶコードが無いというわけです ( 多分他にも見落としているサンプルコードはまだあると思います ) 先程 DX.DeleteGraph を呼ぶ行を追加しましたので、次回のバージョンの Program.cs には DX.DeleteGraph が 追加された状態になります 教えていただきありがとうございます m(_ _)m
メンテ
Re: VisualC# 用パッケージのサンプルコードについて ( No.2 )
名前:ArtLehock 日時:2024/02/03 16:13

ご回答ありがとうございます。 > DX.DxLib_End(); の中で DX.DeleteGraph(GraphHandle); と同等の処理が行われるのでメモリは解放されます 理解できました。きめ細かなご対応がされているのですね。 追加で申し訳ありませんが DX.DxLib_End(); の後で DX.DeleteGraph(GraphHandle); としても問題ないでしょうか? DX.DxLib_End(); 内でメモリ解放処理後に該当ハンドルを無効扱いにして2重解放等のガードがされているかを気にしております。 もちろん、このような順が発生しないようにコードを書くべきですが、ガードされていると細かな点を気にせずに済みます。 C# コンストラクタでキャラクタ画像をロードしファイナライザでキャラクタ画像を解放するようクラス化した場合に DX.DxLib_End(); と ファイナライザの呼び出される順が前後することを考慮しての質問です。 (C++ の場合は、スマートポインタを使用すると、ブロックを閉じる前に DxLib_End(); を呼び出すとこの後でデストラクタが呼び出される  ため逆転してしまいます。  別のレベルで DxLib_End(); を呼び出すか DxLib_End(); 呼び出し前にスマートポインタをクリアすることで順序を正しています) P.S. DxLib を利用させていただいて非常に感謝しております。 今まで C/C++ で快適に使用できました。 C# + DxLib も試してみようと思っています。
メンテ
Re: VisualC# 用パッケージのサンプルコードについて ( No.3 )
名前:管理人 日時:2024/02/04 16:29

> DX.DxLib_End(); > の後で > DX.DeleteGraph(GraphHandle); > としても問題ないでしょうか? はい、問題ありません DxLib_End の中でハンドルを管理している処理の”初期化済みかどうか”のフラグが FALSE になりますので、 DeleteGraph の中で最初に行われる 『ハンドルを管理している処理の”初期化済みかどうか”のフラグが FALSE だったら何もせずに関数から出る』 の if文処理によって DxLib_End の後に DeleteGraph が呼ばれた場合は何もせずに関数から出てきます > P.S. > DxLib を利用させていただいて非常に感謝しております。 > 今まで C/C++ で快適に使用できました。 > C# + DxLib も試してみようと思っています。 C# 版は要望があったのでオマケみたいな形( C++ 版の関数を C# から呼べるようにしただけ )で作ったものなので C# との相性は悪いかもしれませんが、お役に立てたら幸いです (^ ^;
メンテ
Re: VisualC# 用パッケージのサンプルコードについて ( No.4 )
名前:ArtLehock(解決済み) 日時:2024/02/04 18:54

ご回答ありがとうございます。 ここまできめ細かく対応されているライブラリーはなかなかないと思います。 サクサク動いてゲーム開発に適したライブラリーです。 今後も使わせていただきます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存