トップページ > 記事閲覧
DIBやDirectXについて
名前:ギウ 日時: 2019/05/22 21:41

>管理人様 別スレッドの、SetSoftRenderModeUserScreenImageの続きです。(本題とずれてきたので別スレッドにしました) <概要> WindowsでDIBを使うとまずいことを思い出しましたので、DIBを使わない方法を知りたいです。 <理由> 某サイト(名前を書いて良いのかわからないので伏せます)の機能に、チャットや実績を自動表示する機能があるのですが、 DIBだとその自動機能で描画できない為、DirectXを使って描画しておく必要があります。 <質問> DXLibでDIBを使わないようにするには、 ↓を使用しない(またはTRUEにする)であってるでしょうか。 SetScreenMemToVramFlag(FALSE); この場合、 SetSoftRenderModeUserScreenImage は使用せず、ReCreateGraphFromSoftImage や Lock する方法で転送すれば良いでしょうか。 以上です。 P.S Android版の方は、DX_SOFTRENDER_SCREEN_FORMAT_R5G5B5X1を使って、1500usまで高速化することができました^^ 感謝。
メンテ

Page: 1 | 2 |

Re: DIBやDirectXについて ( No.14 )
名前:ギウ 日時:2019/05/31 00:24

>管理人様 追加で質問です。 この関数ですが、 SetUserScreenImage(vram_map16[page], DX_USER_SCREEN_PIXEL_FORMAT_R5G6B5); Flip後に毎回実行して、表示するメモリを切り替えても問題ないでしょうか。(一応、実行してみた感じでは大丈夫そうでしたけど) やりたいことは、 画面用のメモリマップを表と裏の2つ持っておき、 メインスレッドでFlip中に、別スレッドで次の描画を開始する感じです。 (次のFlip直前に、SetUserScreenImageで描画するマップを切り替える) これが可能なら1000us以上速くできそうなので。 念のため、ご確認お願いいたします。
メンテ
Re: DIBやDirectXについて ( No.15 )
名前:管理人 日時:2019/05/31 00:56

> この関数ですが、 > SetUserScreenImage(vram_map16[page], DX_USER_SCREEN_PIXEL_FORMAT_R5G6B5); > Flip後に毎回実行して、表示するメモリを切り替えても問題ないでしょうか。(一応、実行してみた感じでは大丈夫そうでしたけど) はい、問題ありません ScreenFlip から出た時点でテクスチャへの転送は終わっていますので、SetUserScreenImage 内部で書き換えられる ポインタ変数のアドレスが変化しても問題ないので… > やりたいことは、 > 画面用のメモリマップを表と裏の2つ持っておき、 > メインスレッドで、表マップをSetUserScreenImageに設定してFlip開始したら、直ぐに別スレッドで裏マップにゲームの絵を描き始める。 > ゲームの描画が終わったあと、メインのスレッドで裏マップをSetUserScreenImageに設定してFlip・・・ > を繰り返す感じです。 > > これが可能なら1000us以上速くできそうなので。 なるほど、そのような方法が…1ms以上は凄いですね そういえば、昔ソフトウェアレンダリングの高速化で『2コア使って画面の描画を半分づつ(奇数ラインをコア0、偶数ラインをコア1)担当したら描画速度2倍…とはいかなくとも それなりに高速化できるのでは?』などと考えたことがあります、グラフィックスAPIを使うのと異なって色々工夫の余地があるのが良いですね…
メンテ
Re: DIBやDirectXについて ( No.16 )
名前:ギウ(解決) 日時:2019/05/31 06:36

>管理人様 了解です! 良かったです。 >なるほど、そのような方法が…1ms以上は凄いですね Android版は、960x540の背景画像を転送するだけでも1ms前後かかってるので、一番大きいのはそれですね。 あと、メインの矩形以外の部分を、1フレーム遅れになりますが先に描いておこうかなと。 >そういえば、昔ソフトウェアレンダリングの高速化で『2コア使って画面の描画を半分づつ(奇数ラインをコア0、偶数ラインをコア1) お! それと似たことやってますよ! 今作ってるゲームは縦に区切りやすいので、3コア使って画面を縦に3分割して描画してます。 >グラフィックスAPIを使うのと異なって色々工夫の余地があるのが良いですね… ですね。 プログラム次第で劇的に高速化できたりするんで楽しいです^^
メンテ
Re: DIBやDirectXについて ( No.17 )
名前:ギウ(解決) 日時:2019/05/31 09:11

(追伸:結果報告) やってみましたが、処理は上手く行ってるんですけど、速度はほとんど変わりませんでした。。残念。 たぶん、キャッシュとかスレッドの待ち時間とかいろいろ関係してるんでしょうけど。 あと、スレッド使い過ぎなのかもw
メンテ
Re: DIBやDirectXについて ( No.18 )
名前:管理人(解決) 日時:2019/06/02 03:59

ご返答ありがとうございます > お! それと似たことやってますよ! > 今作ってるゲームは縦に区切りやすいので、3コア使って画面を縦に3分割して描画してます。 なんと、既に分割描画を実践されていたとは…! > やってみましたが、処理は上手く行ってるんですけど、速度はほとんど変わりませんでした。。残念。 > たぶん、キャッシュとかスレッドの待ち時間とかいろいろ関係してるんでしょうけど。 > あと、スレッド使い過ぎなのかもw 残念、効果なしでしたか… 書き込みアクセスのメモリ領域が近すぎると書き込みキャッシュが衝突してストール…とかですかね お試しいただきありがとうございます m(_ _)m
メンテ
Re: DIBやDirectXについて ( No.19 )
名前:ギウ 日時:2019/06/04 07:43

>書き込みアクセスのメモリ領域が近すぎると書き込みキャッシュが衝突してストール…とかですかね こういうのが関係してるのかもですが、 最新のAndroid版でタイトル画面だけを表示した時の速度が安定しません。 描画と関係ないとこを触ってビルドしなおすと、1/2くらいの確率で、 8msだったり、5msだったりと、3msくらいの差が出ます。 8msのビルド状態でゲームを閉じて、ゲームを再起動しても8msになり、 5msのビルド状態でも同じく5msになります。 以前からあったのか、最新版だけなのかは分からないですが、一応ご報告ということで。
メンテ
Re: DIBやDirectXについて ( No.20 )
名前:管理人 日時:2019/06/05 23:16

> 8msのビルド状態でゲームを閉じて、ゲームを再起動しても8msになり、 > 5msのビルド状態でも同じく5msになります。 >  > 以前からあったのか、最新版だけなのかは分からないですが、一応ご報告ということで。 私の環境では常に3ms程度の揺らぎがありますが、安定して3ms遅かったり速かったりということは無いですね… テクスチャへの画像イメージの転送に掛かる時間が一定ではないのではないかと推測していますが… ( OpenGL 内部でメモリを確保して使用してその後解放していると思うので、その時の空きメモリの断片化状況などで  処理に掛かる時間が変化しているのではないか?等 )
メンテ
Re: DIBやDirectXについて ( No.21 )
名前:ギウ(解決) 日時:2019/06/06 06:21

了解です。では気にしないのが良さそうですね。 あ、揺らぎについては、100フレーム分の平均値を表示してるので、ある程度まとまってくれる感じです。
メンテ
Re: DIBやDirectXについて ( No.22 )
名前:ギウ 日時:2019/06/11 23:56

新関数のR5G6B5のPC版で、画面が真っ暗で遊べないとの報告がありました。 Windowsは7(64bit)とのことです。 何かわかるでしょうか。
メンテ
Re: DIBやDirectXについて ( No.23 )
名前:ギウ 日時:2019/06/12 00:13

一先ず、以前の MakeX1R5G5B5ColorSoftImage で実行確認をしてもらい中です。(返信来たら追記します)
メンテ
Re: DIBやDirectXについて ( No.24 )
名前:管理人 日時:2019/06/12 23:36

> 新関数のR5G6B5のPC版で、画面が真っ暗で遊べないとの報告がありました。 > Windowsは7(64bit)とのことです。 おぉ…そうですか…すみません 真っ暗になってしまった際のログファイル( Log.txt )を頂くことは可能でしょうか?
メンテ
Re: DIBやDirectXについて ( No.25 )
名前:ギウ 日時:2019/06/12 23:39

>管理人様 MakeX1R5G5B5ColorSoftImage の方は正常に表示されたとのことです! >真っ暗になってしまった際のログファイル( Log.txt )を頂くことは可能でしょうか? 了解です。確認してみます!
メンテ
Re: DIBやDirectXについて ( No.26 )
名前:ギウ 日時:2019/06/13 23:18

Log出力するようにしたのを渡したんですが、Logが出ないらしいです。(私の方では出てるんですが) なのでフォルダでF5を押してみてとか、DirectXのバージョンの確認をしてもらってます。 あと、見た目が黒いだけで、音再生やゲームの操作はできてるようです。
メンテ
Re: DIBやDirectXについて ( No.27 )
名前:管理人 日時:2019/06/14 00:18

ご確認ありがとうございます > Log出力するようにしたのを渡したんですが、Logが出ないらしいです。(私の方では出てるんですが) C:\Program Files (x86) 以下にインストールされていると書き込み設定でファイルを作成できない、とかですかね… ともあれ、すみません、グラフィックスデバイスが R5G6B5フォーマットのテクスチャに対応していない 場合の処理を書いていませんでした( 現在でも R5G6B5 に対応していない環境があるとは思わず… ) R5G6B5 に対応していなかったら X1R5G5B5 や X8R8G8B8 などの別のフォーマットで代用する 処理を追加しましたので、よろしければこちらをお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.2 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: DIBやDirectXについて ( No.28 )
名前:ギウ 日時:2019/06/14 08:04

>管理人様 ありがとうございます! なるほど、確かに古いPC使ってそうなので、その可能性有りです。 最新版を取得して、R5G6B5ではなく、X1R5G5B5用の新関数版を送っておきました。(返信きましたらまたご連絡します) ※逆に、X1R5G5B5に対応してない場合は、R5G6B5になりますよね? 私のPCだと、555でも565でも新関数の速度は変わらないので、 予想としては、最近のPCは555も565も対応していて、速度もほとんど変わらないのかなと。 で、ゲーム的にはX1R5G5B5の方がメリットがあるので、PC側はX1R5G5B5で行くことにしました。
メンテ
Re: DIBやDirectXについて ( No.29 )
名前:ギウ 日時:2019/06/15 01:18

ということで、X1R5G5B5版は問題なく動いたとのことです!
メンテ
Re: DIBやDirectXについて ( No.30 )
名前:管理人 日時:2019/06/16 03:07

> ※逆に、X1R5G5B5に対応してない場合は、R5G6B5になりますよね? すみません、今見直したら X1R5G5B5 に対応していない場合は A8B8G8R8 になるようになっていました( Direct3D 9 の場合は A8R8G8B8 ) DX_USER_SCREEN_PIXEL_FORMAT の種類を無駄に増やしてしまい、且つ Direct3D 11 と Direct3D 9 で別の処理となっているので頭がこんがらがり 割り当てが適当になってしまっていました なので、以下のように整理しました DX_USER_SCREEN_PIXEL_FORMAT_R5G6B5 が指定されていた場合 Direct3D 11 の場合 R5G6B5 -> A1R5G5B5 -> A8B8G8R8 の順で対応状況を検査     Direct3D 9 の場合 R5G6B5 -> X1R5G5B5 -> A1R5G5B5 の順で対応状況を検査 DX_USER_SCREEN_PIXEL_FORMAT_X1R5G5B5 が指定されていた場合 Direct3D 11 の場合 A1R5G5B5 -> R5G6B5 -> A8B8G8R8 の順で対応状況を検査     Direct3D 9 の場合 X1R5G5B5 -> A1R5G5B5 -> A8R8G8B8 -> A4R4G4B4 の順で対応状況を検査 ( X1R5G5B5 の場合 Direct3D 11 では A1R5G5B5 の後 R5G6B5 となっているのは、Direct3D 11 には X1R5G5B5 のフォーマットが無いためです ) 何度も申し訳ありませんが、よろしければ上記の修正を加えたこちらのバージョンをダウンロードしてください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.2 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) > ということで、X1R5G5B5版は問題なく動いたとのことです! ぉお? No.27 の修正版を使用されたバージョンで正常に動作したということでしょうか?
メンテ
Re: DIBやDirectXについて ( No.31 )
名前:ギウ 日時:2019/06/16 08:01

>管理人様 おお、最新版ありがとうございます! DLしました。また確認してもらいます! >No.27 の修正版を使用されたバージョンで正常に動作したということでしょうか? はい、そのバージョンです。 DirectXは11とのことでした。 ただ、速度を計ってもらったところ、  タイトル 8000  戦闘中 13000(=ゲーム部分が5msくらい) で、私のPCの場合は、  タイトル 1500  戦闘中 6500(=ゲーム部分が5msくらい) と、CPU速度は変わらないのにVRAMへの転送が遅いので、 X1R5G5B5では表示されず、A8B8G8R8(?)で表示されてるのかもですね。 No.30のバージョンなら、A1R5G5B5 で表示されてもっと速くなるかもという感じでしょうか。 返信きたらまた書き込みます!
メンテ
Re: DIBやDirectXについて ( No.32 )
名前:管理人 日時:2019/06/16 15:45

> >No.27 の修正版を使用されたバージョンで正常に動作したということでしょうか? >  > はい、そのバージョンです。 > DirectXは11とのことでした。 おお、ひとまず今回の対策が正常に機能したようで何よりです > No.30のバージョンなら、A1R5G5B5 で表示されてもっと速くなるかもという感じでしょうか。 いえ、Direct3D 11 は RGB555 系は A1R5G5B5 しか無いので、A1R5G5B5 に対応していない場合は No.30 の表の通り次は R5G6B5 が試されると思います、ただ、最初 R5G6B5 で画面が真っ暗に なってしまったということは R5G6B5 にも対応していないと思いますので、No.30 のバージョンでも No.27 のバージョンと同じく A8B8G8R8 が使用され、結果として速度に変化は無いと思います R5G6B5 にも X1R5G5B5 にも対応していないグラフィックスデバイスが何なのか知りたいところではありますね…
メンテ
Re: DIBやDirectXについて ( No.33 )
名前:ギウ(解決) 日時:2019/06/16 15:53

返信きました。 仰る通り、速度に変更なしとのことです。 >R5G6B5 にも X1R5G5B5 にも対応していないグラフィックスデバイスが何なのか知りたいところではありますね… 謎ですね。あ、ハイカラー自体に対応してないとか。。 一先ず、今回の件は完了ということで。 ありがとうございました!
メンテ

Page: 1 | 2 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存