如何在 unity 2020 中使用 Hybrid Renderer V2 动态显示或隐藏 Burstable ForEach 作业中的网格?

How to dynamically show or hide meshes from a Burstable ForEach job using Hybrid Renderer V2 in unity 2020?

我有一种特定的方法来生成网格和构建我的场景,这使得遮挡剔除非常直接和最佳。现在我只需要知道如何使用 ECS 混合渲染器有效地实际显示或隐藏网格。我考虑过将层更改为 RenderMesh 组件中的隐藏层,但 RenderMesh 组件是一个 ISharedComponentData,因此不支持作业化或突发。我看到了 Unity BatchRendererGroup API,它的 OnPerformCulling 回调看起来很有前途,但我不知道是否可以连接到 HybridRenderSystem 的内部 BatchRenderGroup。我还看到了 DisableRendering IComponentData 标签,我猜它会禁用实体渲染。但是,同样,这只能从主线程完成。我可以编写自己的解决方案来使用 Graphics.DrawMesh 或类似的东西渲染网格,但我更愿意将它与 HybridRenderer 本地集成,以便剔除与我的程序网格无关的网格。

这有可能吗?预期用途是什么?

我不确定这是最好的选择,但您可以尝试并行命令缓冲区:

var ecb = new EntityCommandBuffer( Allocator.TempJob );
var cmd = ecb.AsParallelWriter();

/* job 1 executes with burst & cmd adds/removes Disabled or DisableRendering tags */

// (main thread) job 2 executes produced commands:
Job
    .WithName("playback_commands")
    .WithCode( () =>
    {
        ecb.Playback( EntityManager );
        ecb.Dispose();
    }
    ).WithoutBurst().Run();

hiding/showing实体还有另一种方式。但它要求您在空间上将相邻实体分组(您可能已经这样做了)。然后,您将不会一个接一个地遮挡特定实体,而是遮挡它们的整个块(space 的扇区)。这可能要归功于以下的神奇力量:

chunk component data

var queryEnabled = EntityManager.CreateEntityQuery(
        ComponentType.ReadOnly<RenderMesh>()
    ,   ComponentType.Exclude<Disabled>()
);

queryEnabled.SetSharedComponentFilter( new SharedSector {
        Value = new int3{ x=4 , y=1 , z=7 }
} );

EntityManager.AddChunkComponentData( queryEnabled , default(Disabled) );
// EntityManager.RemoveChunkComponentData<Disabled>( queryDisabled );

public struct SharedSector : ISharedComponentData
{
    public int3 Value;
}

答案是你不能也不应该! Unity 混合渲染通过按顺序布置数据来提高速度。如果每个网格都有一个允许您显示或隐藏网格的布尔值,Unity 仍然必须对其进行评估,我想这不符合他们的设计理念。我发现,这整个设计理念对我来说并不适用。

我的世界由程序生成的地形网格块组成(想想 minecraft 但更好 ;))这个问题是每个块都有自己的 RenderMesh 和一个独特的网格......这意味着每个块都有自己的拥有...块...在内存中 xD。这听起来很合适,但效率极低。我决定完全放弃 Hybrid ECS 并使用很好的旧游戏对象。仅通过此更改,我就看到了 4 倍的性能提升(从 200 到 800fps)。我只是使用 MeshRenderer.enabled 属性 来有效地启用和禁用渲染。为了解决这个问题,我简单地存储了一个网格边界数组和一个布尔值,以确定它是否可见。然后我可以在作业中评估这个数组,并吐出所有需要更改可见性的块的索引列表。这只剩下为主线程设置几个布尔值,这根本不是很昂贵......这不是我正在寻找的 ECS 友好解决方案,但从它的外观来看,ECS 并不是我在这里的朋友。为我的世界的每个部分设置独特的网格显然不是混合 ECS 的预期用例。