В программировании игры плохие глобальные переменные? - PullRequest
24 голосов
/ 14 мая 2010

Я знаю, что моя внутренняя реакция на глобальные переменные "плохая!" но на двух курсах по разработке игр, которые я проходил в моем колледже, глобальные использовались широко, и теперь я использую учебник по программированию игр DirectX 9 (www.directxtutorial.com). ..? Сайт также рекомендует использовать только структуры, если вы можете при программировании игр, чтобы упростить задачу.

Я действительно запутался в этом вопросе, и все исследования, которые я пытался сделать, очень запутаны. Я понимаю, что существуют проблемы при использовании глобальных переменных (проблемы с многопоточностью, они усложняют обслуживание кода, их состояние сложно отслеживать и т. Д.), Но есть также и издержки, связанные с неиспользованием глобальных переменных, мне придется пройти через loooot очень часто информации, которая может сбивать с толку, и я думаю, что стоит времени, хотя я думаю, что указатели ускорили бы процесс (это мой первый раз, когда я пишу игру на C ++.) В любом случае, я понимаю, что, вероятно, нет «правильного» здесь «неправильный» ответ, поскольку оба способа работают , но я хочу, чтобы мой код был как можно более корректным, чтобы любой ввод был хорошим, большое спасибо!

Ответы [ 12 ]

2 голосов
/ 14 мая 2010

Большинство игр не являются многопоточными, хотя более новые игры идут по этому пути, и поэтому им пока это удается. Сказать, что глобалы в играх - это нормально, это все равно, что не пытаться починить тормоза на своей машине, потому что вы едете только на скорости 10 миль в час! Это плохая практика, с которой ты смотришь. Вам нужно только посмотреть на количество ошибок в играх, чтобы увидеть примеры этого.

0 голосов
/ 17 января 2018

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

Но если вы пытаетесь закодировать, скажем, что-нибудь столь же простое, как Super Mario или Metroid или Contra, или даже более простое, например Pac-Man, то эти игры изначально были закодированы в сборке 6502 и использовали глобальные переменные почти для всего. Почти все игровые данные и состояние были сохранены в сегментах данных, и это не помешало разработчикам выпустить очень компетентный и популярный продукт, несмотря на работу с абсолютно плохими инструментами и техническими стандартами, которые, вероятно, ужаснули бы людей сегодня.

Так что, если вы просто пишете эту маленькую и простую игру, которая имеет очень ограниченную область применения и не предназначена для роста и расширения далеко за пределы своего первоначального дизайна, не предназначена для эксплуатации в течение многих лет, с несколько тысяч строк простого кода на C ++, тогда я не вижу особого смысла в том, чтобы использовать здесь глобальные или синглтоны. Кто-то был одержим попыткой создать Super Mario с использованием самых надежных технических приемов с использованием SOLID и DI-фреймворка. В конечном итоге его доставка может занять гораздо больше времени, чем даже разработчикам, написавшим его в 6502 ассемблере.

И я старею, и в этом что-то есть, когда я смотрю на эти старые простые игры и на то, как они были закодированы, и кажется, что разработчики что-то делали правильно, несмотря на жестко закодированные магические числа и глобалы повсюду, пока я провожу свою карьеру, пытаясь найти лучший способ спроектировать вещи. Тем не менее, это, вероятно, очень непопулярное мнение, и не то, которое мне бы понравилось, десятилетие или два назад, но в этом есть кое-что. Я не смотрю на 6502 asm of Metroid и не думаю, что "эти разработчики недоработали свой продукт, и их жизнь была бы намного проще, если бы они сделали то или это". правый.

Но, опять же, это для мелкомасштабных вещей, может быть, в инди-категории игр по современным стандартам, и для меньших из инди-игр среди них, и далеко от того, чтобы делать что-то новаторское с точки зрения количества данных может обрабатывать или использовать передовые аппаратные технологии. Если вы сомневаетесь, я бы определенно предложил ошибиться на стороне избегания глобалов. Это также немного сложнее в C ++, в отличие от C, поскольку у вас могут быть объекты с конструкторами и деструкторами, а порядок инициализации и уничтожения не является четко определенным и легко предсказуемым для глобальных объектов. Там я бы сказал, что нужно больше склоняться к тому, чтобы избегать глобалов, поскольку они могут сбить вас с толку совершенно новыми способами, когда вы явно не инициализируете и не уничтожаете их сами в предсказуемом порядке. И, естественно, если вы захотите многопоточность за пределами критического цикла, то ваша способность рассуждать о безопасности потоков любого конкретного кода будет сильно снижена, если вы не сможете минимизировать объем / видимость своего игрового состояния до минимума места.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...