c++ - 在游戏编程中,全局变量不好吗?

标签 c++ global-variables

我知道我对全局变量的直觉 react 是“糟糕!”但是在我在大学学习的两门游戏开发类(class)中,globals 被广泛使用,现在在我正在使用的 DirectX 9 游戏编程教程 (www.directxtutorial.com) 中,我被告知 globals 在游戏编程中是可以的。 ..?该网站还建议在进行游戏编程时仅使用结构来帮助保持简单。

我对这个问题真的很困惑,而且我一直在尝试做的所有研究都非常令人困惑。我意识到使用全局变量时存在问题(线程问题,它们使代码更难维护,它们的状态难以跟踪等)但也有与不使用全局变量相关的成本,我必须通过 loooot周围的信息经常令人困惑,我想象时间成本,虽然我猜指针会加快这个过程(这是我第一次用 C++ 编写游戏。)无论如何,我意识到可能没有“正确”或“错误”的答案在这里,因为两种方式工作,但我希望我的代码尽可能正确,所以任何输入都会很好,非常感谢!

最佳答案

游戏和全局变量的问题在于(现在)游戏是在引擎级别进行线程化的。使用引擎的游戏开发人员使用引擎的抽象而不是直接编程并发 (IIRC)。在许多高级语言(如 C++)中,线程共享状态是复杂的。当许多并发进程共享一个公共(public)资源时,它们必须确保它们不会互相干扰。

要解决这个问题,您可以使用并发控制,例如互斥锁和各种锁。这实际上使代码的异步关键部分以同步方式访问共享状态以进行写入。并发控制这个话题太多了,这里就不一一解释了。

可以这么说,如果线程使用全局变量运行,它会使调试变得非常困难,因为并发错误是一场噩梦(想想,“哪个线程写的?谁持有那个锁?”)。

在 OpenGL 和 DX 等游戏编程 API 中有异常(exception)。如果您的共享数据/全局变量是指向 DX 或 OpenGL 图形上下文的指针,那么通常这会映射到 GPU 操作,这些操作不会遭受同样的麻烦。

小心点。保留代表“玩家”或“僵尸”或其他对象的对象,并在线程之间共享它们可能会很棘手。生成“玩家”线程和“僵尸组”线程,并根据消息传递在它们之间建立强大的并发抽象,而不是跨线程/临界区边界访问这些对象的状态。

说了这么多,我同意下面提出的“对全局说不”的观点。

有关线程和共享状态的复杂性的更多信息,请参阅:

1 POSIX Threads API - I know it is POSIX, but provides a good idea that translates to other API
2 Wikipedia's excellent range of articles on concurrency control mechanisms
3 The Dining Philosopher's problem (and many others)
4 ThreadMentor tutorials and articles on threading
5 Another Intel article, but more of a marketing thing.
6 An ACM article on building multi-threaded game engines

关于c++ - 在游戏编程中,全局变量不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2832263/

相关文章:

c - C中全局变量的操作

c - C 程序中 .bss 段的不明确行为

api - 在 redux Reactjs 应用程序中定义 API url

python - 我应该用 Python 命名我的全局模块?

c++ - 如何使用 std::istringstream 获取正确的缓冲区大小以进行数据解析

c++ - 第一个参数没有从 'A' 到 'A &&' 的已知转换

c++ - C++ 中的多线程 SDL 错误

global-variables - Octave:清除全局变量后无法更改它的值

c++ - 模块化操作 (%) 提供错误输出

C++ 私有(private)结构