屏幕绘图上的像素非常快

Very fast pixel on screen drawing

我的一个朋友不得不在 c 中用 opengl 画一个 mandelbrot。我决定在 Swift 内完成。

我尝试的第一种方法是创建一个包含 ARGB 数据的数组并将其转换为 CGImage 并在 UIImageView 中查看该数组。然而,这还不够快。

现在我想知道,将单个像素绘制到屏幕上的最快方法是什么。我研究了 Metal,但那似乎主要是关于三角形和 3d 的东西。然后我来到 scenekit 着色器 (.fsh) 并认为这可能是一个很好的解决方案。但是我也希望能够放大 mandelbrot 分形,但我找不到在我的 mandelbrot 中输入变量的方法(我的参考资料:https://www.weheartswift.com/fractals-xcode-6/

你们能告诉 me/give 一个例子(Swift 请)关于绘制单个像素的最快方法,或者至少是一种无需使用任何东西就可以将原始像素绘制到屏幕上的方法中级喜欢编写 CGImage?

如果您想在 GPU 上计算分形,那么这更像是一个 OpenGL(或 Metal)问题,而不是 Swift 问题。您需要采取更小的步骤:

  1. 使用 OpenGL 在屏幕上获取纯色三角形。
  2. 用两个纯色三角形填充屏幕。
  3. 使用片段着色器用简单的渐变填充三角形。
  4. 用简单的纹理填充三角形。
  5. 执行两阶段绘制:绘制到屏幕外缓冲区(使用三角形和着色器),然后使用该缓冲区作为纹理在屏幕上绘制。
  6. 使用着色器将分形绘制到屏幕外缓冲区中。

请注意,第 6 步可能很难,您可能需要帮助,但在您成功完成第 1-5 步之前,即使开始它也没有任何意义。您应该能够找到很多教程来帮助您完成步骤 1-5,尽管您可能必须将它们从 C、C++ 或 Objective-C.

转换为 Swift

您链接的页面完全跳过了第 1-5 步,因为 Xcode 场景查看器会为您处理这些步骤。如果您想编写一个独立的应用程序,则需要学习如何执行这些步骤。

与其使用顶点着色器和片段着色器,不如看看使用内核函数(或计算着色器)。这将是一个单一的着色器,它进行数学运算并在纹理的每个像素处设置颜色值。然后,您可以使用 CAMetalLayer 将纹理渲染到屏幕。

看看这个博客post,我在其中使用传递到内核函数的粒子坐标写入纹理:http://flexmonkey.blogspot.co.uk/2015/03/swift-metal-four-million-particles-on.html