используя структуру против ссылочной переменной в игровом цикле - PullRequest
0 голосов
/ 19 мая 2018

Я промочил ноги от игры Mono.Главным образом потому, что я думаю, что это более интересный способ улучшить мои навыки кодирования.

Мой вопрос заключается в том, лучше ли мне использовать указанную переменную в методе обновления игрового цикла или легковесную структуру? (Будет инициализироваться только 2-мя целыми числами)

var GameObject GObject = new GameObject(); 
int Move=1;
void update  
{
    if(key.left)
   GObject.Location.x -= Move;
}

иливместо этого

 void update  
{
    if(key.left)
   GObject.Location = new Vector2(updatedX,Y);
}

Поскольку Vector2s являются структурами, я не могу изменить значение x внутри вектора объекта, пока не создам новое.Я читал пример Microsoft о том, когда структура предпочтительнее, но я не уверен, применима ли она таким же образом.

Я представляю, что в моно есть инструменты, предназначенные для меня, но я 'Я все еще хотел бы знать, меняет ли количество итераций в секунду.

Наконец, я знаю, что могу объявить Vector в классе Game, но я пытался заставить объекты Game управлять их собственными местоположениями.

1 Ответ

0 голосов
/ 19 мая 2018

резюме вышеприведенного комментария.


TL;DR: для высокопроизводительных приложений, таких как игры, вы должны стараться использовать struct s, где это возможно, особенно для кратковременных ситуаций, например, в цикле.

Это дословно обсуждалось на всех форумах XNA;Руководящие принципы и статьи, а также консенсус заключается в том, что вы должны использовать struct s, когда это возможно, чтобы избежать смертельных пауз от GC, которые могут повредить играм.Кроме того, вам, как правило, следует избегать foreach, поскольку он создает другой объект, который повлияет на сборщик мусора из-за бокса, как я полагаю.В те времена проблема была особенно острой для игр на c #, написанных для игр на XBox 360 или c # до .NET 4.

Кстати, Monogame - это форк XNA и имеет те же проблемы

В типичной настольной / веб-разработке продолжайте и используйте ссылочные типы, потому что GC намного более эффективен и не приостанавливает все приложение, пока GC находится в процессе.

  • .NET 4+ в Windowsна рабочем столе есть фон GC
  • .NET 4.5+ на Windows Server есть фон GC

Расскажите подробнее

...