Re: LoadSoftImageについて ( No.1 ) |
- 名前:通 日時:2009/02/18 17:53
_REND_LISTも同様ですが_rend_listが
クラス内変数かグローバルか分かりませんが、
他のところで変更されている可能性は
ありませんか?
|
Re: LoadSoftImageについて ( No.2 ) |
- 名前:だみあん 日時:2009/02/19 04:56
すみません、自己解決しました・・・。
DeleteSoftImageの直前に
DrawSoftImage(0,0,_rend_list._GHandle);
ScreenFlip();
// キー入力待ち
WaitKey();
などいれて、チェックしてみたのですが、画像もきちんと表示されるし
どういう事だとしばらく悩んでいたのですが・・・
どうにも、きちんとメモリの解放が行われている場合と
そうでない場合があるため、どういうときに起こるのか追ってみたところ、
エフェクト中に同一のプライオリティに描画リストが上書きされる場合にのみ
起こっている現象だとわかりました・・・。
スクリプトからは描画リストに登録するだけの丸投げ状態なので、
ぽちぽち高速でスクリプトを進めていったときに
エフェクト中の同一プライオリティに・・・という限定した状況でのみ
起こる現象だったので、なかなか問題を見つけ出すのに時間がかかってしまいました。
通常の画像ですと、同一プライオリティへの上書きの際に元にあるグラフィックハンドルは
解放してからリストに登録するのですが、そこで
CPU描画を使用している途中を示すフラグをリストに追加することで
そこでもDeleteSoftImageをおこなうことで
解決しました・・・。
結局、
>他のところで変更されている可能性は
ありませんか?
という、凡ミスでした・・・(汗
しかし、現状では、該当エフェクト中にゲームをセーブなどした場合と
ゲームをロード後の画像のリロードの際にも起こる状況だったりするので・・・。
CPU描画のメリットと煩雑さを秤にかけてしまいます・・・w
CPU描画の際にはスクリプトのほうにに制御を戻さず、メモリ解放までループで回すというのが
一番楽なのでしょうけども、なんか負けた気がして嫌ですし(?)
メモリを一時的に動的に確保する性質上
自前できちんと解放まで面倒みるのがスジなのでしかたのないことなのでしょうけども。
あと、ついでになのですが
DeleteSoftImage
なのですが、ハンドルが無効、もしくはハンドルの指定する先が存在しない(?)場合
−1を返すとなっておりますが、値を返す前にデバッガが停止して
メモリのアクセス違反で止まってしまいます。
(vc2008EE使用)
試してみましたが
GetPixelSoftImageなどもエラーを返さずに強制終了する模様です。
|
Re: LoadSoftImageについて ( No.3 ) |
- 名前:管理人 日時:2009/02/19 13:19
問題が解決したようで何よりです
DeleteSoftImage に無効なハンドル値を渡した場合に停止するのは、仕様です
すいません、リファレンスの内容の方が誤りですので、近日中に修正しておきます
|
Re: LoadSoftImageについて ( No.4 ) |
- 名前:だみあん 日時:2009/02/20 07:37
すると、LoadSoftImageToMem等の読み込み系の返値が−1なら
以降の描画系およびDeleteSoftImageを弾くようなのが必須っぽいですね・・・。
それでも、ハンドルの値(int)は残ってて
中身が無い・・・という状況もかんがえるとやはり
ハンドルが有効かのチェック出来る関数があるとありがたいのですが。
単一のサブルーチン内で確保とセットで解放を行う完結した感じならともかく
マルチタスク風の描画系ですと、その辺でチェック機構がないのは
CPU画像使用時のゲームのセーブ&ロードなどをかんがえると、ちょっときついです・・・。
ライブラリレベルで隠蔽して
InitGraphでまとめて消せて、描画の際に無効なら無視・・・
というのがベターなのですが・・・。
|
Re: LoadSoftImageについて ( No.5 ) |
- 名前:管理人 日時:2009/02/21 11:00
ハンドルを削除した時点でそのハンドル値を代入していた変数に -1 を代入して、
以後ハンドル値が -1 だったら処理をしない、という風にすることで
解決することはできないでしょうか?
という議論はさておき、ソフトイメージハンドルだけ他のハンドルと扱いが違うというのは混乱の元なので、
他のハンドルと同じように無効なハンドルが渡されたら−1を返し、DxLib_End 時に解放されていなかった
ソフトイメージハンドルを解放するように仕様を変更したバージョンをアップしました
宜しければお使い下さい m(_ _)m
http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用
http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用
(中身を既存のライブラリのファイルに上書きして、BCCをお使いの
場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
グラフィックハンドルと違い SetGraphMode や ChangeWindowMode 等の関数を使用しても
解放はされないという仕様の違いがあるので、InitGraph ではソフトイメージは解放されません
代わりに int InitSoftImage( void ) ; という関数を追加しましたので、もし InitGraph を
使用しているところでソフトイメージも解放したい、という場合は
InitGraph();
InitSoftImage();
というように InitSoftImage(); を書き加えてください
|
Re: LoadSoftImageについて ( No.6 ) |
- 名前:だみあん 日時:2009/02/23 05:52
通常のグラフィック系と同じ感覚で扱えるようになるのは
大変うれしいです。
ありがとうございました。
早速使わせていただきます〜
|