C++ 在引擎盖下的第一部分
我一直在使用C++ 在引擎盖下的第一部分,c++,winapi,createdibsection,C++,Winapi,Createdibsection,我一直在使用WINAPI CreateDIBSection()逐像素地绘制,然后将位图转换为DC。我很好奇。CreateDIBSection的底层数据结构发生了什么变化?BITMAPINFO结构存储屏幕/客户端的宽度和高度。然后VOID**ppvBits处理24位颜色。那么,这一切可以看作是一个3D阵列吗?与此类似 整数像素[高度][宽度][颜色] 我问这个问题的原因是这个CreateDIBSection()函数非常快,但是如果我创建一个类似的数组(900*1800*(246*256*256))
WINAPI CreateDIBSection()
逐像素地绘制,然后将位图转换为DC。我很好奇。CreateDIBSection的底层数据结构发生了什么变化?BITMAPINFO结构存储屏幕/客户端的宽度和高度。然后VOID**ppvBits处理24位颜色。那么,这一切可以看作是一个3D阵列吗?与此类似
整数像素[高度][宽度][颜色]
我问这个问题的原因是这个CreateDIBSection()
函数非常快,但是如果我创建一个类似的数组(900*1800*(246*256*256)),它会非常慢
微软是如何快速高效地获得这种方法的?我什么都试过了。Int***指针指向指向指针的指针,Int***malloc
,尝试了NEW
等,它们在大型数组上都非常慢。我只是想知道如何构建一个性能同样好的3D阵列。有什么想法吗
我需要一个大约20000x1800x100000的阵列CreateDIBSection()
快速存储,不会出现任何问题。但是一个标准的C/C++动态数组怎么样
我需要将
CreateDIBSection()
和BITMAPINFO
中的内容存储在第二个数组中。它不使用三维数组。它只需要颜色的一维数组。您可以从索引中获取X
和Y
坐标,并知道位图的宽度
row = index / width;
column = index % width;
对于24位颜色,dib的大小为width*height*3字节
(每种颜色一个字节)。当它加载到内存中时,它会被填充到4个字节(整数的大小)
您可以使用直接访问位
另请参见:你到底在说什么“真的很慢”?分配?以某种方式使用内存?除了在某些特殊情况下(如DirectX从视频复制到系统RAM),内存通常是内存-无论是通过
CreateDIBSection
还是通过malloc
分配。您分配的内存太多了。类似的数组将是900*1800*3,因为对于每个像素,您有3个字节(如果您有alpha,则为4个字节,加上每行末尾的一些字节以进行对齐)。它不是一个3D数组,而是一个2D颜色值数组。