【发布时间】:2015-07-08 05:21:39
【问题描述】:
我一直在使用WINAPI CreateDIBSection() 逐像素绘制,然后我 bitblt 到 DC。我很好奇。 CreateDIBSection 的底层数据结构是怎么回事? BITMAPINFO 结构存储屏幕/客户端的宽度高度。然后是 VOID **ppvBits,处理 24 位颜色。那么这一切都可以看作是一个 3D 数组吗?类似的
int 像素[高度][宽度][颜色]?
我问的原因是这个CreateDIBSection() 函数非常非常快,但是如果我创建一个类似的 (900*1800*(246*256*256)) 数组,它真的很慢。
微软是如何如此快速高效地获得这种方法的?我什么都试过了。 Int*** 指向指针的指针,int*** malloc,尝试过NEW 等,它们在大型数组上都非常慢。我只是好奇如何构建一个性能也很好的 3D 数组。有什么想法吗?
我需要一个大约 20000x1800x100000 的数组。 CreateDIBSection() 快速存储,没有问题。但是标准的 C/C++ 动态数组呢?
我需要将CreateDIBSection() 和BITMAPINFO 中的内容存储在第二个数组中。
【问题讨论】:
-
你到底在说什么“真的很慢”?分配?以某种方式使用内存?除了在某些特殊情况下(例如 DirectX 从视频复制到系统 RAM),内存通常是内存 - 无论是由
CreateDIBSection还是由malloc分配的。 -
您分配的内存过多。一个类似的数组将是 900*1800*3,因为对于每个像素,您有 3 个字节(如果您有 alpha,则为 4 个字节,加上每行末尾的一些字节用于对齐)。它不是 3D 数组,而是颜色值的 2D 数组。
标签: c++ winapi createdibsection