如何快速创建 Pixel_8 缓冲区

Posted

技术标签:

【中文标题】如何快速创建 Pixel_8 缓冲区【英文标题】:How to create a Pixel_8 buffer in swift 【发布时间】:2017-04-08 11:38:52 【问题描述】:

我正在尝试在 swift 中转换 Objective-c 代码,但我完全无法在快。

这是Objective-c中的一个例子......它如何转换为swift?

Pixel_8 *buffer = (Pixel_8 *)calloc(width*height, sizeof(Pixel_8)); 

【问题讨论】:

你用这种方式试过var buffer: Pixel_8? = (calloc(width * height, MemoryLayout<Pixel_8>.size) as? Pixel_8)var buffer = (calloc(width * height, sizeof(Pixel_8)) as! Pixel_8) 【参考方案1】:

您可以在 Swift 中使用 calloc(),但您必须“绑定”原始数据 指向所需类型的指针:

let buffer = calloc(width * height, MemoryLayout<Pixel_8>.stride).assumingMemoryBound(to: Pixel_8.self)

// Use buffer ...

free(buffer)

或者:

let buffer = UnsafeMutablePointer<Pixel_8>.allocate(capacity: width * height)
buffer.initialize(to: 0, count: width * height)

// Use buffer ...

buffer.deinitialize()
buffer.deallocate(capacity: width * height)

但最简单的解决方案是分配一个 Swift 数组:

var buffer = [Pixel_8](repeating: 0, count: width * height)

这是自动进行内存管理的。您可以将buffer 传递给 任何期望 UnsafePointer&lt;Pixel_8&gt; 的函数,或 将&amp;buffer 传递给任何期望UnsafeMutablePointer&lt;Pixel_8&gt; 的函数。

【讨论】:

【参考方案2】:

尝试这种方式

声明

 typealias Pixel_8 = UInt8

swift3

var buffer: Pixel_8? = (calloc(width * height, MemoryLayout<Pixel_8>.size) as? Pixel_8)

swift2

  var buffer = (calloc(width * height, sizeof(Pixel_8)) as! Pixel_8) 

Apple API reference

【讨论】:

Pixel_8 已定义。无论如何,我收到了这个错误:Cannot convert value of type Pixel_8? to the expected argument type UnsafeMutableRowPointer!

以上是关于如何快速创建 Pixel_8 缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

[译]OpenGL像素缓冲区对象

像素缓冲区对象(PBO) 的Streaming-Texture上传 源码解析

原Java学习笔记023 - 字符串缓冲区_正则表达式

带有模板缓冲区 FBO 的延迟渲染器

用于 DMA 的快速映射内存缓冲区

Opengl_8_索引绘制