2014-10-20 97 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

相關問題