トップページ > 過去ログ > 記事閲覧
管理人様へ質問
名前:憂煉 日時: 2008/10/25 19:54

現在DXライブラリの互換ライブラリを製作中なのですが、管理人様にいくつか質問したい点があります。 @DX_BLENDMODE_MULAを指定してもDrawBox等のテクスチャステージを使わない関数だとα値が無視される。  DX_BLENDMODE_INVSRCでも同様です。バグなのか仕様なのかわかりませんでした。 Aグラフィックの分割表示処理について  Dx3D.cppで使われている1枚の画像を複数のテクスチャで描画している部分なのですが、私の修行不足故にソースを見ただけでは何をしているのか理解できませんでした。  アルゴリズムを教えていただけると助かります。 Bエフェクトの実装について…  これはDXLIBHに実装予定のエフェクト機能に関してなのですが、実装案が二つあって決まらないので意見を伺いたいです。   *プランA   エフェクトハンドラを使う方法。よく使いそうなものは最初からDX9_EFFECT_DISTORTIONのように組み込んでおく。   int LoadEffect(char *filename);//エフェクトのためのファイルをロードし、エフェクトハンドルを返す。   int SetEffect(int EffectHandle);//利用するエフェクトをセットする。-1が指定された場合はエフェクトを使わない。   int SetEffectParam(int ParamSlot,int Param);//エフェクトが使うデータ(グラフィックハンドルや定数)を設定   *プランB   エフェクトの種類だけエフェクトの関数を用意する。   int DistortionEffect(int GrHandle);//描画する際に指定されたグラフィックハンドルの赤緑成分に応じてゆがめる。   int MosaicEffect(int PixelSize);//PixelSizeで指定された大きさのモザイクとして描画する。   int InitEffect();//エフェクトの適用を無効にする。

Page: 1 |

Re: 管理人様へ質問 ( No.1 )
名前:憂煉 日時:2008/10/25 20:02

Bに関しては管理人様以外の方の意見も欲しいです。 どちらが使いやすそうだとか、もっといい方法思いついた!とか、エフェクトについてkwskとか、そもそもいらないよこんな機能。とかいった意見が欲しいです。 ちなみに現在の作成状況ですがMask系とFont系の関数以外の主な関数(このサイトのトップページから入れる関数説明に載っているもの)を実装完了しました。
ついでに ( No.2 )
名前:憂煉 日時:2008/10/26 00:40

中間テストが終わったので久々にSSE最適化を… SSEに対応していないCPU(PenII以前)やOS(Windows95以前)だとハングアップするので注意する必要があります。 SSEが使えるかどうかに応じて関数ポインタで処理を切り替えるのが得策かもしれません。 int CreateMultiplyMatrix_SSE(MATRIX *Dest,const MATRIX *Src1,const MATRIX *Src2) { if(Dest == NULL)return -1; __asm { mov eax, Src1 mov ebx, Src2 mov ecx, Dest movups xmm4, [ebx + 0] //Src2のデータをセット movups xmm5, [ebx + 16] movups xmm6, [ebx + 32] movups xmm7, [ebx + 48] movss xmm0, [eax + 0] //m1x計算 movss xmm1, [eax + 4] movss xmm2, [eax + 8] movss xmm3, [eax + 12] shufps xmm0, xmm0 ,0x00 shufps xmm1, xmm1 ,0x00 shufps xmm2, xmm2 ,0x00 shufps xmm3, xmm3 ,0x00 mulps xmm0, xmm4 mulps xmm1, xmm5 mulps xmm2, xmm6 mulps xmm3, xmm7 addps xmm0, xmm1 addps xmm0, xmm2 addps xmm0, xmm3 movups [ecx + 0],xmm0 movss xmm0, [eax + 16] //m2x計算 movss xmm1, [eax + 20] movss xmm2, [eax + 24] movss xmm3, [eax + 28] shufps xmm0, xmm0 ,0x00 shufps xmm1, xmm1 ,0x00 shufps xmm2, xmm2 ,0x00 shufps xmm3, xmm3 ,0x00 mulps xmm0, xmm4 mulps xmm1, xmm5 mulps xmm2, xmm6 mulps xmm3, xmm7 addps xmm0, xmm1 addps xmm0, xmm2 addps xmm0, xmm3 movups [ecx + 16],xmm0 movss xmm0, [eax + 32] //m3x計算 movss xmm1, [eax + 36] movss xmm2, [eax + 40] movss xmm3, [eax + 44] shufps xmm0, xmm0 ,0x00 shufps xmm1, xmm1 ,0x00 shufps xmm2, xmm2 ,0x00 shufps xmm3, xmm3 ,0x00 mulps xmm0, xmm4 mulps xmm1, xmm5 mulps xmm2, xmm6 mulps xmm3, xmm7 addps xmm0, xmm1 addps xmm0, xmm2 addps xmm0, xmm3 movups [ecx + 32],xmm0 movss xmm0, [eax + 48] //m4x計算 movss xmm1, [eax + 52] movss xmm2, [eax + 56] movss xmm3, [eax + 60] shufps xmm0, xmm0 ,0x00 shufps xmm1, xmm1 ,0x00 shufps xmm2, xmm2 ,0x00 shufps xmm3, xmm3 ,0x00 mulps xmm0, xmm4 mulps xmm1, xmm5 mulps xmm2, xmm6 mulps xmm3, xmm7 addps xmm0, xmm1 addps xmm0, xmm2 addps xmm0, xmm3 movups [ecx + 48],xmm0 } return 0; } 以下の環境でDXライブラリに用意されている関数のおおよそ3.3倍ほど高速でした。 CPU:Core2Duo@2.5GHz MEM:4GB
Re: 管理人様へ質問 ( No.3 )
名前:管理人 日時:2008/11/03 22:49

@ すいません、バグです。修正しました。orz 必要ないかもしれませんが一応こちらにアップしてあります。m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe //ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) A 今なら分割しないで、指定のサイズが収まる最小の2のn乗のサイズを持つテクスチャを使用したほうが良いような気がします。 実装も複雑になってしまいますし・・・ とりあえず分割のアルゴリズムは 1.画像のサイズ値より小さい、一番大きい2のn乗の値を割り出す 2.画像のサイズ値から1で割り出した値を引く 3.残ったサイズ値が1で割り出した値の4分の3より大きい場合は、   分割するより1で割り出した値を2倍にした方が効率が良いと判断して1で割り出したサイズを2倍にして終了 4.3で終了しなかった場合は1で割り出した値を配列に保存して分割カウントをインクリメントしたあと1に戻る という感じです。 上記には書きませんでしたが、上記以外に割り出したテクスチャのサイズが3Dデバイスが対応しているサイズの範囲から 外れていないかや、外れている場合の補正処理などが加わります。 これを横サイズ、縦サイズそれぞれに対して行い、出来上がったサイズリストから分割テクスチャを作成するという感じです。 B 難しいところですね・・・・ 多分公開関数としてはプランB的なものを用意して( SetDrawEffect( DX_EFFECT_MOSAIC, 10 ) ; のような・・・ ) それ以外の非公開関数としてプランA的なものを用意することになると思います > SSE 3.3倍ですか! 私が勉強でソフトウエア頂点演算をSSE化した時はCのソースと速度が全く変わりませんでした orz
Re: 管理人様へ質問 ( No.4 )
名前:憂煉 日時:2008/11/04 23:06

@ いえ、DXライブラリの描画機能だけ置き換えるためのライブラリなのでDXライブラリも使わないと全く使い物になりません(笑) 音楽とかウィンドウ処理は全部DXライブラリ任せで、DrawGraphとかを#defineでDx9DrawGraphというように呼び出し先を強引に変更してます。 A 古いオンボード物だとDirectX9は使えるけれどテクスチャが256x256までしか…というケースもあるので必要だったんです。本当にありがとうございます! B ご意見ありがとうございます。とりあえず試行錯誤に励んでみます。 …でもその前にリファレンスページの関数を全部実装する予定です。まだマスク系手を着けてないんで/// SSE Intelのマニュアル片手にレイテンシとスループットを考慮して命令を置き換えるとC並みに遅くなるんですが、なんでですかね…謎です。 えっと、Src1側の読み込みを工夫してあげるとSrc2は最初に読み込むだけで済みます。しかもメモリへの書き込みもスムーズで楽です。 で、SrcとDestに同じポインタが指定された場合を考えたのですが、Src2のデータは一番最初にレジスタに退避されますし、Src1のデータもアクセスに問題がなさそうです。 結果として128バイト分のmemcpyをしなくて済むというのも高速化につながっていると考えられます。 あとは「メモリキャッシュが効きまくって高速に見えてるだけ」じゃないことを祈りたいですね…もうちょっと検証したいです。 EeePC901でも試してみますね。

Page: 1 |