rigidchips-lib / rigidchips

23 stars 7 forks source link

LINE2D/LINE3Dの負荷が高い #33

Open tanitta opened 8 years ago

tanitta commented 8 years ago
sabatotan commented 8 years ago

以下の関数を使うと、2048本のLINE2D相当の処理をさせても80FPSを維持できた。 void Line2DEx(GFloat* xPosArray, GFloat* yPosArray, int num, int col) { D3DXMATRIX mat1; D3DXMATRIX matV, mat2; G3dDevice->GetTransform(D3DTS_VIEW, &matV); D3DXMatrixInverse(&mat1, NULL, &matV); D3DXMatrixScaling(&mat1, 1, 1, 1); // D3DXMatrixMultiply(&mat2,&mat1,&GMatWorld); G3dDevice->SetTransform(D3DTS_VIEW, &mat1); G3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); G3dDevice->SetRenderState(D3DRS_AMBIENT, 0xFFFFFFFF); G3dDevice->SetStreamSource(0, pPointVB, sizeof(D3DPOINTVERTEX)); G3dDevice->SetVertexShader(D3DFVF_POINTVERTEX); G3dDevice->SetTexture(0, NULL); G3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); // カリングモード D3DPOINTVERTEX* p2V; HRESULT hr = pPointVB->Lock(0, sizeof(D3DPOINTVERTEX)_num, (BYTE__)&p2V, 0); if (hr != S_OK) return; float t; if (ViewType == 7) t = (float)tan(CCDZoom_M_PI / 360.0); else t = (float)tan(Zoom_M_PI / 360.0); float t2 = (t + 1) / t; for (int i = 0; i < num; i++) { p2V[i].x = (float)xPosArray[i]_t; p2V[i].y = (float)yPosArray[i]*t; p2V[i].z = (float)1; p2V[i].color = col | 0xff000000;
} hr = pPointVB->Unlock(); // G3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE ); hr=G3dDevice->DrawPrimitive(D3DPT_LINELIST, 0, num); G3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE); G3dDevice->SetRenderState(D3DRS_AMBIENT, 0x000F0F0F); G3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); // カリングモード G3dDevice->SetTransform(D3DTS_VIEW, &GMatView); }

taka-tuos commented 8 years ago

Rigidmain.cppの 4329行目の D3DPOOL_DEFAULT を D3DPOOL_SYSTEMMEM に置き換えたら 当環境では早くなった

siruhu commented 8 years ago

Rigidmain.cppのLine系差し替え これに加えてシナリオLua呼び出し直後とExtarnalForce表示の後ろに Line(GVector(0,0,0),GVector(0,0,0),0xff000000); Line2D(0,0,0,0,0xff000000); の追加が必要 色指定0x00FFFFFFより大きい時バッファ強制描画

struct line2dVerex{ float x, y, z; DWORD color; };

define line2dVerexMax 200 //奇数が始点 偶数が終点の線

line2dVerex line2dVerexTable[line2dVerexMax]; //頂点バッファ 埋まったら描画 int line2dVerexTable_n=0;

void Line2D(GFloat x0,GFloat y0,GFloat x1,GFloat y1,int col) { float t; if(ViewType==7) t=(float)tan(CCDZoom_M_PI/360.0); else t=(float)tan(Zoom_M_PI/360.0); float t2=(t+1)/t;

line2dVerexTable[line2dVerexTable_n]={(float)x0*t,(float)y0*t,1,col|0xff000000};
line2dVerexTable[line2dVerexTable_n+1]={(float)x1*t,(float)y1*t,1,col|0xff000000};
line2dVerexTable_n=line2dVerexTable_n+2;

if(line2dVerexTable_n>=line2dVerexMax || col&0xFF000000){ //colが0x00FFFFFF以上の時バッファ分強制描画
    int Verex_num=line2dVerexTable_n;
    line2dVerexTable_n=0;
    D3DXMATRIX mat1;
    //D3DXMATRIX matV,mat2;
    //G3dDevice->GetTransform(D3DTS_VIEW,&matV);
    //D3DXMatrixInverse(&mat1,NULL,&matV);
    D3DXMatrixScaling( &mat1, 1,1,1 );
    //D3DXMatrixMultiply(&mat2,&mat1,&GMatWorld);
    G3dDevice->SetTransform(D3DTS_VIEW,&mat1);

    G3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
    G3dDevice->SetRenderState( D3DRS_AMBIENT,0xFFFFFFFF );
    G3dDevice->SetTexture(0,NULL);
    G3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);    // カリングモード

    //G3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
    G3dDevice->SetVertexShader(D3DFVF_XYZ | D3DFVF_DIFFUSE);
    G3dDevice->DrawPrimitiveUP(D3DPT_LINELIST,Verex_num/2,line2dVerexTable,sizeof (line2dVerex));

    G3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
    G3dDevice->SetRenderState( D3DRS_AMBIENT,0x000F0F0F );
    G3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); // カリングモード
    G3dDevice->SetTransform(D3DTS_VIEW,&GMatView);
}

}

struct line3dVerex{ float x, y, z; DWORD color; };

define line3dVerexMax 200 //奇数が始点 偶数が終点の線

line3dVerex line3dVerexTable[line3dVerexMax]; //頂点バッファ 埋まったら描画 int line3dVerexTable_n=0;

void Line(GVector &p1,GVector &p2,unsigned int col) {

line3dVerexTable[line3dVerexTable_n]={(float)p1.x,(float)p1.y,(float)p1.z,col|0xff000000};
line3dVerexTable[line3dVerexTable_n+1]={(float)p2.x,(float)p2.y,(float)p2.z,col|0xff000000};
line3dVerexTable_n=line3dVerexTable_n+2;

if(line3dVerexTable_n>=line3dVerexMax || col&0xFF000000){ //colが0x00FFFFFF以上の時バッファ分強制描画
    int Verex_num=line3dVerexTable_n;
    line3dVerexTable_n=0;

    G3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
    G3dDevice->SetRenderState( D3DRS_AMBIENT,0xFFFFFFFF );
    G3dDevice->SetTexture(0,NULL);
    G3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);    // カリングモード

    G3dDevice->SetVertexShader(D3DFVF_XYZ | D3DFVF_DIFFUSE);
    G3dDevice->DrawPrimitiveUP(D3DPT_LINELIST,Verex_num/2,line3dVerexTable,sizeof (line3dVerex));

    G3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
    G3dDevice->SetRenderState( D3DRS_AMBIENT,0x000F0F0F );
    G3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); // カリングモード
}

}

siruhu commented 8 years ago

Atom3735F内蔵グラのタブでLINE8千本描画時(影CCDオフ) B26:0.6FPS B26@3DAnalyzer:4FPS C3(上の関数使ったやつ):25FPS あとはC側関数呼び出しのオーバーヘッドが問題っぽいんでこれ以上互換性維持しての高速化は無理っぽいぽい