我试图用值手动填充一维纹理 ,并将纹理传递给计算着色器(这些是我想通过代码设置的2个像素,它们不代表任何图像)。 由于目前less量的金属例子,我能find的所有例子都处理2D纹理 ,通过将加载的UIImage转换为原始字节数据来加载纹理,但是创build一个虚拟UIImage对我来说就像是黑客。 这是我开始的“天真”的方式 – … var manualTextureData: [Float] = [ 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0 ]; let region: MTLRegion = MTLRegionMake1D(0, textureDescriptor.width); myTexture.replaceRegion(region, mipmapLevel: 0, withBytes: &manualTextureData, bytesPerRow: 0); 但是Metal没有在着色器中识别这些值(除了第一个值,它会得到一个空的纹理)。 我很快意识到,浮点数组可能必须转换成一个字节数组(例如UInt8 ),但无法find一种方法从[Float]转换为[UInt8] 。 我考虑的另一个可能的select是使用一个CVPixelBuffer对象,但是这也是解决问题的办法。 那么最好的解决方法是什么? 提前致谢。 请注意,我不熟悉Objective-C ,因此我不确定使用CVPixelBuffer / UIImage是否夸大了某些应该是直截了当的事情。
作为这个答案的后续问题。 我试图用一个在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完成?
我正在寻找最快的方式来解码iPhone上的本地mpeg-4video帧。 我只是感兴趣的像素在每10帧的亮度值。 我不需要在任何地方渲染video。 我试过ffmpeg,AVAssetReader,ImageAssetGenerator,OpenCV和MPMoviePlayer,但它们都太慢了。 我能得到的最快速度是2倍(一分钟内扫描2分钟的video)。 我想要更接近10倍的东西。 假设我上面的尝试没有使用GPU,是否有任何方法来完成我的目标与GPU上运行的东西? OpenGL似乎主要是为渲染输出,但我已经看到它用作传入video的filter。 也许这是一个select? 提前致谢!