2014-10-20 5 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 однобитовые битовые поля вместо bools. Почему они это делают?Почему я должен использовать 1 бит битовых полей вместо bools?

+5

Я бы предположил, что это экономит место. – shuttle87

+0

'bool' не использует один бит, поэтому, если они упаковывают более 4 переменных, они получают некоторое пространство. – Jarod42

+1

UE4 - современный двигатель. Является ли сохранение памяти жизненно важным для современных систем? –

ответ

6

Автономный bool есть как минимум один байт. Процессор не может обрабатывать меньшие единицы. Тем не менее, мы все знаем, что байт может содержать 8 бит/bools, поэтому, если у вас есть структура данных с несколькими bool, вам не нужен байт для каждого. Они могут делиться байтом. Если у вас много таких структур, это может сэкономить память.

+3

Однако доступ к битовым полям, как правило, медленнее и не может выполняться атомарно (например, для многопоточных приложений) –

+1

Это правда. Думаю, разработчик нашел преимущества более полезными, чем недостатки в этом коде, может быть, кто-то другой по-другому взвешивал бы его в другом фрагменте кода. – nvoigt

+1

@BasileStarynkevitch Доступ к атомному битовому полю может быть достигнут на некоторых архитектурах. 'amd64' может не поддерживать это, но' armv6' поддерживает атомные чтения. –