cod*_*een 6 c# xna frame-rate mesh draw
好吧,我有80,000个"盒子"网格物体和简单的纹理我设置了一个视图距离,只绘制了你可以看到的那些为下面的DrawModel函数留下600到1000的问题.问题是我每秒只得到10帧和我的视距很糟糕另外,我已经对我的所有代码进行了内存测试,"mesh.draw()"每秒关闭30帧.没有别的东西接近那么多.有帮助吗?
private void DrawModel(MeshHolder tmpMH)
{
Model tmpDrawModel = (Model)_Meshs[tmpMH.MeshFileName];
Matrix[] transforms = new Matrix[tmpDrawModel.Bones.Count];
tmpDrawModel.CopyAbsoluteBoneTransformsTo(transforms);
foreach (ModelMesh mesh in tmpDrawModel.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.LightingEnabled = false;
effect.TextureEnabled = true;
effect.Texture = (Texture2D)_Textures[tmpMH.GetTexture(Count)];
effect.View = _MainCam.View;
effect.Projection = _projection;
effect.World =
transforms[mesh.ParentBone.Index] *
Matrix.CreateFromYawPitchRoll(tmpMH.Rotation.Y, tmpMH.Rotation.X, tmpMH.Rotation.Z) *
Matrix.CreateScale(tmpMH.Scale) *
Matrix.CreateTranslation(tmpMH.Position);
}
mesh.Draw();
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所说,正在扼杀你的表现的是什么ModelMesh.Draw.绘制模型时,它的工作方式如下:
for each frame
for each Model
for each ModelMesh // you call Draw(), which does:
for each ModelMeshPart
for each Effect
for each EffectPass
Draw some triangles // sends a batch of instructions to the GPU
Run Code Online (Sandbox Code Playgroud)
所以问题是:每个帧发送批次到GPU的次数是多少?因为在饱和CPU之前,每帧只能发送几千个*批次 - 达到"批量限制".(每个批处理使用图形驱动程序中的CPU时间 - 它也使用一些带宽和GPU时间,但CPU时间占主导地位.)
解决方案是修改场景(例如:组合一些网格部件,进行一些剔除,添加实例支持)以减少发送到GPU的批次数.
另外,尽量避免在这样的事情Draw和Update循环:
Matrix[] transforms = new Matrix[tmpDrawModel.Bones.Count];
Run Code Online (Sandbox Code Playgroud)
你应该尽力避免每帧发生的内存分配 - 因为它们最终会导致昂贵的垃圾收集和可能的帧速率打嗝(特别是在Xbox上).尝试将缓冲区存储在某处并重用它.
effect.World =
transforms[mesh.ParentBone.Index] *
Matrix.CreateFromYawPitchRoll(
tmpMH.Rotation.Y, tmpMH.Rotation.X, tmpMH.Rotation.Z) *
Matrix.CreateScale(tmpMH.Scale) *
Matrix.CreateTranslation(tmpMH.Position);
Run Code Online (Sandbox Code Playgroud)
我不是一个分析器,但我觉得这条线很痛苦。矩阵创建和乘法非常昂贵!我知道这段代码是必要的,所以除非你可以预先计算这些矩阵,否则我会尝试:
Matrix pitch, scale, translation, temp1, temp2;
Matrix.CreateFromYawPitchRoll(
tmpMH.Rotation.Y, tmpMH.Rotation.X, tmpMH.Rotation.Z, out pitch);
Matrix.CreateScale(ref tmpMH.Scale, out scale);
Matrix.CreateTranslation(ref tmpMH.Position, out translation);
Matrix.Multiply(ref transforms[mesh.ParentBone.Index], ref pitch, out temp1);
Matrix.Multiply(ref temp1, ref scale, out temp2);
Matrix.Multiply(ref temp2, ref translation, out effect.World);
Run Code Online (Sandbox Code Playgroud)
这可能会更快,因为不需要复制堆栈上的每个矩阵来进行参数传递(需要复制的内容少了 20 倍以上!)
| 归档时间: |
|
| 查看次数: |
1515 次 |
| 最近记录: |