[リストへもどる]
一括表示
タイトルテクスチャエラー
記事No9820
投稿日: 2011/09/29(Thu) 21:53
投稿者26℃
以前の、暗号化したテクスチャの解像度を変えてテクスチャを書き直す処理ですが
よくわからないエラーが出ました。

マップのmqoのデータをロードするとき、テクスチャの書き換えをしているのですが
マップのロードを20回ほどしたあとにエラーが発生するようになりました。

エラーの行は
E3DBlendRTTexture scid_org,texid0,col1,D3DTEXF_POINT,-1,col1,D3DTEXF_POINT
E3DBlendRTTextureでエラーが発生します。

dbg.txtでのエラーの記述は
CShdHandler : CreateTexture : D3DTextr_CreateTextureFromFile : RenderTarget_102
texbank : CreateTexData : D3DXCreateTextureFromFileEx error 88760b59, C:\Documents and Settings\Owner\デスクトップ\HIME\himekishi\model\kiseki.bmp!!!
CShdHandler : CreateTexture : D3DTextr_CreateTextureFromFile : C:\Documents and Settings\Owner\デスクトップ\HIME\himekishi\model\kiseki.bmp
texbank : CreateTexData : data allready set, skip !!!

----

CreateRenderTargetTexture : GetFreeSwapChainElem NULL error : swap chain num overflow !!!
E3DCreateRenderTargetTexture : CreateRenderTargetTexture error !!!
RTBeginScene : scid error !!!
E3DBlendRTTexture : RTBeginScene error !!!

このようなエラーです、一応dbg.txtをメールで送っておきます。

タイトルRe: テクスチャエラー
記事No9822
投稿日: 2011/09/30(Fri) 07:54
投稿者おちゃっこ
dbg.txtを見たところ、
スワップチェインの数の制限より多い数のスワップチェインを
作成しようとしてエラーになっています。

スワップチェインは1度に255個までしか作れない仕様です。

スワップチェインはRenderTargetTexture1個に付き1個作られます。

必要なくなったRenderTargetTextureを
E3DDestroyRenderTargetTextureで削除すれば
解決すると思われます。

タイトルRe^2: テクスチャエラー
記事No9824
投稿日: 2011/09/30(Fri) 12:04
投稿者26℃
> 必要なくなったRenderTargetTextureを
> E3DDestroyRenderTargetTextureで削除すれば
> 解決すると思われます。

回答ありがとうございます。
256以上になったらエラーがでなくなりました。
破棄しても、IDが256以上続いていくので、どのくらい破棄されて
どのくらい残っているのか把握しにくいですが何とかなりそうです。

モデルをロードし、テクスチャを書き換えるモジュールのなかに
E3DDestroyRenderTargetTexture scid_org,texid2
という記述を加えるとテクスチャが消えて真っ白に表示されたのですが
E3DChgMaterial1stTexFromIDでtexid2がリンクしているということで合点がいきます。

モジュールを抜けたすぐ後に、破棄する命令を行うとテクスチャが消えて白くなることがありません。
これはどういうことだとおもわれますか?

IDを記憶、破棄するためにこのようなモジュールをつかいました

#module saveTexid scid_org,texid2
 #modinit int p1, int p2
  scid_org=p1
  texid2=p2
 return
 #modterm
  E3DDestroyRenderTargetTexture scid_org,texid2
  dialog ""+scid_org+" "+texid2
 return
#global

タイトルRe^3: テクスチャエラー
記事No9825
投稿日: 2011/09/30(Fri) 14:01
投稿者おちゃっこ
> モデルをロードし、テクスチャを書き換えるモジュールのなかに
> E3DDestroyRenderTargetTexture scid_org,texid2
> という記述を加えるとテクスチャが消えて真っ白に表示されたのですが
> E3DChgMaterial1stTexFromIDでtexid2がリンクしているということで合点がいきます。
>
> モジュールを抜けたすぐ後に、破棄する命令を行うとテクスチャが消えて白くなることがありません。
> これはどういうことだとおもわれますか?

E3DChgMaterial1stTexFromIDで使っているモデルが生きている間は
そのRenderTargetTextureを破棄してはいけません。

白くならなかったのはたまたまです。


ステージ読み込み時に
RenderTargetTextureのscidとtexidを保存しておいて
そのステージを破棄するときにいっしょに
DestroyRenderTargetTextureを呼び出してください。

タイトルRe^4: テクスチャエラー
記事No9826
投稿日: 2011/09/30(Fri) 15:13
投稿者おちゃっこ
> 白くならなかったのはたまたまです。

たまたまじゃなかったです。

Destroy命令を呼んでも、モデルから参照されているテクスチャは
削除されないようにしていました。

この仕様はこのままの予定です。

タイトルRe^5: テクスチャエラー
記事No9828
投稿日: 2011/09/30(Fri) 17:04
投稿者26℃
> > 白くならなかったのはたまたまです。
>
> たまたまじゃなかったです。
>
> Destroy命令を呼んでも、モデルから参照されているテクスチャは
> 削除されないようにしていました。
>
> この仕様はこのままの予定です。

白くなった原因はわかりませんが、きちんと利用すればエラーはないようなのでこれで解決とします。
ありがとうございました。

タイトルRe^6: テクスチャエラー
記事No9829
投稿日: 2011/10/01(Sat) 09:37
投稿者26℃   <>
うわあ、間違ってた。
レンダーテクスチャ作成がこうで
E3DCreateRenderTargetTexture w, h, scid_org, texid2, okflag
スワップチェインID・テクスチャのIDを登録のモジュールでtexid2を入力せずokflagを入力してましたorz
newmod TexIDS@,saveTexid,scid_org,okflag

texid2に変えたところ、テクスチャは消えて白くなるようです。
ここで疑問におもったことがあるのですが、okflagを入力していてもエラーが回避できたことです

E3DDestroyRenderTargetTextureのスワップチェインIDとテクスチャIDはどのような関係があるのでしょうか?

一番最初のロードでダミーのテクスチャを作っておき。
E3DCreateRenderTargetTexture 1, 1, scid_org, texidDummy, okflag

モジュールの削除する命令を
#modterm
 E3DDestroyRenderTargetTexture scid_org,texidDummy@
return
このようにすると、エラーが起きずにスワップチェインIDだけ削除されているみたいです。

タイトルRe^7: テクスチャエラー
記事No9830
投稿日: 2011/10/01(Sat) 10:30
投稿者おちゃっこ
> E3DDestroyRenderTargetTextureのスワップチェインIDとテクスチャIDは
> どのような関係があるのでしょうか?

この場合のスワップチェインは
テクスチャの一番上の階層のレンダー可能なサーフェスと
レンダーの際に使用するZバッファから成ります。

Destroy命令ではスワップチェインをrelease(開放)してからテクスチャをreleaseします。
テクスチャがすでにrelease済みのものであってもエラーになりません。
(relase後に0をセットして、複数回releaseを回避するため)

Destroyの際にはscid, texidともRenderTargetTextureのものを指定するのが望ましいです。

texidが違うものになっていた場合も
DestroyHandlerSetを読んだ際に参照されないテクスチャは破棄されます。

ですがtexidに間違ったものを入れると
間違ったテクスチャを破棄する恐れがあります。

RenderTargetTextureの削除は
関連付けられてるhsidをDestroyした後に呼び出してください。
そうしないと白くなります。

タイトルRe: テクスチャエラー
記事No9842
投稿日: 2011/10/08(Sat) 11:45
投稿者26℃
スペックの低めのPCでテストしていたら
テクスチャの作成の場所でまたエラーがでてきましたorz
これも、以前と同じようにマップのロードを削除を繰り返していたら発生するのですが
E3DBlendRTTextureでエラーになるようです
エラーの発生前にE3DCreateRenderTargetTextureのokflagが0になっていたのを確認しました。

dbg.txtの最後の行らへんはこのような感じです。
CreateSwapChainElem : dev CreateDepthStencilSurface error 8876017c !!!
CreateRenderTargetTexture : CreateSwapChain error !!!
E3DCreateRenderTargetTexture : CreateRenderTargetTexture error !!!
texbank : SetAppTexture start
hs : ChgMaterial1stTexFromID : texbnk SetAppTexture error !!!
E3DChgMaterial1stTexFromID : hs ChgMaterial1stTexFromID error !!!

ビデオメモリが足りなくなったのでしょうか
テクスチャを破棄したときビデオメモリが減っていない?ということでしょうか
ビデオメモリの使用率を確認できないのでなんともわかりません。

タイトルRe^2: テクスチャエラー
記事No9843
投稿日: 2011/10/08(Sat) 12:18
投稿者26℃
win7のPCだと、VRAMを使用量を調べるソフトがうまく機能しなかったのですが
XPのPCだと調べることができたので
それを使って調べてみると
製作中のゲームを起動させスプライト、ビルボードの初期化が
済んだ段階で105Mほどビデオメモリを消費しているみたいでした。
マップを切り替えていくと徐々に増加してエラーで落ちる感じです。
スプライト、ビルボードの画像はpngなどでサイズは小さいのですが。
そのサイズは関係ないみたいですね
>消費するビデオメモリ量は
>sizex * sizey * ( 4 + 2 ) バイト
関数の説明でこう書かれていたのでこのサイズかなあ。

タイトルRe^3: テクスチャエラー
記事No9844
投稿日: 2011/10/08(Sat) 13:29
投稿者おちゃっこ
> E3DBlendRTTextureでエラーになるようです
> エラーの発生前にE3DCreateRenderTargetTextureのokflagが0になっていたのを確認しました。
> CreateSwapChainElem : dev CreateDepthStencilSurface error 8876017c !!!

8876017cというエラーの数字から
間違いなくビデオメモリ不足が原因です。


> スプライト、ビルボードの画像はpngなどでサイズは小さいのですが。
> そのサイズは関係ないみたいですね
> >消費するビデオメモリ量は
> >sizex * sizey * ( 4 + 2 ) バイト
> 関数の説明でこう書かれていたのでこのサイズかなあ。

スワップチェインは26℃さんはD3DPOOL_DEFAULTで作成しているようなので
ビデオメモリはsizex * sizey * ( 4 + 2 ) バイトを消費します。

スプライトとビルボードは何もいじっていなければ
D3DPOOL_MANAGEDで作成するので
メインメモリもビデオメモリも
sizex * sizey * 4 バイトを消費します。

FromBufのテクスチャをD3DPOOL_DEFAULTで作ると
メインメモリはpngサイズ
ビデオメモリは
sizex * sizey * 4 バイトを消費します。

タイトルRe^4: テクスチャエラー
記事No9845
投稿日: 2011/10/08(Sat) 17:25
投稿者26℃
> > スプライト、ビルボードの画像はpngなどでサイズは小さいのですが。
> > そのサイズは関係ないみたいですね
> > >消費するビデオメモリ量は
> > >sizex * sizey * ( 4 + 2 ) バイト
> > 関数の説明でこう書かれていたのでこのサイズかなあ。
>
> スワップチェインは26℃さんはD3DPOOL_DEFAULTで作成しているようなので
> ビデオメモリはsizex * sizey * ( 4 + 2 ) バイトを消費します。
>
> スプライトとビルボードは何もいじっていなければ
> D3DPOOL_MANAGEDで作成するので
> メインメモリもビデオメモリも
> sizex * sizey * 4 バイトを消費します。
>
> FromBufのテクスチャをD3DPOOL_DEFAULTで作ると
> メインメモリはpngサイズ
> ビデオメモリは
> sizex * sizey * 4 バイトを消費します。

いろいろ違うんですね、とにかくビデオメモリを抑えるためにいろいろ工夫したいと思います。
マップのロードごとにビデオメモリが増えるのも、テクスチャを破棄しそびれているからかなあ。

ところで、ビデオメモリの使用量を調べるほうほうなどご存知ないでしょうか。
hspでのビデオメモリの使用率の取得のほうほうなど検索してみたのですが出てこないもので。

タイトルRe^5: テクスチャエラー
記事No9846
投稿日: 2011/10/08(Sat) 18:21
投稿者おちゃっこ
プログラムからビデオメモリ残量を調べたことは
ぼくもないので分かりません。

ツールならMizunoさんのところにあります。

ttp://www.metaseq.net/software.html

のVideo Grabです。

タイトルRe^6: テクスチャエラー
記事No9854
投稿日: 2011/10/11(Tue) 22:02
投稿者26℃
> のVideo Grabです。
小さくてなかなかいいですね。

おかげさまで、hspコンテストに作品を投稿することができました、
ありがとうございます。
でもまだ未完成なので今月中に完成できるよう頑張りたいですね。

ところでマップのロードでE3DBlendRTTextureを使っているのですが
これを使うとビデオメモリが増加し、テクスチャ、hsidを破棄してもこの関数を使ったときに増加したビデオメモリが消えないみたいです。
確認お願いします。

タイトルRe^7: テクスチャエラー
記事No9855
投稿日: 2011/10/12(Wed) 05:30
投稿者おちゃっこ
CreateRenderTargetTextureで作成したメモリが削除されていないのが原因だと思います。
削除時に正しいスワップチェインIDを指定しているか、もう一度確認してみてください。

ぼくの新しい環境ではVideoGrabは数値が全然変わらないのでメモリは確認できませんでした。

ソースを見直しましたがDestroyRenderTargetTextureでちゃんと
スワップチェインもテクスチャも破棄しています。

一応削除時のスクリプトを書いておきますと
まず一回だけ最初に
dim savetex, 1024
dim savesc, 1024
savenum = 0
としておきます。

そして読み込み時に
E3DCreateRenderTargetTexture w, h, scid_org, texid2, okflag
savesc@( savenum@ ) = scid_org
savetex@( savenum@ ) = texid2
savenum@ += 1

とします。

そして削除時に
repeat savenum@
E3DDestroyRenderTargetTexture savesc@( cnt ), savetex@( cnt )
loop
savenum@ = 0

です。

これでテクスチャが真っ白になるのでちゃんと削除されていると思います。

モジュール内で@を付け忘れていないかなども確認してください。

タイトルRe^8: テクスチャエラー
記事No9857
投稿日: 2011/10/12(Wed) 10:33
投稿者26℃
DestroyRenderTargetTextureはちゃんとしています。
E3DBlendRTTextureを省きブレンドする処理を飛ばした後
テクスチャを破棄したらビデオメモリは基のサイズにもどりました。

E3DBlendRTTextureを使ったときだけ2Mほど残ってしまいます。
E3DBlendRTTextureのときに、なにかビデオメモリを使うことをしているのではないでしょうか

引数はこんな感じ。
E3DBlendRTTexture scid_org,texid0,col1,D3DTEXF_POINT,-1,col1,D3DTEXF_POINT

タイトルRe^9: テクスチャエラー
記事No9858
投稿日: 2011/10/12(Wed) 15:31
投稿者おちゃっこ
2M残るということは
256*256のテクスチャ1枚分ですね。
RenderTargetTexture1枚はもうちょいメモリが大きいです。

BlendRTTextureを見直しましたが
ここではメモリはアロケートしていません。
サーフェスの参照カウントも増やしていません。

考えられるのは
CreateTextureFromBufのテクスチャ(texid0)を削除していないことくらいですかね。
または削除のタイミングが悪いか。

texid0も作成時にIDを保存しておき
モデル削除時に削除命令を呼んでください。

うーん、そのくらいしか思いつかないですねー。

タイトルRe^10: テクスチャエラー
記事No9859
投稿日: 2011/10/12(Wed) 18:15
投稿者26℃
texid0はブレンドした直ぐ後に、破棄するようにしています。
モデルをロードするごとにメモリが蓄積されるようではないので、あまり追求して直す必要は無いのですが。
ちょっと気になっただけです。

タイトルRe^11: テクスチャエラー
記事No9860
投稿日: 2011/10/12(Wed) 21:16
投稿者おちゃっこ
省メモリの方法を思いつきました!!

CreateRenderTargetTextureは
テクスチャとZバッファを作成するんですが
BlendRTTexture命令ではZバッファを使いません。

そこでCreateRenderTargetTextureに
Zバッファを作成しないオプションをつけようと思います。

これにより1ドットに付き6バイト消費していたビデオメモリが
4バイトになります。

レンダーターゲットテクスチャのサイズが3分の2になるので
省メモリに有効だと思います。

明日やります。
しばらくお待ちください。

タイトルRe^12: テクスチャエラー
記事No9861
投稿日: 2011/10/13(Thu) 06:29
投稿者おちゃっこ
E3DCreateRenderTargetTextureに
Zバッファを作らないオプションを追加して
リリースしました。

タイトルRe^13: テクスチャエラー
記事No9862
投稿日: 2011/10/13(Thu) 10:30
投稿者26℃
試してみたところ、VRAMの数値の変化ですが
マップのロードで13Mから10Mなどの変化を確認しました。
ありがとうございます。