C# 如何在C语言中快速高效地传递大量顶点和颜色#

C# 如何在C语言中快速高效地传递大量顶点和颜色#,c#,unity3d,C#,Unity3d,我的UserFrame类将颜色和顶点存储为浮动。在每帧的基础上,我必须在游戏中检索这些值。我在类的每个实例中存储了数千个顶点。我目前的方法是将这些值作为引用传递,这会导致内存泄漏,因为我在主作用域之外分配这些数组。将这些值传递到我的主作用域的正确方式是什么 我不希望在两种方法中分别返回每个数组,因为我需要循环两次(颜色+顶点) 公共类用户框架 { 公共浮动[]顶点; 公共浮动[]垂直; 公共浮动[]顶点; 公共浮动[]r; 公共浮动[]g; 公共浮动[]b; ... public void ge

我的UserFrame类将颜色和顶点存储为浮动。在每帧的基础上,我必须在游戏中检索这些值。我在类的每个实例中存储了数千个顶点。我目前的方法是将这些值作为引用传递,这会导致内存泄漏,因为我在主作用域之外分配这些数组。将这些值传递到我的主作用域的正确方式是什么

我不希望在两种方法中分别返回每个数组,因为我需要循环两次(颜色+顶点)

公共类用户框架
{
公共浮动[]顶点;
公共浮动[]垂直;
公共浮动[]顶点;
公共浮动[]r;
公共浮动[]g;
公共浮动[]b;
...
public void getVerticesAndColor(输出向量3[]outputVertexArray,输出颜色[]outputColorArray){
outputVertexArray=新矢量3[vertexX.Length];
outputColorArray=新颜色[vertexX.Length];
对于(int i=0;i
编辑:


我无法将这些变量存储为Vector3或颜色数组,因为我正在序列化数据,而这在这些类型中是不可能的。

在类初始化时,我会将这些值直接转换为颜色和Vector3实例。然后,我将包括一个属性或静态成员,以便在必要时获取它们:

public class UserFrame
{
    public readonly Color[] Colors;
    public readonly Vector3[] Vertices;

    public UserFrame(float[] x, float[] y, float[] z, float[] r, float[] g, float[] b)
    {
        Int32 length = x.Length;

        m_Colors = new Color[length];
        m_Vertices = new Vector3[length];

        for (Int32 i = 0; i < length; ++i)
        {
            Colors[i] = new Color(r[i], g[i], b[i]);
            Vertices[i] = new Vector3(x[i], y[i], z[i]);
        }
    }
}
公共类用户框架
{
公共只读颜色[]颜色;
公共只读向量3[]个顶点;
公共用户框(float[]x,float[]y,float[]z,float[]r,float[]g,float[]b)
{
Int32长度=x.长度;
m_颜色=新颜色[长度];
m_顶点=新矢量3[长度];
对于(Int32 i=0;i
最快的方法是根本不复制,只传递引用,重用数组。但这并不总是可能的。谢谢@Tommaso,这是我的第一个实现。我忘了提到我实际上正在序列化数据并将其保存到磁盘。我不能用Vector3和颜色类型。
public class UserFrame
{
    public readonly Color[] Colors;
    public readonly Vector3[] Vertices;

    public UserFrame(float[] x, float[] y, float[] z, float[] r, float[] g, float[] b)
    {
        Int32 length = x.Length;

        m_Colors = new Color[length];
        m_Vertices = new Vector3[length];

        for (Int32 i = 0; i < length; ++i)
        {
            Colors[i] = new Color(r[i], g[i], b[i]);
            Vertices[i] = new Vector3(x[i], y[i], z[i]);
        }
    }
}