イントレ。
Tag for "MDX"
Direct3Dにて。
フルスクリーンに切り替えたとたんにDevice.Present()で落ちるという症状が多発。
まれに、デバイスロスト時のDevice.Reset()時にも発生しています。
例外はInvalidCallException、無効な呼び出しですか。
フォームとは別スレッドで動かしているのが原因と睨んで、
排他処理とかやってみたんですが症状は一向に回復せずスッカリお手上げ状態。
Device.Reset()は作成したときと同じスレッドで動くようにControl.Invoke()してあるし、
Device.BeginScene()~Device.EndScene()間は例外吐いたらDevice.Present()を呼ばないようにしている。
デバイスロスト時の処理もきちんとやっているハズ。 なのに何故だ…!
…と、ふとDevice.Present時の引数無しのヤツに変えてみたら症状回復。
もしやと思って、ドキュメントを調べたらしっかり書いてありました。 orz
で、私はSwapEffect.Discardを設定した状態で、
Present()のRectangleを設定してしまったためにエラーとなったようです。
SwapEffect.Discardは、オーバーヘッドを回避するためにSwapEffectをドライバに決めさせる方法なんですが、
どうやら、ドライバ内部でSwapEffect.Flipが選択されていたみたいですね。
SwapEffect.Flipはウィンドウモード時はSwapEffect.Copyと同等の処理で実装されているそうなので、
そのためウィンドウモードではエラーが吐かれなかったと推測されます。
原因が分かればなんて事はないのですが… どっと疲れた気がします。(汗)
フルスクリーンに切り替えたとたんにDevice.Present()で落ちるという症状が多発。
まれに、デバイスロスト時のDevice.Reset()時にも発生しています。
例外はInvalidCallException、無効な呼び出しですか。
フォームとは別スレッドで動かしているのが原因と睨んで、
排他処理とかやってみたんですが症状は一向に回復せずスッカリお手上げ状態。
Device.Reset()は作成したときと同じスレッドで動くようにControl.Invoke()してあるし、
Device.BeginScene()~Device.EndScene()間は例外吐いたらDevice.Present()を呼ばないようにしている。
デバイスロスト時の処理もきちんとやっているハズ。 なのに何故だ…!
…と、ふとDevice.Present時の引数無しのヤツに変えてみたら症状回復。
もしやと思って、ドキュメントを調べたらしっかり書いてありました。 orz
≪原因≫
PresentParameters.SwapEffectにCopyを設定していない場合、
Device.Present()の引数、Rectangleを設定してはいけない。
で、私はSwapEffect.Discardを設定した状態で、
Present()のRectangleを設定してしまったためにエラーとなったようです。
SwapEffect.Discardは、オーバーヘッドを回避するためにSwapEffectをドライバに決めさせる方法なんですが、
どうやら、ドライバ内部でSwapEffect.Flipが選択されていたみたいですね。
SwapEffect.Flipはウィンドウモード時はSwapEffect.Copyと同等の処理で実装されているそうなので、
そのためウィンドウモードではエラーが吐かれなかったと推測されます。
原因が分かればなんて事はないのですが… どっと疲れた気がします。(汗)
久々にツクールもどき。
とりあえず、MDX for CLR2.0に載せ替えてみる。
多少、引数(や、その意味)が変わっていたりするけど、ほとんど問題なし。
一番わからなかったのは、DirectInputでSystemGuidがなくなっていた点。
キーボードやマウスのデバイスを作るためのGUIDなんだけど、変更理由は複数デバイスに対応するためだろうか。
とりあえず、ジョイスティックと同様に検索してインスタンスを作成する必要があるみたい。
InputList<DeviceInstance> instance =
Manager.GetDevices(DeviceClass.Keyboard, EnumDevicesFlags.AttachedOnly);
Device device = new Device(instance[0].Instance);
device.SetDataFormat(DeviceDataFormat.Keyboard);
MDX2の全体的なパフォーマンスは良好。
ベータ版だけど、こっちをベースに利用させてもらおう。
…AudioVideoPlaybackは無いっぽいのでMDX1のやつを引っ張ってみたり。
とりあえず問題なく動作してはいるようです。
とりあえず、MDX for CLR2.0に載せ替えてみる。
多少、引数(や、その意味)が変わっていたりするけど、ほとんど問題なし。
一番わからなかったのは、DirectInputでSystemGuidがなくなっていた点。
キーボードやマウスのデバイスを作るためのGUIDなんだけど、変更理由は複数デバイスに対応するためだろうか。
とりあえず、ジョイスティックと同様に検索してインスタンスを作成する必要があるみたい。
InputList<DeviceInstance> instance =
Manager.GetDevices(DeviceClass.Keyboard, EnumDevicesFlags.AttachedOnly);
Device device = new Device(instance[0].Instance);
device.SetDataFormat(DeviceDataFormat.Keyboard);
MDX2の全体的なパフォーマンスは良好。
ベータ版だけど、こっちをベースに利用させてもらおう。
…AudioVideoPlaybackは無いっぽいのでMDX1のやつを引っ張ってみたり。
とりあえず問題なく動作してはいるようです。
Managed DirectXのプログラムをやっていたんですが、
ローダーロック(MDA)に引っかかってストレス溜まりまくりな愁です。
デバッグ時の2回に1回は引っかかって、下手するとVS巻き込んでフリーズ。
OSを巻き込まないだけいいんですが、さすがにツラいです。
というコトで、ネットをあさっていたら、ローダーロックの検出をやめる方法があることが発覚。
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/MDA="0"を追加する。
というモノです。
Beta2での情報なんですが、なんか効いてる感じ。
でも、確実にVSがフリーズするようになりました。(泣)
これじゃあ、無効にしない方がマシですよ…。
明日から12月と言うことで、近いうちにDirectXのアップデートがあると思われるし、
それに期待したいところですね。
月末カウント記録。
今月末は58,981、月間1,530、平均51Hit/day。
ローダーロック(MDA)に引っかかってストレス溜まりまくりな愁です。
デバッグ時の2回に1回は引っかかって、下手するとVS巻き込んでフリーズ。
OSを巻き込まないだけいいんですが、さすがにツラいです。
というコトで、ネットをあさっていたら、ローダーロックの検出をやめる方法があることが発覚。
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/.NETFramework/MDA="0"を追加する。
というモノです。
Beta2での情報なんですが、なんか効いてる感じ。
でも、確実にVSがフリーズするようになりました。(泣)
これじゃあ、無効にしない方がマシですよ…。
明日から12月と言うことで、近いうちにDirectXのアップデートがあると思われるし、
それに期待したいところですね。
月末カウント記録。
今月末は58,981、月間1,530、平均51Hit/day。
ど忘れメモ。
Direct3D SpriteのSpriteFlags.ObjectSpace時に設定すべきView/Projection行列。
…過去日記に書いていたのにコードが書けなかったので。
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
PresentParameters pp = new(...);
Device device = new(...);
// 原点左上で、(0, 0)-(Width, Height)の範囲のViewを定義
// Y軸は下を正位置、Z軸は手前を正位置に。
float width = pp.BackBufferWidth / 2f;
float height = pp.BackBufferHeight / 2f;
float fovy = 45f * (float)Math.PI / 180f; // 視野角45度
float depth = height / (float)Math.Tan(fovy / 2f); // Z=0時に(WIDTH, HEIGHT)になるZ座標を計算
device.Transform.View = Matrix.LookAtLH(
new Vector3(width, height, depth),
new Vector3(width, height, 0),
new Vector3(0, -1, 0));
device.Transform.Projection =
Matrix.PerspectiveFovLH(fovy, width / height, 1, 10000); // nearを大きめに
Z=-100とかで画像が破綻するときはMipMapをチェックすべし。
Direct3D SpriteのSpriteFlags.ObjectSpace時に設定すべきView/Projection行列。
…過去日記に書いていたのにコードが書けなかったので。
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
PresentParameters pp = new(...);
Device device = new(...);
// 原点左上で、(0, 0)-(Width, Height)の範囲のViewを定義
// Y軸は下を正位置、Z軸は手前を正位置に。
float width = pp.BackBufferWidth / 2f;
float height = pp.BackBufferHeight / 2f;
float fovy = 45f * (float)Math.PI / 180f; // 視野角45度
float depth = height / (float)Math.Tan(fovy / 2f); // Z=0時に(WIDTH, HEIGHT)になるZ座標を計算
device.Transform.View = Matrix.LookAtLH(
new Vector3(width, height, depth),
new Vector3(width, height, 0),
new Vector3(0, -1, 0));
device.Transform.Projection =
Matrix.PerspectiveFovLH(fovy, width / height, 1, 10000); // nearを大きめに
Z=-100とかで画像が破綻するときはMipMapをチェックすべし。
プログラミングメモ… というか不可解事例。
ターゲットはManaged DirectXのDirectSound。
Buffer再生中、再生カーソルが指定の箇所を過ぎたらイベント通知してくれるNotifyというクラスがあるのですが、
それを設定するNotify.Notify.SetNotificationPositions()で例外発生。
このメソッドには『通知されるイベントのハンドル』と『通知してほしい位置』を設定する
BufferPositionNotifyの配列を渡すんですが、2個以上渡すと例外が発生。
0個、1個では例外は発生せず、正常に動作しています…。
.NET2.0を入れている所為かなと思って、クリーン環境で実行してみたが同じ。
ぐぐってみてもあんまり情報がないような…?
さて、Notifyが使えない状況でどうやってバッファ補充したらいいんだろう。
タイマーで強制的にやるしか方法なさげ…。(汗)
訂正。
BufferPositionNotify.Offsetに渡す値を-1したら動いた。
…でも1個の時は-1しなくても動くってどういうコトだ?
とにかく、汎ミス乙。>俺
ターゲットはManaged DirectXのDirectSound。
Buffer再生中、再生カーソルが指定の箇所を過ぎたらイベント通知してくれるNotifyというクラスがあるのですが、
それを設定するNotify.Notify.SetNotificationPositions()で例外発生。
このメソッドには『通知されるイベントのハンドル』と『通知してほしい位置』を設定する
BufferPositionNotifyの配列を渡すんですが、2個以上渡すと例外が発生。
0個、1個では例外は発生せず、正常に動作しています…。
.NET2.0を入れている所為かなと思って、クリーン環境で実行してみたが同じ。
ぐぐってみてもあんまり情報がないような…?
さて、Notifyが使えない状況でどうやってバッファ補充したらいいんだろう。
タイマーで強制的にやるしか方法なさげ…。(汗)
訂正。
BufferPositionNotify.Offsetに渡す値を-1したら動いた。
…でも1個の時は-1しなくても動くってどういうコトだ?
とにかく、汎ミス乙。>俺
Utilities
- タグ
- カレンダー
- 最近の更新
- Adsense