配置
目录
简介
随着时间的推移,EnTT 在许多方面已变得几乎完全可定制。这些变量只是定制其工作方式的众多方法之一。
在绝大多数情况下,用户对更改默认参数没有兴趣。对于所有其他情况,可以在下方找到用于在运行时调整库行为的可能配置列表。
定义
所有选项均旨在作为编译器的参数(或编译单元内的用户定义宏,如果首选的话)。
每个参数都可能导致内部库定义。不建议尝试修改这些内部定义,因为与以下选项不同,无法保证它们随时间推移保持稳定。
ENTT_USE_STL
出于测试目的,它强制使用标准库某些部分的内置替代项,否则这些替代项并非总是可用。
EnTT 会自行 检测 这些情况,用户绝不应显式定义此变量。但是,如果需要,仍然可以这样做。
ENTT_NO_EXCEPTION
定义此变量且不为其分配任何值,以关闭 EnTT 中的异常处理。
这大致相当于设置编译器标志 -fno-exceptions,但仅限于此库。
ENTT_USE_ATOMIC
通常,EnTT 不提供支持多线程的原语。许多功能可以在没有任何显式控制的情况下拆分到多个线程,而用户自己知道是否需要同步点。
然而,当从多个线程使用 EnTT 时,即使处理的是本地存储 (local storage),线程之间共享的某些内部静态数据也应该是原子的 (atomic)。定义此宏且不为其分配任何值即可完成此工作。
ENTT_ID_TYPE
entt::id_type 由此定义直接控制,并在库中被广泛使用。
默认情况下,其类型为 std::uint32_t。但是,如果需要,用户可以定义不同的默认类型。
ENTT_SPARSE_PAGE
众所周知,EnTT 的 ECS 模块基于 稀疏集 (sparse sets)。鲜为人知的是,稀疏数组 (sparse arrays) 是分页的 (paged) 以减少内存使用。
页的默认大小(即它们包含的元素数量)为 4096,但如果合适,用户可以对其进行调整。在所有情况下,所选值 必须 是 2 的幂。
ENTT_PACKED_PAGE
与稀疏数组一样,紧凑数组 (packed arrays) 也是分页的。然而,在这种情况下,目的不是减少内存使用,而是在组件创建时保持指针稳定性 (pointer stability)。
页的默认大小(即它们包含的元素数量)为 1024,但如果合适,用户可以对其进行调整。在所有情况下,所选值 必须 是 2 的幂。
ENTT_ASSERT
出于性能原因,EnTT 不使用异常或任何其他控制结构。事实上,它提供的许多功能如果使用不当会导致未定义行为。
为了解决这个问题,库依赖大量 assert 来检测 debug 构建中的错误。默认情况下,它在内部使用 assert。允许用户通过设置此变量来覆盖其行为。
ENTT_ASSERT_CONSTEXPR
通常,constexpr 函数内的 assert 并不是什么大问题。然而,在极端定制的情况下,进行区分可能很有用。
为此,EnTT 引入了一个坦白说命名不佳的变量,以在这方面简化工作。默认情况下,此变量将其参数转发给 ENTT_ASSERT。
ENTT_DISABLE_ASSERT
断言 (assertions) 在启用时反过来可能会在一定程度上影响性能。无论是否重新定义了 ENTT_ASSERT 和 ENTT_ASSERT_CONSTEXPR,都可以通过此定义一次性禁用所有断言。
请注意,ENTT_DISABLE_ASSERT 优先于其他变量的重新定义,因此旨在无论如何都禁用所有检查。
ENTT_NO_ETO
为了减少内存消耗并提高性能,EnTT 的 ECS 模块从不实例化或存储空类型 (empty types)。
使用此变量将这些类型视为与其他所有类型一样,从而为它们创建专用的 storage。
ENTT_NO_MIXIN
EnTT 自动将 mixin 分配给所有 storage 类型,以支持在创建、销毁和修改元素时发出信号 (signaling)。
Mixin 在性能和编译时间方面可能会有(很可能微不足道的)成本。如果不想要,此宏会抑制自动生成。
ENTT_STANDARD_CPP
EnTT 将非标准语言特性与完全兼容的特性混合使用,以提供其某些功能。
此定义阻止库使用非标准技术,即不完全符合标准 C++ 的功能。
虽然在撰写本文时没有已知的可移植性问题,但如果需要,这应该会使库完全可移植。
配置注入
配置变量通过代码提供,或通过专用文件直接从外部注入。
EnTT 在内部使用 __has_include 并查找特定路径,即 <entt/ext/config.h>。这可以由用户通过适当设置 include 路径来提供。
例如,CMake 允许用户使用 target_include_directories 将额外的 include 目录 绑定 到目标。请参阅测试套件,特别是 config_ext 测试以获取实际示例。