管理人さん詳しい解説ありがとうございます これで安心してゲーム製作を続けることができます
週末が忙しくなりそうなので平日にご返信します (・・; > 南山まさかずさん すみません、DxLibMake 確認したところ私の環境では sln ファイルを正常に開くことができませんでした 最新バージョンでは VisualStudio2010 用の sln ファイルになっているのですが、 VisualStudio2010 用のプロジェクトファイル( .vcxproj )が存在しなくて代わりに VisualStudio2008 用のプロジェクトファイル( .vcproj )だけが残っているという状態に なってしまっていました m(_ _;m > こけしさん 64bit環境でも 32bitのゲームは作成できますので、32bitのゲームを作れば 64bit環境で作ったゲームでも 32bit環境で動かすことができます( 逆に 32bit環境でも 64bitのゲームを作成することはできます 作成しても起動することができないのでテスト実行すらできませんが・・・ ) ただ、64bitのゲームを作成した場合はそのソフトは 32bit環境で動かすことができません 因みに今のところ VisualC++ 2010 でもデフォルトでは 32bitのソフトを作成するように設定されますので、 64bit のソフトを作成するように設定を変更しない限りは 64bit環境でソフトを開発したとしても 32bitのソフトが作成されます ( 64bitのソフトを作成するには VisualC++ の場合は「構成マネージャ」でプラットフォームに「x64」を追加します )
DxLib.slnのビルドが無事できました。管理人さん、どうもありがとうございます。
初歩的な質問で申し訳ないのですが、D Xライブラリを使って64bit環境で作ったゲームは32bit環境でも動かすことができるのでしょうか?
管理人さん、ありがとうございます。 > プロファイルを使ったことが無いので、プロファイルの結果がどのようなものかをまず知りません (・・; > なので、頂いても役に立てられるかはわかりません 実のところ僕もとってみたは良いものの結果が現象とどう関係してくるのか、そもそも関係があるのかどうかすらあま りつかめていない状態です(汗)。プロファイルに関しては自力でなんとかしてみたいと思います。 > DxLibMake.sln の件ですが、DXライブラリはどのバージョンをお使いでしょうか? 最新バージョンのはずです。一応ダウンロードさせてもらいましたので、できる限り早く確させていただきたいと思い ます。
> 南山まさかずさん プロファイルを使ったことが無いので、プロファイルの結果がどのようなものかをまず知りません (・・; なので、頂いても役に立てられるかはわかりません DxLibMake.sln の件ですが、DXライブラリはどのバージョンをお使いでしょうか? Dx3D.cpp や DxDraw.cpp , DxGraphics.cpp は DirectX7 時代に使用していたファイルで、現在は存在しないファイルです とりあえず↓に最新版の DxLibMake をアップしましたので、よろしければこちらをお使いになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe > naohiro19さん 必ずフルスクリーンモードになる原因が分かりました VisualC++ 2005 の最適化にバグがあったようです orz ( 最適化を ON にすると、ある処理が無効化されて DxLib_Init の途中で必ずウインドウモードのフラグが倒される というものでした、VisualC++ 2010 では直っているようで、2010で最適化コンパイルしても問題は発生しませんでした ) 問題の箇所だけ最適化を行わないようにすることで直りましたので、よろしければお試しになってみてください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用
失礼します。少々わかった事があるので、報告させていただきます。 > こちらの行が > > 7711:引き続き初期化処理... > > この状態で止まっていたのでしょうか? > それとも > > 7711:引き続き初期化処理... 初期化に成功しました > > このように全部出た状態で止まっていたのでしょうか? 本日、偶然該当の現象が発生したので早速確認してみたところ、「〜しました」の、行が全て出た状態で止まっていま した。 また、役に立つかどうか判然としないのですが、偶然プロファイルに成功したばかりだったので、プロファイルの結果 を得る事が出来ました。もともとのCPU使用率上昇の方でも同様にプロファイルの結果が得られました。現在手元に残念 ながら無いのですが、あれば現象解明に使えるでしょうか? 使えるようだったら、積極的に使わせていただきたいと思 います。 > SetScreenMemToVramFlag( FALSE ); をコメントアウトすると現象が発生しなくなる、ということがありましたら、 > 恐らく原因は私が目をつけた箇所と言うことになりそうです 申し訳ありません、そこまでできておりません...。いかんせん運の要素が強すぎる...。 ところで申し訳ありません、別件なのですが、ライブラリのソースコードをダウンロードさせてもらい、VCでコンパ イルを試みてみたのですが、DxLibMake.slnの方が、コンパイルができないようです。途中までいくつかのファイルは できている様なのですが、DxDraw.cpp等、いくつかのファイルが存在しないと出力されます。使用されるべきなのに無 いのか、使用されていないけれどもプロジェクトから削除されてないかの、いずれかだと思います。 あと、こちらはVCのバグの公算が高いので報告しようかどうしようか迷ったので、一応報告させていただきます。 DxDraw〜の方のプロジェクトをReleaseでコンパイルすると、何やらコード生成で処理が終了しなくなるようです。 Debugの時にプロジェクト名等でいくつかの警告が出ていたので、VCのバグか、プロジェクト名に関係した何らかの処 理か、せいぜいが他にはVCのEditionに関係した何かだという気がします。 VCはVC2010EEで、OSはXPです。一応2回、ダウンロードし直させていただきましたが、ダメでした。 長文失礼しました。
>管理人氏 クロスフェードをピクセルシェーダ無しで出来るようになりました! ありがとうございます
> 獅子さん お気遣いありがとうございます 明日から10日ぶりの仕事で気分転換してきます (^ ^; > naohiro19さん ご報告ありがとうございます、現象を確認しました ログを見ても「ウインドウモードで起動します」と出ているのでフラグが保存されていないわけではないなのですが・・・謎です 因みに DxLib_Init の後で ChangeWindowMode( TRUE ) ; をするとウインドウモードになるみたいです Windows7 64bitで lib ファイルを使わずに直接DXライブラリのソースをコンパイルして使用した場合は 今回ご報告いただいたような現象は発生しないのですが・・・ 今日はもう時間切れになってしまったので後日調べたいと思います
DXライブラリの64ビット版で ChangeWindowMode(TRUE); の処理がTRUEに指定されているのになぜかフルスクリーンモードで起動します。
管理人様お疲れ様です(^ω^)
ソフトウエア描画周りの関数を集めた DxDrawFunc.lib の x64版の DxDrawFunc_x64.lib, DxDrawFunc_x64_d.lib を ビルドするのに二つ合わせて1時間も掛かる orz しょうがないのでビルドし忘れが怖いですがバッチファイルを分けて同時進行させることで時間短縮を図ることにしました それでも30分掛かりますが・・・まだマシ・・・ > 南山まさかずさん HP更新履歴の誤字のご指摘ありがとうございます 修正しておきました 起動時に止まってしまう現象についてですが、 7711:引き続き初期化処理... 初期化に成功しました こちらの行が 7711:引き続き初期化処理... この状態で止まっていたのでしょうか? それとも 7711:引き続き初期化処理... 初期化に成功しました このように全部出た状態で止まっていたのでしょうか? というご質問とは別に、プログラムを見てみたら SetScreenMemToVramFlag( FALSE ); を実行してソフトウエア描画モードに なっていた場合のみ丁度 7711:引き続き初期化処理... 初期化に成功しました のログを出力した後に原因となりうるかもしれない処理を走らせていました( DirectDraw の初期化周り ) SetScreenMemToVramFlag( FALSE ); をコメントアウトすると現象が発生しなくなる、ということがありましたら、 恐らく原因は私が目をつけた箇所と言うことになりそうです ただ、まだ怪しいだけでピンポイントには何処だかは確定していないので、まだソースに手を付けるのは止めておきたいと思います
連続で申し訳ありません、ようやくUSBをインターネットに接続されたPCに接続出来る状況になりましたので、簡単ながら報告させていただきます。
まず、下に書かせていただいた件について、ログをはらせていただきます。
4:システムの情報を出力します
943: DXライブラリ Ver3.07f
1014: 論理プロセッサの数 : 1
1035: OS WindowsXP ( Build 2600 Service Pack 3 )
1060: CPUID命令は使えません
1174:COMの初期化... 成功しました
1225:メモリ総量:494.80MB 空きメモリ領域:89.81MB
1254:タイマーの精度を検査します
1300:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60
1312: パフォーマンスカウンターを使用します タイマー精度 : 3579.545000 KHz
1364: ャtトの二重起動検査... 二重起動はされていませんでした
1436:ウインドウクラスを登録します... 登録に成功しました
1457:ウインドウモード起動用のウインドウを作成します
1509:ウインドウの作成に成功しました
1749:IMEを無効にしました
1760:ウインドウスタイルをウインドウモード用に変更します... 完了
1832:DirectInput関係初期化処理
1858: DirectInput7 の取得中... 成功
2475: 引き続き初期化処理... 初期化成功
2586: ジョイパッドの初期化...
2599: ジョイパッドの初期化は正常に終了しました
2608: マウスデバイスの初期化... 初期化成功
2631: キーボードデバイスの初期化... 初期化成功
2714:DirectInput 関連の初期化は正常に終了しました
2743:DirectSound の初期化を行います
2754:DirectSound インターフェースの取得を行います.... 成功
2839:引き続きインターフェースの初期化処理... 成功
5743: DirectSound デバイスを列挙します
5761: モジュール名: ドライバ記述:プライマリ サウンド ドライバ
5771: モジュール名: smwdm.sys ドライバ記述:SoundMAX Digital Audio
5780: 最大サンプリングレート:48.00KHz 最小サンプリングレート:8.00KHz
5793: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB
5802: 利用可買Tンプリング精度
5811: プライマリ 16bit = OK 8bit = NO
5820: セカンダリ 16bit = OK 8bit = NO
5828: 利用可買`ャンネル
5837: プライマリ MONO = OK STEREO = OK
5845: セカンダリ MONO = OK STEREO = OK
5854:DirectSound の初期化は正常に終了しました
6707:DirectDraw オブジェクトの取得を行います.... 成功
7711:引き続き初期化処理... 初期化に成功しました
507980:フォントの初期化を行います
508043:フォントの初期化は正常に終了しました
508055:文字コードバッファの初期化を行います... 完了しました
以下は、関係すると思われる部分のソースです。
//ここから
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
setlocale(LC_ALL,"");
int flg=0;
flg+=ChangeWindowMode(TRUE);
//flg+=SetOutApplicationLogValidFlag(FALSE);
flg+=SetWindowText(_T("簡易スケジューラー"));
flg+=SetDoubleStartValidFlag(TRUE);
flg+=SetScreenMemToVramFlag(FALSE);
flg+=SetGraphMode(WINWIDTH,WINHIGH,16);
fstream Style(_T("style.txt"),ios::in);
if(Style){
int mode;
Style>>mode;
flg+=SetWindowStyleMode(mode);
}flg+=DxLib_Init();
if(flg){
return -1;
}try{
ShowWindow(GetMainWindowHandle(),SW_MINIMIZE);
if(SetAlwaysRunFlag(TRUE)){
throw runtime_error("初期化に失敗しました:SetAlwaysRunFlag");
}if(SetDrawScreen(DX_SCREEN_BACK)){
throw runtime_error("初期化に失敗しました:SetDrawScreen");
}if(SetFontSize(FONTSIZE)||SetFontThickness(FONTWIDTH)){
throw runtime_error("初期化に失敗しました:SetFontSize or SetFontThickness");
}
//以下略......
とりあえず、下に書いた件に関しては、報告は以上です。
その他の件に関しては、現象発生とプロファイリングの成功を待つ段階です。
失礼しました。一部進展があったので報告させていただきます。 CPU使用率上昇のほうではなく、0%のほうなのですが。 昨日PCを立ち上げたところ、偶然現象が発生したので、アプリケーションの動作に関するい ろいろな実験をしてみました。管理人さんのおっしゃる通り動作が止まっていたのですが、そ のあとアクティブにさせてからログのほうを見てみると、どうやらログを取っている途中で止 まっていたようです。 あいまいな記憶で申し訳ないのですが、「引き続き処理を〜」の様な行の後、行が数十秒、 実験を行っていた時間の間とんでいました。後続行が2〜3行だったので、頭のログを取る作 業の最後のほうで止まっていたようです。 ログを貼れるようになったらすぐに貼らさせていただきたいと思います。
管理人さん、スレッドへの案内ありがとうございました。 お蔭様で無事問題も解決しました。
> 私は手元では普通に MinGW の make でビルドしています 管理人さん、ありがとうございます。なんとか頑張ってみます。
かなりどうでもいいことなのですが……。 「DXライブラリのHP更新履歴」の最新の日付が一カ月ほどずれている気がします。
折角のGWだから「やらなきゃいけない作業」以外のこともしたいと思ってそれなりに容易に対応できそうな x64版のlibファイルを作成してみました 概ね正常に動作しているみたいですので、ご興味がある方がいらっしゃいましたらお試しになってみてください http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 ( VisualStudio2005以降で使えます ) _WIN64 の定義がある場合は自動的に x64版の libファイルをリンクするようになっていますので、 「構成マネージャ」で x64 プラットフォームの構成を追加するだけで使えます > 南山まさかずさん > 数十回に一回というかなり低い割合で、たまにソフトのCPU使用率が0%となっていること > があるようです。起動時にまず、いの一番に最小化するようにしているのですが、それをアク > ティブにするとCPU使用率が元通りの10~30%となります。関係はあるのでしょうか? CPU使用率が0%ということは何処かで処理が止まっている可能性があります 0%でも動作はしている、ということでしたらそれはそれで謎です・・・ > 現在、CPU使用率の件に関して、何とかはじめてのプロファイルを行おうと試みています。 > DxLibのほうの関数も念のために調べてみたいのですが、ライブラリのほうに変更を加えなく > てもいいのでしょうか? もし必要なら、DxLibをmsys上のMinGWでビルドするにはどうしたら > よいのでしょうか? プロファイルそのものに関しても、何かしらアドバイスをいただける方 > がいらっしゃいましたらありがたいです。 私は手元では普通に MinGW の make でビルドしています zlibやlibjpegなどのビルドまではしないのでしたら DxWin.cpp DxArchive_.cpp DxBaseImage.cpp DxFont.cpp DxGateway.cpp DxGraphics2.cpp DxGraphicsBase.cpp DxGuid.cpp DxInput.cpp DxJpeg.cpp DxKeyHookBinary.cpp DxMask.cpp DxMath.cpp DxMemImg.cpp DxModel.cpp DxModelLoader0.cpp DxModelLoader1.cpp DxModelLoader2.cpp DxModelLoader3.cpp DxModelRead.cpp DxMovie.cpp DxShaderCodeBin.cpp DxSound.cpp 上記のファイルをデバッグマクロとして DX_GCC_COMPILE と DX_NON_INLINE_ASM を追加してコンパイルすればOKです > あからさん 透過色の無い背景などの画像でしたら単純に SetDrawBlendMode( DX_BLENDMODE_NOBLEND, 255 ); DrawGraph( 0, 0, back_handle, FALSE ); SetDrawBlendMode( DX_BLENDMODE_ALPHA, ( int )( ( 1.0f - t ) * 255.0f ) ); DrawGraph( 0, 0, front_handle, FALSE ); で綺麗にクロスフェードできるのですが、思えばアルファチャンネルや透過色での透過が含まれるキャラクター画像などでは 載せていただいたピクセルシェーダーの計算通りの結果を得るのは既存の描画関数では不可能でした 少し調べてみたところシェーダーを使わない DirectX7 までの機能だけでも実装できることが分かり、機能を追加してみましたので よろしければその機能を追加したこちらのバージョンをダウンロードしてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 以下の関数を追加しました // 描画処理時に描画する画像とブレンドする画像のブレンド設定を行う // BlendGraph を -1 にすれば設定を解除、その場合 BlendType とその後ろのパラメータは無視される int SetBlendGraphParam( int BlendGraph, int BlendType, ... ) ; 今までも LoadBlendGraph と DrawBlendGraph という関数で使用していた画像合成描画の機能を拡張して作った関数で、 二つの画像を合成して描画することが出来ます とりあえず載せていただいたプログラムと同じ計算結果を得られる合成描画を行う場合は SetBlendGraphParam( back_handle, DX_BLENDGRAPHTYPE_NORMAL, ( int )( t * 255.0f ) ) ; DrawGraph( 0, 0, front_handle, TRUE ) ; SetBlendGraphParam( -1, 0 ) ; という感じに、描画する前に SetBlendGraphParam の第一引数に合成したい画像、 第二引数に DX_BLENDGRAPHTYPE_NORMAL、 第三引数にブレンド率( 0( 合成画像0% )〜255( 合成画像100% ) ) を渡して呼んだ後に DrawGraph, DrawExtendGraph, DrawRotaGraph の何れかの描画関数を呼ぶと 指定の通りの合成を施した状態で描画されます( DrawModiGraph は未対応 ) 合成の設定はずっと残ってしまうので、描画した後は第一引数に -1、第二引数に 0 を代入して もう一度 SetBlendGraphParam を呼んでください > いっちさん 既存の固定機能パイプラインの機能では無理でした・・・ > こけしさん もしかするとこちらのスレッドでご報告頂いた現象と同じかもしれませんので、よろしければご覧になってみてください http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1771
> 以下のスレッドの事象と同じではないでしょうか? > > http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=2414 まったく同様の現象でした(汗)。 よく確認せずに書きこんでしまい、申し訳ありません。 少々質問のようなものが。 現在、CPU使用率の件に関して、何とかはじめてのプロファイルを行おうと試みています。 DxLibのほうの関数も念のために調べてみたいのですが、ライブラリのほうに変更を加えなく てもいいのでしょうか? もし必要なら、DxLibをmsys上のMinGWでビルドするにはどうしたら よいのでしょうか? プロファイルそのものに関しても、何かしらアドバイスをいただける方 がいらっしゃいましたらありがたいです。
申し訳ございません。 DXライブラリ製でした
技術面の質問ではないのですが、OSをwindows7の64bitに変えてから、DirectX製のゲームを起動すると どのゲームでも「ジィィ」といった感じの爆音のノイズが必ず流れるようになりました。何方か原因を教えてください
以下のスレッドの事象と同じではないでしょうか? > http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=2414
ログを取る設定にしてみたところ、問題の本質とは関係のないところで別の現象が。 しばらくUSBをネットにつながったPCに接続できそうにないので、口頭(?)で説明せ ざるを得ないのですが、どうやらログが文字化けしているようです。パッと見たところ3か所 ほど文字化けしています。覚えている限りでは、二重起動のチェック、二か所ほどある「利用 可能〜」の場所です。 大雑把な報告で申し訳ありません。
あからさん> 厳密に同じ処理を行う場合は SoftImage 系を利用するほか無いと思います。 他にクロスフェードのような演出を行う方法としては DrawBlendGraph や DrawPolygon と SetDrawBlendMode の組み合わせで実現するのが一般的ではないかと思います。 ※追記 画面全体を均一にブレンドするだけであれば DrawPolygon は必要ないです。 普通に DrawGraph と SetDrawBlendMode で行うと思います。 (ちゃんとコードを読んでいませんでした。ごめんなさい)
> 南山まさかずさん> > 事象発生時のログを貼り付けていただけますか? しばらく取り込んでいて返信が出来ませんでした、申し訳ありません。 しばらくログを有効にしてCPU使用率が上がるのを待ってみたいと思います。
DxライブラリHOME にある サンプルプログラムのチャットプログラムを見ることで解決しました。 おさわがせしてすみませんでした。
ピクセルシェーダでやっている事をDXライブラリの標準関数でどうにか実現できないか悩んでいます
クロスフェード描画(時間tをメインループごとに加算し、0->1にしてスムーズな絵の切り替わりを表現する)を以下の方法で実装しているのですが、
標準関数でどうにかならないでしょうか
// C++側 ===============================
// 使用するテクスチャをセット
SetUseTextureToShader( 0, front_handle ) ;
SetUseTextureToShader( 1, back_handle ) ;
SetPSConstF( 0, t ) ;
// 描画
DrawPrimitive2DToShader( vert, 6, DX_PRIMTYPE_TRIANGLELIST ) ;
//=====================================================
struct PS_INPUT
{
float4 Diffuse : COLOR0 ;
float4 Specular : COLOR1 ;
float2 TexCoords0 : TEXCOORD0 ;
float2 TexCoords1 : TEXCOORD1 ;
} ;
struct PS_OUTPUT
{
float4 Output : COLOR0 ;
} ;
sampler sampler0 : register( s0 ) ;
sampler sampler1 : register( s1 ) ;
float4 t : register( c0 );
PS_OUTPUT main( PS_INPUT psin )
{
PS_OUTPUT psout ;
float4 A = tex2D(sampler0, psin.TexCoords0);
float4 B = tex2D(sampler1, psin.TexCoords0);
psout.Output.rgb = ((1 - t.x) * (A.a * A.rgb) + t.x * (B.a * B.rgb));
psout.Output.a = (1 - t.x) * A.a + t.x * B.a
return psout;
}
すみませんもう少し具体的に悩みを相談させてもらいます。 シングルスレッドにおいて KeyInputStringを使って日本語入力を得ようとしたのですが、 エンターをおすごとにアニメーションが一フレーム?ずつ動く感じになってしまって、 何も入力してないときでも(エンターを連打しなくても) アニメーションが動作するようにしたいのです。 入力をうけつけながら描画も更新する(ループが待たないで止まらない?) ことはほかの関数を使わないと無理なのでしょうか? あるとしたらどの関数を使えばいいのでしょう?
> たとえばクイズゲームなどでプレイヤーの入力(日本語)を受け取りつつ
> タイマーなどで制限時間をはかりつつ
> なんらかのモデルのアニメーション(簡単なので問題文が左右に動くとかでもいい)
while(){
入力チェック
時間経過チェック
画面描画
}
とすればシングルスレッドで十分できますけど。>tonyさん 具体的にどういったところが分からないのでしょうか。 リファレンスを見れば使う関数などは分かるはずです。 また、時間のかかる処理をバックグラウンドで行いたい場合はともかく、 無暗にスレッドを分割しても面倒が増えるだけだと思います。
はじめまして。プログラム初心者です。 たとえばクイズゲームなどでプレイヤーの入力(日本語)を受け取りつつ タイマーなどで制限時間をはかりつつ なんらかのモデルのアニメーション(簡単なので問題文が左右に動くとかでもいい) この機能を実現するにはDxLibではどうしたらいいのでしょうか? SetMultiThreadFlag(TRUE)にして入力を受け取る部分、時間を測る部分、メインスレッドの描画部分にわけてプログラミングしてみたいのですがDxLibで実現可能でしょうか?
いっちさん> 2D 系の関数しか見てませんでした。ありがとうございます
南山まさかずさん> 事象発生時のログを貼り付けていただけますか?
> CPU使用率が異常に高くなりつつも正常に動作しているのでしょうか? はい、CPU使用率以外は正常に動作しています。 > DirectX9 では DirectX7 の頃とは違い(――中略――)異常に高くなるということは無い はずなのです・・・ ScreenFlipはメインとなるループに付き一回、もしくは一定の描写処理を行った度に呼んで います。 また、CPU使用率が高いときと低いときで、ScreenFlipの呼び出しに影響があるような違い は特にありません。 ……僕のPCではいったい何が起きているのか……。 追記 数十回に一回というかなり低い割合で、たまにソフトのCPU使用率が0%となっていること があるようです。起動時にまず、いの一番に最小化するようにしているのですが、それをアク ティブにするとCPU使用率が元通りの10~30%となります。関係はあるのでしょうか?
トイトイさん> DrawPolygon で出来ると思います。
2D なんですが DrawBox, DrawTriangle などで各頂点の色を指定して グラデーションのように描画する関数はございませんでしょうか? グラデーションは動的に変わるので、画像の表示でまかなうことはできないんです。
>管理人様 バージョンアップおつかれ様です。さっそく使わせていただきます。 またアドバイスありがとうございました。勉強不足ですいません。
> 南山まさかずさん CPU使用率が異常に高くなりつつも正常に動作しているのでしょうか? DirectX9 では DirectX7 の頃とは違い SetWaitVSyncFlag で垂直同期をOFFにしていない限りは ScreenFlip を定期的に 呼ぶだけでCPU使用率が低くなる( 垂直同期までの間 Sleep する )ので、ScreenFlip が正常に動作していればCPU使用率が 異常に高くなるということは無いはずなのです・・・ ただ、ScreenFlip を使用しないソフトでしたら、明示的に定期的に Sleep を使用しないとCPU使用率は高くなります ( DXライブラリ側では非アクティブの時は ScreenFlip 以外で Sleep を使用している箇所が無いので ) ScreenFlip を使用しないソフトで普段CPU使用率が低く保てている場合はどこかで Sleep を使用しているのだと思いますが、 その場合でCPU使用率が高いままになるということは Sleep を呼んでいるところに処理が来ていないということになります
些細なことながらずいぶん前から気になっていることがあるので、質問させていただきま す。 DXLibを使用した自作ソフトをスタートアップに登録しているのですが、PCの起動数回に一 回ほどの割合で、CPU使用率が異常に高くなることがあります。 もう少し正確に言うと、CPU使用率が高い状況が継続する、といった感じです。一度ソフト を落としてから再起動すると、CPU使用率は正常値に戻ります。 通常時はせいぜいが10~20%なのが、時には90%程にまで上昇したまま下がりません。起動時 のCPU使用率をそのまま継続して引きずっているといった感じです。 これはいったいどのような現象なのでしょうか? 何か意見を頂けたらありがたいです。
新バージョン 3.07f をアップしました 今回のバージョンアップで3Dモデルの描画に自前のシェーダーを使えるようになりました ( MV1SetUseOrigShader という関数を使用します http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R19N1 ) これでシェーダープログラムを組めばDXライブラリのデフォルトのモデル描画の見た目から脱却することができます あと、不動小数点型の画像も作成できるようになりましたので真のHDRも可能です ( SetDrawValidFloatTypeGraphCreateFlag という関数を使用します http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_graph.html#R3N34 ) 加えて複数の描画先に同時に描画するマルチレンダーターゲットにも対応しましたので、やろうと思えば Deferred Shading もできます ( SetRenderTargetToShader という関数を使用します http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R17N28 ) あと、今までリファレンスに載せていなかったシェーダーを扱う関数の解説も追加しましたので、 ご使用の予定がありましたらご覧になってみてください ( リファレンスの3D関数関係のページのモデルを扱う関数の一覧の更に下にあります http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html ) あと、自前のシェーダープログラムを使ってモデルを描画するサンプルやシェーダーを利用したサンプルを二つほど追加しましたので、 ご興味があります方はよろしければ3D関係のサンプルのページをご覧になってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/program/dxprogram_3D.html > ピラミッドハウスさん フレームが持つメッシュの一点一点のことでしたら負荷は高くなりますが「参照用メッシュ」の機能を使用すれば 座標を取得することができます、よろしければ MV1SetupReferenceMesh の解説をご覧になってみてください http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R10N1 > あからさん > メインスレッドのProcessMessage()で処理ということは、自前で立てたスレッドでProcessMessage()しても無駄ということですよね? はい、正確には DxLib_Init を呼んだスレッドとなります。 Direct3D9 を非マルチスレッド対応で使用した場合は Direct3D9 を作成したスレッドで Direct3D9 のAPIを呼ばないと 不正な処理でエラー終了してしまうので・・・
> 獅子さん> > 以下のスレッドに同様の質問に対する管理人さんの回答があります。 > > http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=2007 > ありがとうございます。すでに同様の質問があったのですね、よく確認せずにすみませんでした。 Zバッファの深度値にアクセスするのは処理負荷が高いとのことですし、今まで通りカメラとの距離をはかる方法でいくことにします。 いっちさんありがとうございました。
獅子さん> 以下のスレッドに同様の質問に対する管理人さんの回答があります。 > http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=2007
書き込んだZバッファを取り出すことってできないんでしょうか? Zソートのときいちいちカメラとの距離を測るのが無駄な気がしてるんですが
>Willさん ProcessMessageを挟んだところ、正常に動作しました。ありがとうございます。 >管理人氏 サンプルコードのように書いたところ、正常に読み込むことができました。 ありがとうございます。 メインスレッドのProcessMessage()で処理ということは、自前で立てたスレッドでProcessMessage()しても無駄ということですよね?
> > ピラミッドハウスさん > モザイクを掛けたい箇所にボーンを仕込んでおいて、MakeScreen で作成した描画可能画像に3Dモデルを描画した後 > MV1GetFramePosition で仕込んだボーンの3D座標を取得してその座標を ConvWorldPosToScreenPos でスクリーン座標( 2D座標 )に変換、 > 取得したスクリーン座標の周辺をモザイク処理する、というので実現できないでしょうか? 管理人様、どうもアドバイスありがとうございます。 考え方としてはそれでいけそうな気がします。 MV1GetFrameMaxVertexLocalPositionとMV1GetFrameMinVertexLocalPositionを使って 対象の最大値と最小値が判れば四角形のモザイクは出来るかもしれません。 しかしさらに精度を上げようとするならば、フレームの座標一点一点の情報が欲しいところです。 自分が調べた限り、そのような関数は無かったですが、そんな事は可能でしょうか?
> あからさん
Willさんのご返信の通り while の中に ProcessMessage を入れてみてください
while( CheckHandleASyncLoad(handle) != FALSE ){
ProcessMessage();
Sleep(1);
}
Direct3D9 はマルチスレッド対応モードで起動すると動作が凄く重くなるのでマルチスレッド非対応モードで起動して、
SetUseASyncLoadFlag( TRUE ) ; の設定で LoadGraph を行った場合も Direct3D9 の操作が必要な処理だけ
メインスレッドの ProcessMessage の中で処理するようにしています
なので ProcessMessage を呼ばないと Direct3D9 の操作が必要なところで処理が止まってしまうというわけです
> nnnさん
他の掲示板で既にご対応が進んでいるようですのでここでのご返信は控えておきます
> ピラミッドハウスさん
モザイクを掛けたい箇所にボーンを仕込んでおいて、MakeScreen で作成した描画可能画像に3Dモデルを描画した後
MV1GetFramePosition で仕込んだボーンの3D座標を取得してその座標を ConvWorldPosToScreenPos でスクリーン座標( 2D座標 )に変換、
取得したスクリーン座標の周辺をモザイク処理する、というので実現できないでしょうか?3D表示である部分だけモザイク、またはぼかしをかけたいのですが、どうすればいいのか検討がつきません。 2Dでモザイクをかける事は可能だと思いますが、3Dの場合モデルが回転したりするので難しいです。 どなたか考え方を教えてもらえないでしょうか?
DxLibを使っているのですがRelease構成にしてフォルダをデスクトップにコピーしてもjpgが表示されません。 最初EXEファイルと画像ファイルだけをデスクトップにコピーして実行したらbmpは表示されるのですが、jpgは表示できませんでした。 その後Releaseフォルダ全部をデスクトップにコピーしましたがやはりjpgは表示されません。 どうしたら表示できますか?
その待ち方だとProcessMessageが全く実行されないので問題だと思います。
while( CheckHandleASyncLoad(handle) != FALSE ){
//Sleep(1);
continue;
}
とした場合正常に動作しませんか?
#あと古いバージョンだと不具合があるみたいなので最新を使用してみてください。度々済みません。
非同期読み込みを待つ際に下記のような書き方をしてみたのですが、
while( CheckHandleASyncLoad(handle) != FALSE )のループから抜けてくれません。
このような待ちかたでは非同期読み込み処理も止まってしまうのでしょうか?
解決方法についてアドバイスが貰えればとおもいます。
#include <DxLib.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
ChangeWindowMode( TRUE ) ;
SetGraphMode( 600 , 480 , 16 ) ;
SetMainWindowText( "Games" ) ;
if( DxLib_Init() == -1 )
{ return -1;}
SetDrawScreen( DX_SCREEN_BACK ) ;
SetUseASyncLoadFlag(TRUE);
int handle = LoadGraph("a.bmp");
SetUseASyncLoadFlag(FALSE);
while(ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0)
{
clsDx();
ClearDrawScreen();
while( CheckHandleASyncLoad(handle) != FALSE ){
Sleep(1);
}
DrawGraph(0,0,handle,TRUE);
ScreenFlip() ;
}
DxLib_End() ;
return 0 ;
}
- Aska BBS -