XNA 4.0 - Использование лагов spriteBatch и basicEffect - PullRequest
0 голосов
/ 16 декабря 2010

В настоящее время я работаю над игрой, в которой нам необходимо объединить использование DrawUserIndexedPrimitives и обычного spriteBatch.Draw . Не объединены, поскольку мы используем их одновременно, но сначала мы должны нарисовать некоторые 2d спрайты, используя spriteBatch, где после того, как мы отключим 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 разных компьютерах, от очень старого ноутбука до совершенно нового игрового ПК. Игра не может быть воспроизведена с задержкой.

1 Ответ

3 голосов
/ 16 декабря 2010

Я думаю, что вы должны создать эффект Basice в другом месте, чем ваша процедура рисования. Если я угадаю правильно, вы будете использовать один и тот же базовый эффект все время, поэтому включите его в инициализацию, поскольку «новый» для каждого кадра (правка: в foreach для каждого объекта) может стоить производительности.

...