游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1218|回复: 0

请教~越运行越慢,无解中~~~

[复制链接]

1

主题

10

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2010-4-18 12:59:00 | 显示全部楼层 |阅读模式
我在做一个地形生成的程序,用一个结构体生成一些地形数据,然后中途改变其数据,使生成的地形也发生改变

我用map创建了一个数据 map<int ,   psFaceGrain>   mFaceGrain;  psFaceGrain为自己定义的结构
然后为它赋值,然后把它生成风格模型,最后再绘制这个模型。代码在下面
问题是这样的,当一切准备好后,已经在运行渲染都没有问题。这个时候,我把psFaceGrain的值改变
mFaceGrain[ikeys].TexIndiecs = 1;(原始值为 0)
getQuantree();
再重新生成绘制模型。这个时候,运行的速度会变慢,
如果我把前面的 mFaceGrain[ikeys].TexIndiecs = 1; 注释掉,运行。它的速度是不会变慢的,只是加上它之后。
每运行一次改变一个键的值,就更慢一些。

我创建了一个这样的数据

  1.         struct psFaceGrain
  2.         {
  3.                 int TexIndiecs;//纹理序号
  4.                 TERRAINVERTEX vVertexs[9];//顶点结构体集合
  5.         };
  6.         map<int ,   psFaceGrain>   mFaceGrain;
复制代码

我会在开始的时候 把mFaceGrain的值都赋上,然后调用下面的代码进行生成网格模型

  1. //获取树信息,创建顶点 以及索引 缓冲区
  2. HRESULT Terrain::getQuantree()
  3. {
  4.         HRESULT hr = 0;
  5.         if (tmesh != NULL)
  6.         {
  7.                 tmesh->Release();
  8.         }
  9.         hr = D3DXCreateMeshFVF(
  10.                 iIndexs/3,
  11.                 iVertex,
  12.                 D3DXMESH_MANAGED,
  13.                 D3DFVF_TERRAINVERTEX,
  14.                 Device,
  15.                 &tmesh);

  16.         if(FAILED(hr))
  17.         {
  18.                 ::MessageBox(0, "D3DXCreateMeshFVF() - FAILED", 0, 0);
  19.                 return S_FALSE;
  20.         }


  21.         int iV = 0;
  22.         int iI = 0;

  23.         TERRAINVERTEX* vertex;
  24.         WORD* idecis;//65535
  25.         DWORD* attributeBuffer = 0;
  26.         for (int iface = 0;iface < (Twidth/2)*(Theight/2);iface++)
  27.         {
  28.                 int iIcon = iface*9;
  29.                 psFaceGrain pface = mFaceGrain[iface];
  30.                 int iTexFace = pface.TexIndiecs;

  31.                 tmesh->LockVertexBuffer(iTexFace,(void**)&vertex);
  32.                 tmesh->LockIndexBuffer(iTexFace,(void**)&idecis);
  33.                 tmesh->LockAttributeBuffer(iTexFace, &attributeBuffer);

  34.                 vertex[iV+0] = pface.vVertexs[0];
  35.                 vertex[iV+1] = pface.vVertexs[1];
  36.                 vertex[iV+2] = pface.vVertexs[2];
  37.                 vertex[iV+8] = pface.vVertexs[3];
  38.                 vertex[iV+3] = pface.vVertexs[4];
  39.                 vertex[iV+4] = pface.vVertexs[5];
  40.                 vertex[iV+7] = pface.vVertexs[6];
  41.                 vertex[iV+6] = pface.vVertexs[7];
  42.                 vertex[iV+5] = pface.vVertexs[8];

  43.                 iV+= 9;

  44.                 idecis[iI++] = 0+iIcon; idecis[iI++] = 1+iIcon; idecis[iI++] = 2+iIcon;
  45.                 idecis[iI++] = 0+iIcon; idecis[iI++] = 2+iIcon; idecis[iI++] = 3+iIcon;
  46.                 idecis[iI++] = 0+iIcon; idecis[iI++] = 3+iIcon; idecis[iI++] = 4+iIcon;
  47.                 idecis[iI++] = 0+iIcon; idecis[iI++] = 4+iIcon; idecis[iI++] = 5+iIcon;
  48.                 idecis[iI++] = 0+iIcon; idecis[iI++] = 5+iIcon; idecis[iI++] = 6+iIcon;
  49.                 idecis[iI++] = 0+iIcon; idecis[iI++] = 6+iIcon; idecis[iI++] = 7+iIcon;
  50.                 idecis[iI++] = 0+iIcon; idecis[iI++] = 7+iIcon; idecis[iI++] = 8+iIcon;
  51.                 idecis[iI++] = 0+iIcon; idecis[iI++] = 8+iIcon; idecis[iI++] = 1+iIcon;

  52.                 for (int i =0;i<8;i++)
  53.                 {
  54.                         attributeBuffer[i+(iI/3-8)] = (DWORD)iTexFace;
  55.                 }

  56.                 tmesh->UnlockVertexBuffer();
  57.                 tmesh->UnlockIndexBuffer();
  58.                 tmesh->UnlockAttributeBuffer();
  59.         }

  60.         return S_OK;
  61. }
复制代码

最后进行渲染

  1. void Terrain::DrawTerrain()
  2. {
  3.         //为效果设置组合变换矩阵
  4.         g_pEffect->SetMatrix( "matWorldViewProj", &matWorld );
  5.         //使用效果渲染场景
  6.         D3DXHANDLE hTechnique = g_pEffect->GetTechniqueByName( "TShader" );
  7.         g_pEffect->SetTechnique( hTechnique );

  8.         UINT nPasses;
  9.         g_pEffect->Begin( &nPasses, 0 );

  10.         for (int i = 0;i<2;i++)
  11.         {
  12.            for( UINT iPass = 0; iPass < nPasses; iPass ++ )
  13.            {
  14.               g_pEffect->BeginPass( iPass );
  15.               g_pEffect->SetTexture("TextureMapping", g_pTex[i]);
  16.               getMesh()->DrawSubset(i);
  17.               g_pEffect->EndPass();
  18.            }
  19.         }
  20.         g_pEffect->End();
  21. }
复制代码

[em6]请各位大侠帮忙看看~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-17 09:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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