使用 Metal 绘制位图
Posted
技术标签:
【中文标题】使用 Metal 绘制位图【英文标题】:Draw bitmap using Metal 【发布时间】:2016-07-29 01:34:54 【问题描述】:问题很简单。在 Windows 上,您可以使用 BitBlt() 绘制到屏幕上。在 OS X 上,您通常可以使用 OpenGl,但如何使用 Apple 的新 Metal 框架将位图绘制到屏幕上?我在 Apples Metal 参考资料中找不到任何有价值的东西。 我现在正在使用 Core Graphics 进行绘图部分,但由于我的位图一直在更新,我觉得我应该转向 Metal 以减少开销。
【问题讨论】:
这就是为什么我们需要“缺乏最低限度的理解”回来 没有理由必须使用 Metal 来绘制图像。-[NSImage drawInRect:]
会很好。
与 Metal 相比,NSImage 不是很慢吗?如果我每秒更新位图 30 次怎么办?我要求使用 Metal,因为我想使用 Metal。
@user148013 你每秒更新 30 次的图像有多大?
500 x 800 像素。但我可以毫无问题地增加尺寸。我只是想尽可能少地在屏幕上绘制。
【参考方案1】:
非常简短的回答是:首先,您需要使用 Metal 设置标准渲染管道,如果您对渲染管道一无所知(注意:但这可以通过以下方式简化)通过渲染具有两个三角形的四边形来避免 3D 的东西,只需为顶点提供 xy 坐标)。 Apple 提供了很多示例代码,展示了如何设置标准渲染管道,最简单的可能是 MetalImageProcessing,因此您可以将其剥离(即使使用的计算着色器绘制起来过于复杂,您也会想要用它代替标准的顶点和片段着色器)。
其次,您需要了解顶点和片段着色器的工作原理以及如何使用它们绘制东西,请参阅 shadertoy。
刚刚注意到用户的最后评论,如果您有一个表示图像的字节数组,那么您可以从中制作一个 MTLTexture 并将其渲染到屏幕上,请参见上面的 Apple 示例,但将计算着色器更改为标准顶点和片段着色器以获得更快的性能。
【讨论】:
感谢您的回复!这会比使用 CoreGraphics 更快吗?假设我每秒重绘位图 60 次,并且它很大并且也用于全屏。否则我就不需要走这条更复杂的路了。 是的,它在设置时会比 CoreGraphics 更快,你可以使用 Metal 在大约 1-3 毫秒内渲染一个 1080p 纹理,因此它可以轻松地以 60fps 运行,但不管是不是这样去取决于多个因素,主要关心你在画什么,你是如何画的,你可以多快为 GPU 准备它(MTLTexture)或者你是否想使用着色器(这可能很尴尬),在后一种情况你基本上有 x y 坐标,你所有的绘图都必须是纯数学,没有你在 CoreGraphics 中找到的方便的函数。 一个很好的问题和一个答案。我也在考虑迁移到 Metal(在 Mac 上 - 我的代码中支持一些平台),因为 CG 花了很多时间在 Windows 上应该是简单的 blit 上(大约需要 3 毫秒)在我的机器上 blit 4K 图像 - 一个古老的 i5 IvyBridge)。以上是关于使用 Metal 绘制位图的主要内容,如果未能解决你的问题,请参考以下文章