Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OpenGL多维数组惩罚_C#_Arrays_Opengl_Multidimensional Array - Fatal编程技术网

C# OpenGL多维数组惩罚

C# OpenGL多维数组惩罚,c#,arrays,opengl,multidimensional-array,C#,Arrays,Opengl,Multidimensional Array,我一直在努力决定在VBO的OpenGL中存储信息的最佳方式。我一直在读关于矩阵是如何存储为一维数组的,因为使用多维数组会降低性能 我想知道,这是否扩展到在VBO中存储信息?在VBO中以单个或多维数组存储顶点信息更有意义吗 在我得到一大堆答案说这取决于我存储的内容之前,我要特别讨论的是传统上多维数组(地图、网格等)需要考虑的事情 如果使用多维数组,我会看到什么类型的性能影响?这个问题是无效的,因为它没有意义。缓冲区对象是由OpenGL存储和管理的内存块。它不是C#数组或C#多维数组。它是一块可以将

我一直在努力决定在VBO的OpenGL中存储信息的最佳方式。我一直在读关于矩阵是如何存储为一维数组的,因为使用多维数组会降低性能

我想知道,这是否扩展到在VBO中存储信息?在VBO中以单个或多维数组存储顶点信息更有意义吗

在我得到一大堆答案说这取决于我存储的内容之前,我要特别讨论的是传统上多维数组(地图、网格等)需要考虑的事情


如果使用多维数组,我会看到什么类型的性能影响?

这个问题是无效的,因为它没有意义。缓冲区对象是由OpenGL存储和管理的内存块。它不是C#数组或C#多维数组。它是一块可以将数据传输到其中的内存

放入缓冲区对象的顶点数据必须符合允许的条件。如何在C#中实现这一点取决于您和您使用的任何API

由于使用多维数组会造成性能损失,因此存储为一维数组

我认为您的困惑源于多维数组的术语差异以及如何表示它们

在C语言中,通过指针解引用来访问数组:

int arr[10];

arr[5] <--> *(arr+5)
你可以把它扩展到任意多的维度。因此,在C中,多维数组经历多个指针解引用,这也可能意味着,数据在内存中不是连续的,在face中,每行的大小可能不同。这就是他们效率低下的原因。C这样做是为了允许列指针和行的动态分配

但是,另一种存储多维数组的方法是平面存储模型。也就是说,您只需将所有元素连接成一个值字符串。通过引入尺寸,你知道,在哪里剪切这个字符串来重新排列它

int fmarr[10*20*30];

int at1_2_3 = fmarr[1*30*20 + 2*20 + 3];

正如您所看到的,所有大小都是静态的,并且数据是连续的。并没有指针解引用,这使得处理数据更加简单,更重要的是允许操作的矢量化。这会使事情变得更加高效。

好的,这是有道理的。我不确定,因为我看到了很多书,等等。。。这种说法与它们相悖,但我想它只适用于矩阵,因为OpenGL与它们一起实现特定的功能,而不仅仅是对它们进行读写。因此,我的一个问题是关于锯齿阵列。它们是否必须以不同于多维数组的方式添加到VBO中?@Davidtorry:“如何在C#中实现这一点取决于您和您使用的任何API”,您不明白吗?OpenGL不知道C#锯齿数组、C#多维数组或其他任何东西。它知道字节数。给它一系列未格式化的字节,然后告诉它如何使用给定的函数解释该字节流。如何获取C#数据结构并将其转换为提供给OpenGL的一系列字节取决于OpenGL接口代码。
int fmarr[10*20*30];

int at1_2_3 = fmarr[1*30*20 + 2*20 + 3];