Я собираюсь рискнуть и сказать, что от меня зависит масштаб / масштаб вашего проекта. Потому что если вы пытаетесь запрограммировать эпическую игру с помощью большого количества кода, то глобальные и ретроспективные данные могут легко и безболезненно стоить вам гораздо больше времени, чем экономить.
Но если вы пытаетесь закодировать, скажем, что-нибудь столь же простое, как Super Mario или Metroid или Contra, или даже более простое, например Pac-Man, то эти игры изначально были закодированы в сборке 6502 и использовали глобальные переменные почти для всего. Почти все игровые данные и состояние были сохранены в сегментах данных, и это не помешало разработчикам выпустить очень компетентный и популярный продукт, несмотря на работу с абсолютно плохими инструментами и техническими стандартами, которые, вероятно, ужаснули бы людей сегодня.
Так что, если вы просто пишете эту маленькую и простую игру, которая имеет очень ограниченную область применения и не предназначена для роста и расширения далеко за пределы своего первоначального дизайна, не предназначена для эксплуатации в течение многих лет, с несколько тысяч строк простого кода на C ++, тогда я не вижу особого смысла в том, чтобы использовать здесь глобальные или синглтоны. Кто-то был одержим попыткой создать Super Mario с использованием самых надежных технических приемов с использованием SOLID и DI-фреймворка. В конечном итоге его доставка может занять гораздо больше времени, чем даже разработчикам, написавшим его в 6502 ассемблере.
И я старею, и в этом что-то есть, когда я смотрю на эти старые простые игры и на то, как они были закодированы, и кажется, что разработчики что-то делали правильно, несмотря на жестко закодированные магические числа и глобалы повсюду, пока я провожу свою карьеру, пытаясь найти лучший способ спроектировать вещи. Тем не менее, это, вероятно, очень непопулярное мнение, и не то, которое мне бы понравилось, десятилетие или два назад, но в этом есть кое-что. Я не смотрю на 6502 asm of Metroid и не думаю, что "эти разработчики недоработали свой продукт, и их жизнь была бы намного проще, если бы они сделали то или это". правый.
Но, опять же, это для мелкомасштабных вещей, может быть, в инди-категории игр по современным стандартам, и для меньших из инди-игр среди них, и далеко от того, чтобы делать что-то новаторское с точки зрения количества данных может обрабатывать или использовать передовые аппаратные технологии. Если вы сомневаетесь, я бы определенно предложил ошибиться на стороне избегания глобалов. Это также немного сложнее в C ++, в отличие от C, поскольку у вас могут быть объекты с конструкторами и деструкторами, а порядок инициализации и уничтожения не является четко определенным и легко предсказуемым для глобальных объектов. Там я бы сказал, что нужно больше склоняться к тому, чтобы избегать глобалов, поскольку они могут сбить вас с толку совершенно новыми способами, когда вы явно не инициализируете и не уничтожаете их сами в предсказуемом порядке. И, естественно, если вы захотите многопоточность за пределами критического цикла, то ваша способность рассуждать о безопасности потоков любого конкретного кода будет сильно снижена, если вы не сможете минимизировать объем / видимость своего игрового состояния до минимума места.