トップページ > 過去ログ > 記事閲覧
DXライブラリの描写の速さについて
名前:スー 日時: 2010/08/08 00:53

こんばんは。 現在DirectX9.0で自作ゲームの為のライブラリを作っています。 それで自分はDrawPrimitiveUPを使い描写をしています。その時にグラフィックボードを積んでいないPCでデバックをするとテクスチャ500枚程度でFPSが30に落ちます。それに比べてDXライブラリのDrawRotaGraphで画像を2000枚表示しても処理落ちしません。 それで質問なのですが、DXライブラリではどのようにして描写しているのか教えて頂けたらと思います。 どうぞよろしくお願いします。 ちなみに自分のソースはこんな感じです。遅い原因がわかれば教えてください。 void DXTexture::draw(float x,float y,float ex,float ey, float r){ if(FAILED(error))return; ZeroMemory(p,sizeof(PORIGON)); if(div != -1){ if(pos == -1 || pos >= div){ DX::error("描写範囲エラー");return; } int pos_x = pos % wh[0]; int pos_y = pos / wh[1]; float w = 1.0/wh[0] * pos_x; float h = 1.0/wh[1] * pos_y; p[0].u = w; p[0].v = h; p[1].u = w+1.0/wh[0]; p[1].v = h; p[2].u = w; p[2].v = h+1.0/wh[1]; p[3].u = w+1.0/wh[0]; p[3].v = h+1.0/wh[1]; } else { p[0].u = 0.0f; p[0].v = 0.0f; p[1].u = 1.0f; p[1].v = 0.0f; p[2].u = 0.0f; p[2].v = 1.0f; p[3].u = 1.0f; p[3].v = 1.0f; } for(int i=0;i<4;i++){ p[i].z = 0.0f; p[i].rhw = 1.0f; p[i].color = D3DCOLOR_RGBA(BlendState,BlendState, BlendState, 255); if(BlendMode == ADD){ p[i].color = D3DCOLOR_XRGB(BlendState, BlendState, BlendState); } } D3DXMATRIX mtrx1, mtrx2; D3DXMatrixIdentity(&mtrx1); D3DXMatrixIdentity(&mtrx2); float X = x; float Y = y; float EX = (info.Width) * ex; float EY = (info.Height) * ey; float R = r; if(div != -1){ D3DXMatrixScaling(&mtrx1, EX/wh[0], EY/wh[1], 1.0f); } else { D3DXMatrixScaling(&mtrx1, EX, EY, 1.0f); } D3DXMatrixRotationZ(&mtrx2, R); D3DXMatrixMultiply(&mtrx1, &mtrx1, &mtrx2); D3DXMatrixTranslation(&mtrx2, X, Y, 0.0f); D3DXMatrixMultiply(&mtrx1, &mtrx1, &mtrx2); D3DXVECTOR2 in[4]; if(centerPos == TRUE){ in[0].x = -0.5f; in[0].y = -0.5f; in[1].x = 0.5f; in[1].y = -0.5f; in[2].x = -0.5f; in[2].y = 0.5f; in[3].x = 0.5f; in[3].y = 0.5f; } else { in[0].x = 0.0f; in[0].y = 0.0f; in[1].x = 1.0f; in[1].y = 0.0f; in[2].x = 0.0f; in[2].y = 1.0f; in[3].x = 1.0f; in[3].y = 1.0f; } D3DXVECTOR4 out[4]; for (int i = 0; i < 4; i++ ) { D3DXVec2Transform( &out[i], &in[i], &mtrx1 ); p[i].x = out[i].x; p[i].y = out[i].y; } DEBUG_DRAW_COUNT++; pD3DDev->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1); pD3DDev->SetTexture(0,pTexture); pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, p, sizeof(PORIGON)); }

Page: 1 |

Re: DXライブラリの描写の速さについて ( No.1 )
名前:Will 日時:2010/08/08 11:17

DXライブラリはソース公開されてますから比べられてみましたか?
Re: DXライブラリの描写の速さについて ( No.2 )
名前:スー 日時:2010/08/08 13:34

Willさん返信ありがとうございます。 DXライブラリはソース公開されているんですね。ソースの中身は覗いてきました。 DrawRotaGraph関数の中を覗いて最終的に行き着いた先がAdd4VertexTo3DDeviceやG_D3D_DrawRotaGraphでした。 その先はよくわからなかったのですが、たぶん3D技術を使っているのかなと思います。 2D専用のライブラリと思って作成していたのですが、3Dを使うとなると難しそうです;; DXライブラリの様に高速描写するにはやはり高い技術がいるのですね。 今回は処理の遅い状態で作成を続けてみます。 ありがとうございました。
Re: DXライブラリの描写の速さについて ( No.3 )
名前:管理人 日時:2010/08/10 12:53

DrawPrimitiveUP を呼ぶ回数を減らせば高速に描画することができます 例えば同じ画像を6個連続して描画する場合、D3DPT_TRIANGLELIST を使って 12個のポリゴン( 1画像の描画に2ポリゴン必要と考えると6個の画像の描画に 必要なポリゴンの数は12個 )を一度に描画すれば、D3DPT_TRIANGLESTRIP より 頂点数は増えてしまいますが1回の描画ごとに DrawPrimitiveUP を呼ぶ必要がなくなるので 結果として高速に描画することができます DXライブラリでは一度に沢山のポリゴンを描画するための 400 * 6 = 2400 頂点分の 頂点配列を用意しておいて、一回 DrawGraph が呼ばれるたびに配列番号の 若いところから6頂点( 2ポリゴン分 )づつ情報をセットして、セットした 回数が 400 を超えるか、描画されるテクスチャが変更されるか、SetRenderState や SetTextureStageState や Present や SetVieweport を呼ばなければならない 状況が発生したら DrawPrimitiveUP でその時点までにセットされているポリゴンを 一気に描画します こうすることで毎回 DrawPrimitiveUP を呼ぶより高速に描画処理を行うことができます 因みに、仕組みが上記のような感じなので、違う画像を交互に描画した場合は その都度 DrawPrimitiveUP が呼ばれるので、高速に描画することはできません あと、2Dの描画に3D技術は使用していません 載せていただいたソースには回転やスケーリングに行列を使用されているので 寧ろスーさんの方が3D技術を使用されているような (^ ^;

Page: 1 |