我知道我对全局变量的本能反应是“糟糕!”但在我在大学学习的两门游戏开发课程中,全局变量被广泛使用,现在在我使用的 DirectX 9 游戏编程教程 (www.directxtutorial.com) 中,我被告知全局变量在游戏编程中是可以的。 ..?该网站还建议在进行游戏编程时尽可能仅使用结构,以帮助保持简单。
我对这个问题真的很困惑,我一直在尝试做的所有研究都非常令人困惑。我意识到使用全局变量时存在问题(线程问题,它们使代码更难维护,它们的状态很难跟踪等),而且不使用全局变量也会带来成本,我必须通过一个looooot经常出现的信息可能会令人困惑,而且我想象会浪费时间,尽管我猜指针会加快进程(这是我第一次用 C++ 编写游戏。)无论如何,我意识到可能没有“正确”或因为两种方式都在这里“错误”答案work,但我希望我的代码尽可能正确,因此任何输入都会很好,非常感谢!
游戏和全局变量的问题在于游戏(现在)是在引擎级别进行线程化的。使用引擎的游戏开发人员使用引擎的抽象,而不是直接编程并发(IIRC)。在许多高级语言(例如 C++)中,线程共享状态很复杂。当许多并发进程共享公共资源时,它们必须确保不会互相侵犯。
为了解决这个问题,你可以使用并发控制比如互斥锁和各种锁。这实际上使得代码的异步关键部分以同步方式访问共享状态以进行写入。并发控制的话题太多,无法在这里详细解释。
可以说,如果线程使用全局变量运行,那么调试会变得非常困难,因为并发错误是一场噩梦(想一想,“哪个线程写了这个?谁持有那个锁?”).
There 是例外游戏编程 API,如 OpenGL 和 DX。如果您的共享数据/全局变量是指向 DX 或 OpenGL 图形上下文的指针,那么通常会映射到 GPU 操作,而 GPU 操作不会遭受同样的麻烦。
请小心。保留代表“玩家”或“僵尸”或其他内容的对象,并在线程之间共享它们可能很棘手。相反,生成“玩家”线程和“僵尸组”线程,并基于消息传递在它们之间具有强大的并发抽象,而不是跨线程/关键部分边界访问这些对象的状态。
说了这么多,我确实同意“对全球化说不”下面提出了一点。
有关线程和共享状态的复杂性的更多信息,请参阅:
1 POSIX Threads API - 我知道它是 POSIX,但提供了一个转换为其他 API 的好主意 https://computing.llnl.gov/tutorials/pthreads/
2 维基百科有关并发控制机制的精彩文章 http://en.wikipedia.org/wiki/Category:Concurrency_control
3 哲学家就餐问题(以及许多其他问题) http://en.wikipedia.org/wiki/Dining_philosophers_problem
4 有关线程的 ThreadMentor 教程和文章 http://www.cs.mtu.edu/~shene/NSF-3/e-Book/
5 另一篇英特尔文章,但更多的是营销内容。 http://software.intel.com/en-us/articles/multithreaded-game-programming-and-hyper-threading-technology/
6 关于构建多线程游戏引擎的 ACM 文章 http://portal.acm.org/citation.cfm?id=1231894.1231896
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)