Tag: 金属

为iOS Metal中的MTLBuffer使用的数据分配内存

作为这个答案的后续问题。 我试图用一个在Metal中的内核函数replaceCPU上运行的for-loop来并行化计算并加速性能。 我的function基本上是一个卷积。 由于我反复接收到我的input数组值的新数据(数据来自AVCaptureSession ),似乎使用newBufferWithBytesNoCopy:length:options:deallocator:是创buildMTLBuffer对象的明智选项。 这是相关的代码: id <MTLBuffer> dataBuffer = [device newBufferWithBytesNoCopy:dataVector length:sizeof(dataVector) options:MTLResourceStorageModeShared deallocator:nil]; id <MTLBuffer> filterBuffer = [device newBufferWithBytesNoCopy:filterVector length:sizeof(filterVector) options:MTLResourceStorageModeShared deallocator:nil]; id <MTLBuffer> outBuffer = [device newBufferWithBytesNoCopy:outVector length:sizeof(outVector) options:MTLResourceStorageModeShared deallocator:nil]; 当运行这个我得到以下错误: 失败的断言`newBufferWithBytesNoCopy:指针0x16fd0bd48不是4096字节alignment。 现在,我没有分配任何内存,但是(为了testing目的)只是创build一个固定大小的浮动数组并填充随机数。 所以我的主要问题是: 如何以正确的方式分配这些浮点数组,以满足以下要求 该值必须导致页面alignment的内存区域。 另外,还有一些问题: 用newBufferWithBytesNoCopy方法创buildMTLBuffer还是复制数据在性能方面并不是一个真正的问题? (我的实际数据将包含每个video帧大约43'000浮点值。) MTLResourceStorageModeShared是否正确selectMTLResourceOptions API参考说 返回的新MTLBuffer对象的存储分配与指针input值相同。 现有的内存分配必须由单个VM区域覆盖,通常由vm_allocate或mmap分配。 由malloc分配的内存被明确禁止。 这是否仅适用于输出缓冲区,或者与MTLBuffer一起使用的所有对象的存储分配是否不能用malloc完成?

从CVImageBuffer保持MTLTexture导致口吃

我使用MTLTexture从CVImageBuffer (从相机和播放器)创build一个MTLTexture ,获取CVMetalTexture ,然后使用CVMetalTextureGetTexture获取MTLTexture 。 我看到的问题是,当我稍后使用Metal渲染纹理时,偶尔会看到video帧呈现不规则(视觉上来回拖尾),大概是因为CoreVideo正在修改底层CVImageBuffer存储,而MTLTexture只是指着那里。 有没有什么办法让CoreVideo在触发该缓冲区之前使用另一个,直到我释放MTLTexture对象? 我目前的解决方法是使用MTLBlitCommandEncoder纹理,但因为我只需要坚持纹理约30毫秒,这似乎是不必要的。

这个代码是在点还是像素级绘制的? 如何绘制视网膜像素?

考虑这个绘制(循环)渐变的令人钦佩的脚本, https://github.com/paiv/AngleGradientLayer/blob/master/AngleGradient/AngleGradientLayer.m int w = CGRectGetWidth(rect); int h = CGRectGetHeight(rect); 接着 angleGradient(data, w, h .. 它循环所有这些 for (int y = 0; y < h; y++) for (int x = 0; x < w; x++) { 基本上设置颜色 *p++ = color; 但等等 – 这不是由点,而不是像素 ? 真的,你会如何画密集屏幕上的物理像素? 这是一个问题: 假设设备上的密度是4。 就像在上面的代码中绘制一样,但是,在一个四倍大的位图上,然后把它放在矩形中? 这似乎是凌乱 – 但是呢?