有没有办法从 blittable 结构数组中获取值数组?

Posted

技术标签:

【中文标题】有没有办法从 blittable 结构数组中获取值数组?【英文标题】:Is there a way to get an array of values from an array of blittable structs? 【发布时间】:2020-10-24 01:27:50 【问题描述】:

我有一个 blittable 结构数组,所以每个结构在内存中都是固定大小和顺序的。我希望从这个单一的结构数组中创建多个数组。这是结构:

[Serializable]
public struct SpriteRenderInstruction : IComparable<SpriteRenderInstruction>

    public int SpriteAtlas;
    public float4 Transform;
    public float2 SpriteSize;
    public float4 Uv;
    public float4 Color;
    public int SortingLayer;
    public int SortingOrder;

    public int CompareTo(SpriteRenderInstruction other)
    
        if (this.SortingLayer != other.SortingLayer)
        
            return this.SortingLayer - other.SortingLayer;
        
        else if (this.SortingOrder != other.SortingOrder)
        
            return this.SortingOrder - other.SortingOrder;
        
        else
        
            return this.SpriteAtlas - other.SpriteAtlas;
        
    

对SpriteRenderInstructions数组进行排序,然后我需要将它们变成Transforms数组、SpriteSizes数组、Uvs数组和Colors数组。由于这发生在每一帧,而且我正在处理固定大小的结构,我希望有一种方法可以在不创建副本的情况下获取这 4 个数组。我知道有使用 Linq 获取这些数组的方法:

float4[] transforms = spriteRenderers.Select(p => p.Transform).ToArray();
float4[] spriteSizes = spriteRenderers.Select(p => p.SpriteSize ).ToArray();
float4[] uvs = spriteRenderers.Select(p => p.Uv).ToArray();
float4[] colors = spriteRenderers.Select(p => p.Color).ToArray();

但是这些都创建了新的数组,我想避免为此分配内存。

【问题讨论】:

会分配这么多内存吗? 这是针对 Unity 中的渲染系统的,我正在尝试使用他们新的 DrawMeshIndirectProcedural API 和 ECS 框架的组合来查看一次可以在屏幕上绘制多少个精灵。我目前的目标是推送 10 万个精灵,并且每帧分配 4 个 10 万个元素的数组会大大降低性能。 【参考方案1】:

不,您不能在不复制的情况下创建(例如)变换的数组(或跨度),因为数组(或跨度)的定义特征是同质值必须是连续的,但在这种情况下:值将连续 - 它们将分布在 SpriteRenderInstruction 的所有其他部分中。

如果您绝对需要它们作为数组,则需要复制;但是,您应该能够在帧之间重用现有缓冲区,并且只覆盖活动部分(并跟踪它!) - 即

float4[] transforms = Array.Empty<float4>();
// ^^^ retain these buffers between frames, presumably in a field

// etc
var len = spriteRenderers.Length;
if (len > transforms.Length)

    transforms = new float4[len]; // todo: possibly add padding
    // etc

for (int i = 0 ; i < spriteRenderers.Length; i++)

    var renderer = spriteRenderers[i];
    transforms[i] = renderer.Transform;
    // etc

记住不要看过去len(以防数字变小)

【讨论】:

一个很好的解决方案,因为它解决了我不断分配的问题。

以上是关于有没有办法从 blittable 结构数组中获取值数组?的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 从具有嵌套数组的类中获取子属性值和父属性值

有没有办法在没有参数的情况下在其函数中获取数组结构的索引?

如何从 Rust 中的结构数组中获取字段值数组?

C语言中,return语句怎么样返回一个数组?

有没有办法从时间戳类型列中获取 DateTime 值?

有没有办法从 BigQuery 的表中获取所有列的不同值?