Swift 非常快速的屏幕像素绘制

Swift 非常快速的屏幕像素绘制,swift,shader,mandelbrot,Swift,Shader,Mandelbrot,我的一个朋友不得不用c语言的opengl绘制一个曼德尔布罗特。我决定用斯威夫特 我尝试的第一种方法是使用ARGB数据创建一个数组,并将其转换为CGImage,然后在UIImageView中查看该数组。然而,这还不够快 现在我想知道,在屏幕上绘制单个像素的最快方法是什么。我看了看金属,但那似乎主要是关于三角形和3d的东西。然后我来到scenekit着色器(.fsh)并认为这可能是一个好的解决方案。然而,我也希望能够放大mandelbrot分形,我找不到在mandelbrot中输入变量的方法(我的参

我的一个朋友不得不用c语言的opengl绘制一个曼德尔布罗特。我决定用斯威夫特

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

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


你们能告诉我/举个例子(请用Swift)用最快的方法画单个像素,或者至少用一种方法把原始像素画到屏幕上,而不必使用像合成CGImage这样的中间工具吗?

如果你想在GPU上计算分形,那么这更像是一个OpenGL(或金属)问题比快速的问题更重要。您需要采取更小的步骤:

  • 使用OpenGL在屏幕上获得纯色三角形
  • 用两个纯色三角形填充屏幕
  • 使用片段着色器使用简单渐变填充三角形
  • 用简单的纹理填充三角形
  • 执行两阶段绘制:绘制到屏幕外缓冲区(带有三角形和着色器),然后使用该缓冲区作为纹理在屏幕上绘制
  • 使用着色器将分形绘制到屏幕外缓冲区
  • 请注意,第6步可能很难,您可能需要帮助,但在您成功完成第1-5步之前,甚至启动它都没有意义。你应该能够找到很多教程来帮助你完成步骤1-5,尽管你可能需要从C、C++或Objul-C.</P>将它们翻译成SWIFT。
    您链接的页面完全跳过步骤1-5,因为Xcode场景查看器会为您处理这些步骤。如果你想编写一个独立的应用程序,你需要学习如何执行这些步骤。

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


    请看这篇博客文章,其中我使用传递到内核函数的粒子坐标来编写纹理:

    为什么您认为绘制CGImage很慢?你用你的代码运行仪器了吗?你到底发现了什么?你想在GPU上计算分形样本(使用OpenGL着色器)吗?或者您想在CPU上计算它们(使用Swift)并快速绘制它们?您是每次计算像素时都创建一个新的
    CGImage
    ,还是在计算所有像素后创建一个
    CGImage
    ,还是介于两者之间?@matt这是一个解决办法,因为我找不到更直接的方法在屏幕上绘图,我还必须在内存中创建一堆像素,所以我认为它确实比较慢。@robmayoff我认为使用GPU要快得多,所以我宁愿在GPU上完成,我也认为这样的任务应该在GPU上完成。我在最坏的情况下为每一帧创建了一个图像“假设”?你知道那值多少钱。我建议计算速度慢,但像素的绘制速度慢。好吧,那么最终我会得到一个屏幕,屏幕上有两个三角形,它们一起填充整个屏幕,并且有相同的着色器,总的来说渲染mandelbrot?如果这是我应该做的,我会尝试按照你的指导步骤做。谢谢,这看起来像是一个令人惊奇的更多知识的来源:)我会在有时间的时候深入研究的!