トップページ > 過去ログ > 記事閲覧
デュアルディスプレイ対応方法
名前:ねずみ 日時: 2009/10/31 08:12

こんにちは。 マルチディスプレイ環境への対応方法について質問です。 DxLib.hよりそれっぽい関数を探しつつ、以下のようにコーディングしたところ、 特にウィンドウモード時、こちらが想定した動作にはなりませんでした。 何がおかしいのか、アドバイスよろしくお願いします。 【コード】 //有効なデバイス数を取得 int nDevs = DxLib::GetDirectDrawDeviceNum(); /* この辺で、どの番号のデバイスを使うか決める。   ユーザに選択させたり、設定ファイルから読み込んだり */ int num = ●●; //GUIDをセット GUID *guid = DxLib::GetDirectDrawDeviceGUID(num); DxLib::SetDDrawUseGuid(guid); /* この辺で DxLib::DxLib_Init() を呼んでライブラリ初期化 */ 【実行結果】 最低限の描画のみを行った。 ウィンドウモード時 num=0、num>=3  メインモニタでは正常に動作(60fps)。  サブモニタでは極端に速度が遅くなった(10fps前後)。 num=1  メインモニタでは正常に動作。サブモニタでは描画が更新されない。  内部では動いている模様。ウィンドウをサブからメインモニタに移動させると描画再開。 num=2  いずれのモニタでも描画されない。ただし内部では動いている模様。 念のため、フルスクリーン時 num!=2  メインモニタに正常に描画。解像度が変わる場合、デスクトップがずれる。  またサブモニタ表示部分を操作できなくなる。(マウスポインタが移動できない) num=2  サブモニタに正常に描画。  メインモニタの部分は操作できるが、当然ゲーム画面は非アクティブに。 【スペック】 OS  WindowsXP(32bit) SP3 デバイス番号  0番:メインモニタ(RadeonHD3200、オンボ)  1番:未接続(RadeonHD3200、オンボ)  2番:サブモニタ(NVIDIA9600GTグラボ)  ※GetDirectDrawDeviceDescriptionで調査  ※1番のデバイスは調子が悪いため未確認  ※2つのモニタは解像度が異なる ライブラリ  DXライブラリ 2.25c  ※3.00dはGetDirectDrawDeviceNumの時点で反応せず

Page: 1 |

Re: デュアルディスプレイ対応方法 ( No.1 )
名前:管理人 日時:2009/10/31 22:52

最新バージョンで DirectX9版でも GetDirectDrawDeviceGUID 等の関数を使用できるようにしましたので よろしければお試し下さい m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) 尚、出力デバイスの指定に SetDDrawUseGuid の代わりに SetUseDirectDrawDeviceIndex を使用してください // 使用する DirectDraw デバイスのインデックスを設定する int SetUseDirectDrawDeviceIndex( int Index ) ; 因みに、ウインドウモードでは指定したデバイスと接続されているモニタ上でのみ正常に描画され、 指定したデバイスに接続されていないモニタ上では何らかのペナルティが発生すると思います これはドライバかOSの仕様だと思いますので、ライブラリの側ではどうしようもありません フルスクリーンモード時にデスクトップ画面がずれる現象はデスクトップ画面のサイズが変更されるため ( 片方の画面の解像度が変更されたため )だと思います サブモニタ表示部分が操作できなくなる現象の「マウスポインタが移動できない」は マウスポインタがサブモニタに表示されているけど動かすことができないということでしょうか?
一応解決 ( No.2 )
名前:ねずみ 日時:2009/11/01 01:58

ありがとうございます。 VC++用で確認をしたところ、当方のデュアルモニタ環境で想定通りに動作しました。 1つ気になったことがあります。 GetDirectDrawDeviceNumしたところ、2.25cでは3つだったのですが、今回のバージョンでは2つと返ってきました。 このとき、0番がメインモニタ、1番がサブモニタになっています。未接続のものは取得できませんでした。 もちろんライブラリ以外の環境は変わっていません。 ウィンドウモードで、SetUseDirectDrawDeviceIndexに渡す値が  0のとき:従来通り(メインモニタでは正常描画、サブモニタでは描画が遅くなる)  1のとき:サブモニタでは正常描画、メインモニタでは描画が遅くなる と、2.25cと比べて挙動が変わりました。 なおこの挙動は想定通りです。 フルスクリーンの時は、渡すべきデバイス番号が変わったくらいで 2.25cのときと挙動の違いは見られませんでした。 >フルスクリーンモード時にデスクトップ画面がずれる現象 はい、おそらくそうだと思います。 >サブモニタ表示部分が操作できなくなる現象 サブモニタの領域にマウスポインタを置いておいても、ゲーム起動時に消えます。 また、マウスを動かしてサブモニタに出現させることは出来ませんでした。 操作は出来ないものの、サブモニタに置いておいたチャットソフトは普通に動作しており、 会話ログを垂れ流していました。
Re: デュアルディスプレイ対応方法 ( No.3 )
名前:管理人 日時:2009/11/05 12:40

概ね想定通りに動作したみたいで何よりです > GetDirectDrawDeviceNumしたところ、2.25cでは3つだったのですが、今回のバージョンでは2つと返ってきました。 DirectX7版と DirectX9版でデバイス列挙に使用しているAPIが違うので動作に違いが出ているのだと思います。 多分 DirectX9版のデバイス列挙APIは無効はデバイスは列挙しないのではないかと・・・ > サブモニタの領域にマウスポインタを置いておいても、ゲーム起動時に消えます。 > また、マウスを動かしてサブモニタに出現させることは出来ませんでした。 二つのモニタの位置関係が変化しているということはないでしょうか? 私が以前経験した例では、普段モニタ1が左、モニタ2が右に配置されていたのものが、 フルスクリーンモードになるとモニタ1が下、モニタ2が上に勝手に配置が変えられていました
Re: デュアルディスプレイ対応方法 ( No.4 )
名前:ねずみ 日時:2009/11/05 21:36

ごめんなさい、1箇所訂正させてください。 Test版をフルスクリーンで実行したときの挙動は、2.25cとは異なっていました。 メインモニタに表示させた場合、サブモニタに表示させた場合を問わず、 表示しなかった方のモニタにマウスポインタを移動させることが出来ました。 当然、非表示側をクリックした場合、ゲーム画面は非アクティブ&最小化されます。 (機会があればコールバック周りを調べてみようと思います) >二つのモニタの位置関係が変化しているということはないでしょうか? メインモニタにフルスクリーン表示した場合、 解像度によってはサブモニタの内容がズレて表示されてしまいますが、 サブモニタをメインモニタの上や左に置くことでズレを回避することが出来ると思います。 この仕組みを意図的に組み込んだゲームはあるかもしれませんね。
Re: デュアルディスプレイ対応方法 ( No.5 )
名前:管理人 日時:2009/11/06 08:34

ご情報ありがとうございます

Page: 1 |