タグ: Fake

  • BlenderのFake Userとは何か

    BlenderのFake Userとは何か

    未使用Materialが消える理由と、Fake Userの存在意義

    Blenderを使っていると、作ったはずのMaterialやActionが、保存後に消えてしまったように見えることがあります。私もblenderの使い始めから今日にいたるまで,よく理解できないまま1年半を過ごしてきました.

    特にMaterialでは、次のような場面で混乱しやすくなります。

    Materialを作った

    まだObjectに割り当てていない

    保存して開き直した

    Materialが見当たらない

    これは、Blenderの Data-block管理 と関係しています。

    Blenderでは、Material、Mesh、Image、Action、Node Groupなどが Data-block として管理されています。これらのData-blockには「実際に使われているかどうか」を示す Users という考え方があります。

    公式マニュアルでは、実ユーザーを持たないData-blockは通常、blendファイル保存時にクリーンアップされるため、それを防ぐにはFake Userを付けると説明されています。つまりFake Userは、未使用Data-blockを保存対象として残すための仕組みです。

    Image

    1. Fake Userを理解する前に:Data-blockとは

    Blenderでは、画面上に見えるObjectだけでなく、MaterialやMesh、Image、Actionなども個別のデータとして管理されています。

    例えば、1つのキャラクターObjectには、次のようなData-blockが関係します。

    Object Data-block
    Mesh Data-block
    Material Data-block
    Image Data-block
    Action Data-block

    MaterialもData-blockの一種です。

    Skin_Mat
    Shirt_Mat
    Eye_Mat

    これらは単なる表示名ではなく、Blenderファイル内で管理されるMaterial Data-blockです。

    Blender開発者向けドキュメントでも、ID、つまりData-blockにUsersが0の場合はディスクに保存されず、未使用IDを保持するにはFake User相当のフラグが必要であると説明されています。


    2. Usersとは何か

    Usersとは、そのData-blockがどこから参照されているかを示す考え方です。

    Materialで言えば、ObjectのMaterial SlotにMaterial Dataが入っていれば、そのMaterial DataにはUserがあります。

    Object A
    Material Slot 0 → Skin_Mat

    Skin_Mat
    Users = 1

    同じMaterial Dataを複数Objectが使っている場合は、Usersが増えます。

    Object A Slot 0 → Skin_Mat
    Object B Slot 0 → Skin_Mat

    Skin_Mat
    Users = 2

    一方、どのObjectのMaterial Slotにも入っていないMaterial Dataは、Users = 0になります。

    Old_Mat
    Users = 0

    このUsers = 0のData-blockが、保存時やPurge時に問題になります。


    3. Blenderでは未使用Data-blockが消えることがある

    Blenderでは、Users = 0のData-blockは、通常は保存対象から外れます。

    これは一見すると不親切に見えます。
    しかし、Blenderでは作業中に多くのData-blockが増えます。

    例えば、Materialを試作すると、

    Material
    Material.001
    Material.002
    Old_Mat
    Test_Shader

    のように、使わなくなったMaterialが残りやすくなります。

    Mesh、Image、Action、Node Groupも同様です。
    もし未使用Data-blockをすべて保存し続ける仕様にすると、.blendファイル内に不要データが蓄積しやすくなります。

    そのためBlenderでは、

    使われているData-blockは保存する
    使われていないData-blockは保存対象から外す

    という方向の設計になっています。


    4. しかし、未使用でも残したいData-blockがある

    問題は、Users = 0でも本当に不要とは限らないことです。

    例えば、次のようなMaterialは残したい場合があります。

    後で使う予定のMaterial
    まだObjectに割り当てていないShader
    作り込んだNode構成のMaterial
    一時的にObjectから外しているMaterial

    また、Actionでも同じです。

    作成した歩行Animationや待機Animationが、現在どのObjectにも割り当てられていない場合、Users = 0になることがあります。
    しかし、それは不要という意味ではありません。

    このような「未使用だが残したいData-block」を守るために使うのが Fake User です。


    5. Fake Userとは何か

    Fake Userとは、Data-blockに対して、

    今は実際のUserがなくても、このData-blockは保存しておく

    と指定するための保持フラグです。

    Materialで言えば、次のようになります。

    Old_Mat
    Users = 0
    Fake User = OFF
    → 未使用Data-blockとして消える可能性がある
    Old_Mat
    Users = 0
    Fake User = ON
    → 未使用でも保存対象として残る

    つまりFake Userは、「偽のユーザー」という名前ですが、実際には、

    未使用Data-blockを保存対象にするための保護マーク

    と考えると分かりやすいです。


    6. Fake Userは「データが増える問題」と関係している

    Fake Userの存在意義を理解するには、次の2つの問題を分けて考える必要があります。

    1つ目は、BlenderではData-blockがどんどん増えやすいという問題です。
    Material、Action、Image、Node Groupなどを試作していると、未使用Data-blockが増えます。

    2つ目は、未使用Data-blockの中にも残したいものがあるという問題です。

    この2つを同時に扱うため、Blenderでは次のような設計になっています。

    原則:
    Users = 0 のData-blockは保存・保持しない

    例外:
    残したいUsers = 0 のData-blockにはFake Userを付ける

    したがってFake Userは、単に「データを消す機能」ではありません。
    むしろ、

    Data-blockが増え続ける問題を避けながら、必要な未使用Data-blockだけを残すための例外指定

    です。

    Blender開発タスクでも、Fake User、auto-purge、未使用IDの保存、Orphan Data表示などがまとめて議論されています。そこでは、Fake Userを残す案、Fake Userを削除してAsset機能などで保護する案、未使用データのPurge UI改善などが議論されています。


    7. なぜ「自動削除しなければよい」では済まないのか

    初めてFake Userを知ると、

    そもそも未使用Data-blockを自動削除しなければよいのでは?

    と思うかもしれません。

    しかし、Blenderでは作業中に多くのData-blockが生成されます。

    試作Material
    削除したObjectのMesh
    使わなくなったAction
    読み込んだが使っていないImage
    一時的なNode Group

    これらをすべて自動保存すると、.blendファイルは不要データで肥大化します。

    一方で、自動的に消すだけでは、必要な未使用Data-blockまで失う危険があります。

    Fake Userは、この中間にある仕組みです。

    不要な未使用Data-block
    → Purge対象

    必要な未使用Data-block
    → Fake Userで保持

    8. Material作業でのFake Userの具体例

    例えば、作り込んだMaterialを一時的にObjectから外したとします。

    Object A
    Slot 0 → Skin_Mat
    Slot 1 → Old_Shader

    ここで、Slot 1から Old_Shader を外すと、

    Object A
    Slot 0 → Skin_Mat

    Old_Shader
    Users = 0

    になります。

    この状態で Old_Shader にFake Userが付いていなければ、保存・再読み込みやPurgeで消える可能性があります。

    しかしFake Userを付けていれば、

    Old_Shader
    Users = 0
    Fake User = ON

    となり、Objectに割り当てられていなくても保持されます。


    9. Fake UserとPurgeの関係

    Purgeは、未使用Data-blockを整理するための操作です。

    しかし、Fake Userが付いたData-blockは、「未使用でも残す」と指定されているため、通常の未使用データとは扱いが変わります。

    そのため、Material Dataを完全に整理したい場合は、次の順で確認すると安全です。

    1. Objectから不要なMaterial Slotを削除する
    2. Material Dataが他Objectで使われていないか確認する
    3. Fake UserがONになっていないか確認する
    4. 不要ならFake UserをOFFにする
    5. Orphan DataでPurgeする

    Fake UserがONのままだと、使っていないMaterial Dataが残り続ける原因になります。


    10. Fake Userは便利だが、名前が分かりにくい

    Fake Userという名前は、初心者には分かりにくいです。

    実際には、

    Preserve
    Keep
    Protect
    Save even when unused

    のような意味に近いです。

    開発者・ユーザー議論でも、Fake UserのUIや名称、未使用Data-blockの扱いは分かりにくいものとして議論されています。たとえばDevTalkでは、Fake Userという名前をGuardやProtectのような名称に変える提案も出ています。

    Blogでは、次のように説明するとよいです。

    Fake Userは直訳すると「偽のユーザー」ですが、実務上は「未使用でも保存するための保護フラグ」と考えると理解しやすいです。


    11. Material Slot削除とFake Userは別の話

    Material作業では、次の違いも重要です。

    操作意味
    ObjectからMaterial Slotを削除するObject側のMaterial Slot枠を消す
    Material SlotからMaterial Dataを外すSlot枠は残し、中身のMaterialだけ外す
    Material DataをPurgeする未使用Material Data本体を削除する
    Fake Userを付ける未使用でもMaterial Dataを残す

    Material Slotを削除しても、Material Data本体が必ず消えるわけではありません。

    Material Dataが残る条件には、次のようなものがあります。

    他Objectが使っている
    別Slotが参照している
    Fake Userが付いている
    AssetやLibrary Link由来である
    まだPurgeしていない

    したがって、Materialを整理するときは、

    Object側のSlotを整理する

    Material Data本体のUsersとFake Userを確認する

    不要なMaterial DataをPurgeする

    という順で考えると分かりやすくなります。


    12. Blog用まとめ

    Fake Userは、BlenderのData-block管理を理解する上で重要な機能です。

    一言で言えば、

    Fake Userは、未使用でも残したいData-blockを保存対象にするための保護フラグ

    です。

    ただし、その背景には、

    Blenderでは作業中にMaterial、Action、Mesh、ImageなどのData-blockが増えやすく、未使用Data-blockをすべて保存するとファイルが肥大化する

    という問題があります。

    そのためBlenderでは、基本的にUsers = 0のData-blockは未使用として扱い、残したいものだけFake Userで保持します。

    使っているData-block
    → 保存される

    使っていないData-block
    → Purge対象・保存対象外になる可能性

    使っていないが残したいData-block
    → Fake Userで保持

    Fake Userは、不要データを削除する機能ではありません。
    しかし、不要データが増え続ける問題を避けるBlenderの設計の中で、必要な未使用データだけを守るための例外指定として存在しています。


    【注意点・例外】

    • Fake Userが付いていても、外部リンクやAsset管理、Library Overrideの状態によっては挙動が異なる場合があります。
    • Material Dataだけでなく、Action、Image、Node Groupなどにも同様の考え方が関係します。
    • Fake UserがONのままだと、不要Data-blockがPurgeされずに残る原因になります。
    • 逆にFake Userを付け忘れると、作り込んだMaterialやActionが保存後に消えたように見えることがあります。
    • 正確な開発導入年や初期実装理由については、今回確認できた一次情報だけでは断定できません。

    【出典】

    【確実性: 中】