• 最新Unity DOTS教程之BlobAsset核心机制分析


    最近DOTS发布了正式的版本, 我们来分享一下DOTS里面BlobAsset机制,方便大家上手学习掌握Unity DOTS开发。

    BlobAsset 概叙

    DOTS提供了BlobAsset机制来把数据生成高效的二进制数据。BlobAsset的数据是不可变的。BlobAsset只支持非托管类型数据。支持Burst编译器编译出来的类型。同时它只存储非托管类型的数据,这样使得它序列化与反序列化的性能与效率非常的块。BlobAsset也可以被entity种的component使用。

    对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

    BlobAsset不支持如:数组, string等其它的托管对象(垃圾回收器可以回收的为托管对象),而且运行的时候不允许改变里面的数据内容。BlobAsset为了更快的加载,他只会包含传值的类型,不能包含对内部的引用与内部指针。BlobAsset除了支持标准的值类型(float, int等)以外它还支持三种特殊的类型: BlobArray, BlobPtr, BlobString。如果BlobAsest包含内部指针,编译器会报错。使用BlobAsset主要注意以下几个方面:

    A: 创建一个BlobAsset,你需要先生成一个BlobBuilder,来帮助你处理计算每个数据在内存种的偏移;

    总结:使用BlobBuilder来生成BlobAsset,基于BlobAssetReference来高效访问里面的数据。

    BlobAsset的创建与使用

    创建一个BlobAsset,按照以下步骤来进行处理即可:

    BlobBuilder构造出BlobAsset,并把数据存入进去,然后再生成BlobAssetReference来给用户操作数据。参考代码如下:

    1. struct MarketData
    2. {
    3. public float PriceOranges;
    4. public float PriceApples;
    5. }
    6. BlobAssetReference<MarketData> CreateMarketData()
    7. {
    8. // Create a new builder that will use temporary memory to construct the blob asset
    9. var builder = new BlobBuilder(Allocator.Temp);
    10. // Construct the root object for the blob asset. Notice the use of `ref`.
    11. ref MarketData marketData = ref builder.ConstructRoot<MarketData>();
    12. // Now fill the constructed root with the data:
    13. // Apples compare to Oranges in the universally accepted ratio of 2 : 1 .
    14. marketData.PriceApples = 2f;
    15. marketData.PriceOranges = 4f;
    16. // Now copy the data from the builder into its final place, which will
    17. // use the persistent allocator
    18. var result = builder.CreateBlobAssetReference<MarketData>(Allocator.Persistent);
    19. // Make sure to dispose the builder itself so all internal memory is disposed.
    20. builder.Dispose();
    21. return result;
    22. }
    23. #endregion

    如果你要存数组到BlobAsset,可以使用BlobArray来处理。数组数据内部基于索引的偏移来进行每个元素的定位。将数组存入到BlobAsset的代码如下:

    1. #region CreateBlobAssetWithArray
    2. struct Hobby
    3. {
    4. public float Excitement;
    5. public int NumOrangesRequired;
    6. }
    7. struct HobbyPool
    8. {
    9. public BlobArray<Hobby> Hobbies;
    10. }
    11. BlobAssetReference<HobbyPool> CreateHobbyPool()
    12. {
    13. var builder = new BlobBuilder(Allocator.Temp);
    14. ref HobbyPool hobbyPool = ref builder.ConstructRoot<HobbyPool>();
    15. // Allocate enough room for two hobbies in the pool. Use the returned BlobBuilderArray
    16. // to fill in the data.
    17. const int numHobbies = 2;
    18. BlobBuilderArray<Hobby> arrayBuilder = builder.Allocate(
    19. ref hobbyPool.Hobbies,
    20. numHobbies
    21. );
    22. // Initialize the hobbies.
    23. // An exciting hobby that consumes a lot of oranges.
    24. arrayBuilder[0] = new Hobby
    25. {
    26. Excitement = 1,
    27. NumOrangesRequired = 7
    28. };
    29. // A less exciting hobby that conserves oranges.
    30. arrayBuilder[1] = new Hobby
    31. {
    32. Excitement = 0.2f,
    33. NumOrangesRequired = 2
    34. };
    35. var result = builder.CreateBlobAssetReference<HobbyPool>(Allocator.Persistent);
    36. builder.Dispose();
    37. return result;
    38. }
    39. #endregion

    存储string到BlobAsset, 代码如下:

    1. #region CreateBlobAssetWithString
    2. struct CharacterSetup
    3. {
    4. public float Loveliness;
    5. public BlobString Name;
    6. }
    7. BlobAssetReference CreateCharacterSetup(string name)
    8. {
    9. var builder = new BlobBuilder(Allocator.Temp);
    10. ref CharacterSetup character = ref builder.ConstructRoot();
    11. character.Loveliness = 9001; // it's just a very lovely character
    12. // Create a new BlobString and set it to the given name.
    13. builder.AllocateString(ref character.Name, name);
    14. var result = builder.CreateBlobAssetReference(Allocator.Persistent);
    15. builder.Dispose();
    16. return result;
    17. }
    18. #endregion

    存储BlobPtr数据到BlobAsset,代码如下:

    1. #region CreateBlobAssetWithInternalPointer
    2. struct FriendList
    3. {
    4. public BlobPtr<BlobString> BestFriend;
    5. public BlobArray<BlobString> Friends;
    6. }
    7. BlobAssetReference<FriendList> CreateFriendList()
    8. {
    9. var builder = new BlobBuilder(Allocator.Temp);
    10. ref FriendList friendList = ref builder.ConstructRoot<FriendList>();
    11. const int numFriends = 3;
    12. var arrayBuilder = builder.Allocate(ref friendList.Friends, numFriends);
    13. builder.AllocateString(ref arrayBuilder[0], "Alice");
    14. builder.AllocateString(ref arrayBuilder[1], "Bob");
    15. builder.AllocateString(ref arrayBuilder[2], "Joachim");
    16. // Set the best friend pointer to point to the second array element.
    17. builder.SetPointer(ref friendList.BestFriend, ref arrayBuilder[2]);
    18. var result = builder.CreateBlobAssetReference<FriendList>(Allocator.Persistent);
    19. builder.Dispose();
    20. return result;
    21. }
    22. #endregion

    这里的BlobPtr是基于数据的偏移来存储的;

    今天的BlobAsset机制,就给大家分享到这里了,更多的DOTS系列,关注我们,持续更新!

  • 相关阅读:
    vxe-table 将表格指定行设置颜色后,选中行、悬浮行样式失效解决。
    关于Redis的事件回调解析
    设计模式-原型模式-浅克隆和深克隆在Java中的使用示例
    【MPC】③二次规划求解器quadprog的win平台下C++动态库生成与使用
    对数据库密码使用MD5加密算法加密,并进行登录验证
    PMP考试前两个月开始备考时间足够吗?
    005. 字符串分割[100 分]
    【SpringBoot整合 Apache POI 完成复杂表头数据的导出】
    【Linux】进程优先级PRI
    DST-Character Mod:Sesshoumaru-Introduction
  • 原文地址:https://blog.csdn.net/voidinit/article/details/134038666