2014-10-20 117 views
3
UCLASS(abstract, config=Game, BlueprintType, hidecategories=("Pawn|Character|InternalEvents")) 
class ENGINE_API ACharacter : public APawn 
{ 
    GENERATED_UCLASS_BODY() 
... 
    UPROPERTY(Transient) 
    uint32 bClientWasFalling:1; 

    /** If server disagrees with root motion track position, client has to resimulate root motion from last AckedMove. */ 
    UPROPERTY(Transient) 
    uint32 bClientResimulateRootMotion:1; 

    /** Disable simulated gravity (set when character encroaches geometry on client, to keep him from falling through floors) */ 
    UPROPERTY() 
    uint32 bSimGravityDisabled:1; 

    /** 
    * Jump key Held Time. 
    * This is the time that the player has held the jump key, in seconds. 
    */ 
    UPROPERTY(Transient, BlueprintReadOnly, VisibleInstanceOnly, Category=Character) 
    float JumpKeyHoldTime; 

上面的代码来自UE4。他们似乎使用uint32一位bitfields而不是bools。他们为什么这样做?为什么我应该使用1bit位域而不是bools?

+5

我想象它是为了节省空间。 – shuttle87 2014-10-20 16:11:40

+0

'bool'不使用一位,所以如果他们打包超过4个变量,他们会获得一些空间。 – Jarod42 2014-10-20 16:12:10

+1

UE4是一款现代化的发动机。在现代系统中节省内存是至关重要的吗? – 2014-10-20 16:17:19

回答

6

独立的bool至少有一个字节长。处理器无法处理更小的单元。然而,我们都知道一个字节可以容纳8位/布尔,所以如果你有一个以多个布尔为特征的数据结构,你不需要每个字节。他们可以共享一个字节。如果你有很多这样的结构,它可能会节省一些内存。

+3

然而,访问位域通常比较慢,并且不能自动完成(例如,对于多线程应用程序) – 2014-10-20 16:14:08

+1

这是真的。我想开发者发现比这个代码中的缺点更有帮助,也许别人会在另一段代码中以不同的方式加权。 – nvoigt 2014-10-20 16:17:08

+1

@BasileStarynkevitch可以在某些体系结构上实现原子位域访问。 'amd64'可能不支持这个,但'armv6'支持原子读取。 – 2014-10-20 16:37:06

相关问题