【问题标题】:How do you draw individual pixels on the iPhone?如何在 iPhone 上绘制单个像素?
【发布时间】:2011-02-22 09:52:14
【问题描述】:

我有兴趣制作一个依赖像素、绘图的游戏 每个像素一次一个。

但是我很难找到准系统源代码 展示如何做到这一点。一切都要经过OpenGL吗?

我知道 devkit 中有一个样本,但它没有绘制 1 个像素,它绘制了一个大 圆,我需要 1 个像素映射。

是否有一个准系统样本允许简单的手指注册 输入并在您点击屏幕的位置绘制 1 个像素?

【问题讨论】:

  • @sabby:不,没必要。请不要发布错误信息。

标签: iphone opengl-es core-graphics pixel


【解决方案1】:

将原始像素绘制到屏幕有两种常用方法:使用 OpenGL ES 进行渲染或使用 Quartz 2D 进行绘制。两者各有优缺点。

在进行大量显示更新时,OpenGL ES 将为您提供最佳的绘图性能。您可以查看 Apple 的 GLPaint sample application,了解如何使用 OpenGL ES 进行手指驱动绘画的示例。如果需要,您甚至可以将该示例中使用的画笔修改为只有一个像素宽。

但是,OpenGL ES 使用起来可能很复杂,并且需要大量代码来完成您想要的绘图,即使是二维的也是如此。您可以参考问题Learning OpenGL ES 1.x 获取资源以帮助您了解这些 API。

Quartz 2D 绘图对于定期更新的内容要慢得多,但它可能比 OpenGL ES 更容易上手。 Quartz 2D 基于矢量图形,因此它并不是真正打算成为逐像素渲染框架。在我对this question 的回答中,我给出了一些关于这个框架的教程的提示。

第三种选择可能不像这两个那样简单,它是创建一个 UIImage 并手动更改其像素以响应绘图操作,并在每次更改后重新显示图像。同样,您将遇到与使用 Quartz 2D 相同的性能缓慢问题。有关这方面的更多信息,请参阅this question 中发布的答案。

【讨论】:

  • 好的,我实际上是从 GLPaint 示例开始的。但是对于我的生活,即使在更改像素宽度之后,我也无法让它绘制 1 个像素。它要么是不可见的,要么最终没有绘制屏幕的某些区域。另外,我查看了这个示例使用的框架,它使用了很多更高级别的框架。 OpenGL不是可能的最低层吗?如果是,添加这些框架最终会减慢速度。是否有一个准系统示例可以通过点击在最低层绘制 1 个像素?即使使用 GlPaint,还需要更改哪些内容?我试过了,不行
【解决方案2】:

为此,您需要使用线条绘制功能,因为线条是逐像素绘制的,您可以为此打分,这是我为您做的。

    UIGraphicsBeginImageContext(self.view.frame.size);
[testImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound);
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 5.0);
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 12.0, 0.0, 20.0, 14.0);
CGContextBeginPath(UIGraphicsGetCurrentContext());
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), 2, 5);
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), 2, 5);
CGContextStrokePath(UIGraphicsGetCurrentContext());
testImage.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();


    UIGraphicsBeginImageContext(self.view.frame.size); //you can put here testimage to get the image only
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];

UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);

这也会将图片保存在手机的图片库中。 希望这会对你有所帮助。

【讨论】:

    【解决方案3】:

    Quartz2D 很慢。速度极慢,尤其是在 3G 和 iPod touch 2G 等设备上(我说的是几乎 1 - 5 fps 的性能)

    OpenGL 在 iPhone 上比 Quartz2D 更快。

    这些是要遵循的步骤

    1. 将投影设置为正交以匹配屏幕分辨率。 glOrtho,宽度和高度为 480,320。 (这不是绝对必要的)
    2. 创建一个包含您需要绘制的所有像素的数组。
    3. 确保 glPointSize 设置为 1.0f
    4. 使用 GL_POINTS 参数调用 glDrawArrays。
    5. 您还可以使用颜色缓冲区为每个像素赋予不同的颜色。

    【讨论】:

    • 谢谢,但你在我前面。我刚刚开始,我正在查看 GLPaint 示例。我无法更改该代码以使其绘制 1 个像素。有时什么都没有显示,当我将它调整到可以显示的最低值时,某些区域永远不会被绘制。该示例中的 glOrtho 设置是否不正确?
    • GLPaint 示例使用纹理进行绘制,并且它不会每帧调用 glClear。您可以尝试用另一个大小为 2x2 和纯白色且没有透明区域的纹理文件替换该纹理文件,然后尝试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多