游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6262|回复: 10

怎样在D3D下高效地绘制矩形?

[复制链接]

5

主题

41

帖子

41

积分

注册会员

Rank: 2

积分
41
发表于 2005-11-22 15:17:00 | 显示全部楼层 |阅读模式
我使用了D3DPT_LINESTRIP绘制四个顶点的巨型,但是假如一个屏幕上需要绘制成百上千个矩形时候CPU占用明显上升,查找到主要是-----每次绘制矩形的时候lock顶点,然后更新顶点位置,以及顶点的颜色,然后unlock-------这一过程,特别是lock花费了比较长的时间,估计是从更新一次显存中顶点数据会有比较大的开销。不知道各位大虾有什么比较好的方法吗?

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2005-11-22 17:13:00 | 显示全部楼层

Re:怎样在D3D下高效地绘制矩形?

多个矩形使用一个顶点Pool;然后异步的Lock。

5

主题

41

帖子

41

积分

注册会员

Rank: 2

积分
41
 楼主| 发表于 2005-11-22 19:11:00 | 显示全部楼层

Re:怎样在D3D下高效地绘制矩形?

是用D3DUSAGE_DYNAMIC创建的?不过Lock都需要花比较多的时间呢!

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2005-11-22 21:22:00 | 显示全部楼层

Re:怎样在D3D下高效地绘制矩形?

多个矩形使用一个顶点Pool
--------------Lock一次,更改N个矩形。。。

14

主题

283

帖子

293

积分

中级会员

Rank: 3Rank: 3

积分
293
QQ
发表于 2005-11-22 21:54:00 | 显示全部楼层

Re:怎样在D3D下高效地绘制矩形?

用shader可以比较完美的解决~~

182

主题

445

帖子

459

积分

中级会员

Rank: 3Rank: 3

积分
459
QQ
发表于 2005-11-23 19:05:00 | 显示全部楼层

Re:怎样在D3D下高效地绘制矩形?

或者用 D3DXCreateLine

5

主题

41

帖子

41

积分

注册会员

Rank: 2

积分
41
 楼主| 发表于 2005-11-23 21:10:00 | 显示全部楼层

Re:怎样在D3D下高效地绘制矩形?

to lingjingqiu:
大部分时候我不知道自己在一帧中会绘制多少个矩形啊,并且也不知道绘制的位置以及颜色等等。

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2005-11-25 03:39:00 | 显示全部楼层

Re:怎样在D3D下高效地绘制矩形?

ID3DXLine接口

182

主题

445

帖子

459

积分

中级会员

Rank: 3Rank: 3

积分
459
QQ
发表于 2005-11-25 11:56:00 | 显示全部楼层

Re:怎样在D3D下高效地绘制矩形?

//--------------------------------------------------------------------------------------
HRESULT CDXUTDialog:rawRect( RECT* pRect, D3DCOLOR color )
{
    RECT rcScreen = *pRect;
    OffsetRect( &rcScreen, m_x, m_y );

    // If caption is enabled, offset the Y position by its height.
    if( m_bCaption )
        OffsetRect( &rcScreen, 0, m_nCaptionHeight );

    DXUT_SCREEN_VERTEX vertices[4] =
    {
        (float) rcScreen.left -0.5f,  (float) rcScreen.top -0.5f,    0.5f, 1.0f, color, 0, 0,
        (float) rcScreen.right -0.5f, (float) rcScreen.top -0.5f,    0.5f, 1.0f, color, 0, 0,
        (float) rcScreen.right -0.5f, (float) rcScreen.bottom -0.5f, 0.5f, 1.0f, color, 0, 0,
        (float) rcScreen.left -0.5f,  (float) rcScreen.bottom -0.5f, 0.5f, 1.0f, color, 0, 0,
    };

    IDirect3DDevice9* pd3dDevice = m_pManager->GetD3DDevice();

    // Since we're doing our own drawing here we need to flush the sprites
    m_pManager->m_pSprite->Flush();
    IDirect3DVertexDeclaration9 *pDecl = NULL;
    pd3dDevice->GetVertexDeclaration( &pDecl );  // Preserve the sprite's current vertex decl
    pd3dDevice->SetFVF( DXUT_SCREEN_VERTEX::FVF );

    pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 );
    pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2 );

    pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, vertices, sizeof(DXUT_SCREEN_VERTEX) );

    pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
    pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE );

    // Restore the vertex decl
    pd3dDevice->SetVertexDeclaration( pDecl );
    pDecl->Release();

    return S_OK;
}

5

主题

41

帖子

41

积分

注册会员

Rank: 2

积分
41
 楼主| 发表于 2005-11-25 12:13:00 | 显示全部楼层

Re:怎样在D3D下高效地绘制矩形?

谢谢honghaier,我会对DrawPrimitiveUP做测试,看看是否是高效!:)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-20 06:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表