私はXNAで「落下砂」ゲームに取り組んでいます。もちろん、それはたくさんのピクセルを描かなければならないことを意味します!アルゴリズムをテストするためだけに、ピクセルごとに透明な青色を使用して、問題なく開始されました。フレームレート(安定した60 FPS)を失う前に、画面に約100,000ピクセルを描画することができました。これは、必要以上でした。しかし、最終的に別の色のピクセル(青と赤)を追加し、他の変更を加えなかった場合、FPSは指数関数的に低下し、FPSが約10に低下する前に、約10,000ピクセルしか画面に描画できませんでした。スプライトバッチが自動的にピクセルを並べ替えてブレンドするため、私は完全に間違っている可能性があります。何か別のことを考えている場合はお知らせください。2つの色を混ぜ合わせるという行為は私がスピードを失っているところだと思います。では、どうすればスプライトバッチのメソッドを回避できますか?それとも私は完全にベースから外れていますか?
SpriteSortModeとBlendModeをいじってみましたが、スプライトのバッチ呼び出しごとに色付きのピクセルのように描画するだけでしたが、今のところ運がありません。
また、画面に描画しているピクセルは、そもそも同じ座標になることはないので、ブレンドなどは必要ありません。
//Game Draw Method
protected override void Draw(GameTime gameTime)
{
stopWatch.Start();
GraphicsDevice.Clear(Color.Black);
spriteBatch.Begin();
//backgroundSprite.Draw(spriteBatch);
terrainSprite.Draw(spriteBatch);
resourceMap.Draw(spriteBatch, spriteFont);
frameCounter++;
string fps = string.Format("fps: {0}", frameRate);
int totalint = 0;
for (int i = 0; i < resourceMap.activeCoordinates.Count; i++)
{
totalint += resourceMap.activeCoordinates[i].Count;
}
string total = string.Format("resource count: {0}", totalint);
spriteBatch.DrawString(spriteFont, fps, new Vector2(33, 33), Color.White);
spriteBatch.DrawString(spriteFont, total, new Vector2(33, 45), Color.White);
spriteBatch.DrawString(spriteFont, totalTime, new Vector2(33, 17), Color.White);
spriteBatch.DrawString(spriteFont, totalTime, new Vector2(33, 17), Color.White);
spriteBatch.End();
stopWatch.Stop();
totalTime = "Draw Time: " + stopWatch.Elapsed;
stopWatch = new Stopwatch();
base.Draw(gameTime);
}
//resourceMap.Draw(SpriteBatch spriteBatch, SpriteFont font) from Game Draw
public void Draw(SpriteBatch spriteBatch, SpriteFont font)
{
//spriteBatch.End();
//this was originally one for loop to draw all pixels, but was separated to draw each different color pixel after discovering performance issue
for (int c = 0; c < activeCoordinates.Count(); c++)
{
//spriteBatch.Begin();
for (int i = 0; i < activeCoordinates[c].Count; i++)
{
mapArray[(int)activeCoordinates[c][i].X][(int)activeCoordinates[c][i].Y].Draw(spriteBatch);
}
//spriteBatch.End();
}
//spriteBatch.Begin();
spriteBatch.DrawString(font, timeInMilli, new Vector2(33, 0), Color.White);
}
繰り返しになりますが、コードに加えられた唯一の変更は、描画されるピクセルのリストに異なる色を追加することでした。そのため、追加の色を追加するまで、ここのコードはうまく機能していました(約60fpsで100,000ピクセルが描画されました)。
助けてくれてありがとう!