我目前正在开发一款游戏,我们需要结合使用 DrawUserIndexedPrimitives 和普通的 spriteBatch.Draw 。因为我们同时使用它们没有组合,但我们首先必须使用spriteBatch绘制一些2d精灵,然后我们禁用spriteBatch以启用basicEffect并绘制基元,最后再次启用spriteBatch。下面的代码显示了问题发生的代码部分。
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, null, null, null, null, cam.get_transformation(GraphicsDevice));
levelController.Draw(spriteBatch);
if (gameReady)
{
foreach (GameObject.GameObject go in gameObjects)
{
go.Draw(spriteBatch);
}
spriteBatch.End();
foreach (GameObject.GameObject go in gameObjects)
{
if (go is GameObject.Enemy.Enemy)
{
GameObject.Enemy.Enemy enemy = (GameObject.Enemy.Enemy)go;
basicEffect = new BasicEffect(graphics.GraphicsDevice);
basicEffect.VertexColorEnabled = true;
basicEffect.CurrentTechnique.Passes[0].Apply();
GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(PrimitiveType.TriangleList, enemy.GetCollisionTriangle.Triangle, 0, 3, enemy.GetCollisionTriangle.Indices, 0, 1);
}
}
}
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, null, null, null, null, cam.get_transformation(GraphicsDevice));
如果下面的代码被引用,滞后就会停止。
basicEffect = new BasicEffect(graphics.GraphicsDevice);
basicEffect.VertexColorEnabled = true;
basicEffect.CurrentTechnique.Passes[0].Apply();
GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(PrimitiveType.TriangleList, enemy.GetCollisionTriangle.Triangle, 0, 3, enemy.GetCollisionTriangle.Indices, 0, 1)
真的可能是我们不能在没有游戏滞后的情况下使用spriteBatch和basicEffect吗?它已经在3台不同的计算机上进行了测试,从一台非常旧的笔记本电脑到一台全新的游戏机。 游戏因发生滞后而无法播放。
答案 0 :(得分:3)
我认为你应该在绘图程序的其他地方创建basiceffect。如果我猜对了,你会一直使用相同的basiceffect,所以把它放在inicializing中,因为每个帧的“new”(编辑:在每个对象的foreach中)都会降低成本。