我有一大堆需要提供给 OpenGL 的值类型。如果这能尽快发生就好了。 我现在正在做的是这样的:
List<Vertex> VList = new List<Vertex>();
... //Add vertices
Vertex[] VArray;
VList.CopyTo(VArray, VList.Length);
GL.SetData(..., VArray);
这个列表很容易就有 10MB 大,所以复制很慢。我可以在不复制的情况下执行此操作,例如以某种方式获取指向 List 内部使用的数组的指针吗?
还是我必须实现自己的 List 类..
编辑:我忘了说我不知道要添加到列表中的元素数量。
最佳答案
如果您需要重复访问内部数组,最好将访问器存储为委托(delegate)。
在这个例子中,它是动态方法的委托(delegate)。第一次调用可能不会很快,但后续调用(在相同类型的列表上)会快得多。
public static class ListExtensions
{
static class ArrayAccessor<T>
{
public static Func<List<T>, T[]> Getter;
static ArrayAccessor()
{
var dm = new DynamicMethod("get", MethodAttributes.Static | MethodAttributes.Public, CallingConventions.Standard, typeof(T[]), new Type[] { typeof(List<T>) }, typeof(ArrayAccessor<T>), true);
var il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0); // Load List<T> argument
il.Emit(OpCodes.Ldfld, typeof(List<T>).GetField("_items", BindingFlags.NonPublic | BindingFlags.Instance)); // Replace argument by field
il.Emit(OpCodes.Ret); // Return field
Getter = (Func<List<T>, T[]>)dm.CreateDelegate(typeof(Func<List<T>, T[]>));
}
}
public static T[] GetInternalArray<T>(this List<T> list)
{
return ArrayAccessor<T>.Getter(list);
}
}
确保包括:
using System.Reflection;
using System.Reflection.Emit;
关于c# - List<T> 到 T[] 而不复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4972951/