【Unity】关于 Dots 创建Entity的开销

        在 Dots 中创建实体的开销是很低的,但是其性能究竟如何?Unity 提供了单个创建 Entity 和批量创建的API,该如何选择?之前没有对这方面详细测试过,这里做个初步的测试。

        根据 Unity  的官方说法,如下图所示:

        官方说法:10 万个单位,耗时 8 ms 。但是根据我实际测试(电脑),创建 30240 个Entity 耗时 0.6s 。当然我的 Entity 肯定比官方要复杂些,但是可见官方的测试性能要比一般情况下要好些,尤其是真机上。

        如果以不出现明显卡顿为要求(假设默认60帧,掉帧不能掉到30帧以下,那么创建单位总耗时 < 0.16 ms ),单次创建单位应少于 700 ,否则就会造成主线程掉帧。

关于大量创建 Entity

        Unity 提供了一个批量创建 Entity 的接口:

namespace Unity.Entities
{
    public struct EntityManager : IEquatable<EntityManager>
    {
        //单个创建
        public unsafe Entity CreateEntity(EntityArchetype archetype);

        //批量创建
        public unsafe NativeArray<Entity> CreateEntity(EntityArchetype archetype, int entityCount, Allocator allocator);
    }
}

        那么这个接口对于大量创建单位是否有优化呢?

        首先,无论是单个创建还是批量创建,都是有一些固定开销的,而且批量创建的固定开销显然大于单个创建(固定开销增加约 2ms)。但是创建单位而言,批量创建确实有优势(单个耗时约0.017ms),比单个创建(单个耗时约0.021ms)提升大约 20% 左右的性能。

        根据此提升比例换算,如果一次性创建的 Entity 数量大于 500 个,建议使用批量创建;此时批量创建单位节约的性能将大于额外增加的固定开销

        但是问题又来了,之前测试过,数量大于 700 会造成主线程掉帧(批量创建性能好些,以到 900 个)。当同时创建单位数量足够多(> 900)时,岂不是总会造成卡顿?事实上确实也是如此,大量创建单位无论用哪个 API 都会造成主线程掉帧。因此,建议的处理方式是:当创建数量较多时,放到协程来处理

猜你喜欢

转载自blog.csdn.net/cyf649669121/article/details/129838683
今日推荐