Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么游戏引擎更喜欢静态库而不是动态链接库_C++_C_Visual Studio 2008_Visual C++ - Fatal编程技术网

C++ 为什么游戏引擎更喜欢静态库而不是动态链接库

C++ 为什么游戏引擎更喜欢静态库而不是动态链接库,c++,c,visual-studio-2008,visual-c++,C++,C,Visual Studio 2008,Visual C++,我一直在读一些游戏书。他们总是喜欢将引擎创建为静态库而不是动态链接。我是新的C++,所以我不是很了解知识,当谈到静态库和动态链接库。我只知道静态库会增加程序的大小,在程序中,DLL链接库会根据需要加载 [编辑] 我玩过一些游戏,它们几乎都是用DLL加载声音、灯光等等,而不是单独加载。当水位上升时。因为当你在游戏菜单上时,你不一定需要它。动态链接库需要独立于位置;这可能会导致某些处理器体系结构的性能低下 静态库可以在包含在程序中时进行优化,例如,通过剥离死代码。这可以提高缓存性能。通过位置独立,他

我一直在读一些游戏书。他们总是喜欢将引擎创建为静态库而不是动态链接。我是新的C++,所以我不是很了解知识,当谈到静态库和动态链接库。我只知道静态库会增加程序的大小,在程序中,DLL链接库会根据需要加载

[编辑]


我玩过一些游戏,它们几乎都是用DLL加载声音、灯光等等,而不是单独加载。当水位上升时。因为当你在游戏菜单上时,你不一定需要它。

动态链接库需要独立于位置;这可能会导致某些处理器体系结构的性能低下


静态库可以在包含在程序中时进行优化,例如,通过剥离死代码。这可以提高缓存性能。

通过位置独立,他的意思是,由于游戏引擎和DLL完全分离,DLL是独立的,不能交织到游戏引擎代码中,而静态链接库允许编译器使用游戏引擎代码和库代码进行优化


例如,假设有一个编译器认为应该内联的小函数(直接复制以代替函数调用)。然后使用静态库,编译器将能够内联此代码,因为它知道代码是什么(您在编译时链接)。但是,如果使用动态库,编译器将无法内联该代码,因为它不知道代码是什么(因为它将在运行时链接)。

另一个问题涉及静态库和动态库之间的差异:


至于他们为什么使用静态库,额外的速度可能是值得的,您可以避免DLL地狱(在过去是一个大问题)。如果您希望将程序和库一起分发,确保收件人具有正确的依赖项,那么它也很有用,尽管没有什么能阻止您将DLL与可执行文件一起分发。

另一个经常被忽略的原因值得一提,那就是对于许多游戏来说,您不会运行很多其他东西,而且许多用于游戏的库不会用于游戏同时运行的其他东西,因此您不必担心使用共享库的一个主要优点,即只有一个副本(大部分)该库需要一次加载,而多个东西可以利用该副本。运行游戏时,您可能只有一个程序希望使用该库运行,因为您可能不会同时运行许多其他程序(尤其是其他游戏或3D程序)


您还提供了全局/链接时间优化的可能性,这对于共享库来说要困难得多

在为游戏机开发游戏时,动态链接通常不是一个选项。如果您想将引擎用于控制台和PC开发,最好避免动态链接。

好的,您说过它们需要独立定位。定义位置独立。因为我怎么看它。DLL和静态库都被认为是独立的,因为它们不属于最初的游戏。当您使用静态库时。您正在加载它的所有内容。那么,如何才能从中去除死代码呢?静态库在编译/链接时与可执行文件链接;链接器知道静态库代码的加载地址,并可以为此进行优化。链接器还知道库中引用了哪些函数,并可以删除未引用的函数。动态库在运行时链接,可能由多个进程共享,因此地址是未知的,库也不能移动。动态库具有可动态使用的入口点(duh);-),因此,没有任何代码可以从内存占用中消除。所谓“位置独立”,我的意思是,无论代码加载到内存中的什么位置,代码都必须能够运行。这意味着使用相对跳转和基于指针的数据引用(或PC相对常量数据引用)。非常智能的装载机可能会在装载时进行一些工作,以将影响降至最低。但是,静态代码可以被编译和链接,以使用数据和代码的已知地址。@Doug“非常聪明的加载程序可能…”实际上,即使是聪明的加载程序,如果系统允许同时使用同一动态库的两个进程在不同的虚拟地址看到同一动态库,它们也很难做到这一点。这是ELF二进制格式中的选择,例如,我对其他格式不太了解。@BlueRaja如果保证所有使用DLL的进程都能在同一地址看到DLL,那么预链接它就不需要反汇编。旧的a.out格式可以做到这一点,但这并不实用(DLL的全球集中管理)。我认为MacOSX可能也有类似的功能(但由于集中化仅限于计算机规模),内联并不是动态库速度较慢的原因。大多数编译器+链接器不跨文件内联函数。事实上,我用一种编译器跨文件内联的语言编程,因此缺少真正的独立编译让我非常恼火。我只是把内联作为一个例子来介绍,与动态库相比,静态库可以做一些事情,以给出一个更具体的例子。VisualStudio有一个完整的程序优化,它可以愉快地跨文件内联,也可能跨库内联。如果gcc没有类似的东西,我会感到惊讶(尽管大多数游戏都不会在gcc中编译)。它们很可能只是在需要时加载art+声音资产,而不是在以后选择加载DLL。通用电气