До недавнего времени наша игра проверяла столкновения, получая данные о цвете из раздела фоновой текстуры сцены. Это сработало очень хорошо, но, так как дизайн изменился, нам нужно было проверить несколько текстур, и было решено отрендерить их все в один RenderTarget2D и проверить коллизии на этом.
public bool TouchingBlackPixel(GameObject p)
{
/*
Calculate rectangle under the player...
SourceX,SourceY: Position of top left corner of rectangle
SizeX,SizeY: Aproximated (cast to int from float) size of box
*/
Rectangle sourceRectangle = new Rectangle(sourceX, sourceY,
(int)sizeX, (int)sizeY);
Color[] retrievedColor = new Color[(int)(sizeX * sizeY)];
p.tileCurrentlyOn.collisionLayer.GetData(0, sourceRectangle, retrievedColor,
0, retrievedColor.Count());
/*
Check collisions
*/
}
Проблема, с которой мы столкнулись, заключается в том, что после перехода к цели рендеринга мы испытываем значительное снижение FPS.
Из того, что мы прочитали, похоже, что проблема в том, что для получения данных из RenderTarget2D вам необходимо передать данные из графического процессора в ЦП, и это происходит медленно. Это усугубляется тем, что нам необходимо запускать одну и ту же функцию дважды (по одному разу для каждого игрока) и не иметь возможности хранить одни и те же данные (они могут быть не на одной плитке).
Мы пытались переместить вызовы GetData в функцию Draw плитки и сохранить данные в массиве элементов, но это, похоже, не решило проблему (поскольку мы все еще довольно часто вызываем GetData для плитки - по сравнению с дважды за каждое обновление и за каждый розыгрыш).
Любая помощь, которую вы могли бы нам оказать, была бы великолепна, так как мощь, которую дает нам эта система столкновений, является фантастической, но накладные расходы, которые вносят цели, делают невозможным сохранение.