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

问题描述

我有一种生成网格和构造场景的特定方法,可以使遮挡剔除变得非常直接和最佳。现在,我需要知道的是如何使用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();
,

还有另一种隐藏/显示实体的方法。但这需要您在空间上对相邻实体进行大块分组(您可能已经在这样做了)。然后,您将不一一一一地遮住特定的实体,而是将它们的整个大块(空间区域)封闭。这有可能要归功于:

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 Hybrid渲染通过按顺序排列数据来加快速度。如果每个网格都有一个布尔值,允许您显示或隐藏网格,那么Unity仍然必须对其进行评估,我想这不在其设计理念之内。正如我所发现的那样,整个设计哲学总的来说对我不起作用。

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...