绘制非常大的图形上下文的最佳实践

Posted

技术标签:

【中文标题】绘制非常大的图形上下文的最佳实践【英文标题】:Best practices drawing onto a very large graphics context 【发布时间】:2011-12-17 09:50:11 【问题描述】:

我需要绘制一个非常非常宽的上下文(可能会进入 100,000 像素的宽度)

我画的东西很简单(特别是直线、椭圆和圆弧)。

目前,我正在使用平铺机制将此图像的片段呈现为位于 UIScrollView 中的 UIWebViews 中的 SVG 图形。可怕,我知道。性能太差了,让我想伤害自己。

所以我别无选择,只能直接在 Quartz 中绘制。问题是我找不到任何关于处理这么大的图纸的好信息。

命令将存储在一个数组中(即 [0] - 从 x1,x2 到 y1,2 [2] 的行 - x1,x2,h,v 等处的弧...),这使得可以立即确定在任何时间点需要绘制的内容。

我应该如何最好地处理实际绘图?制作一个巨大的上下文,然后在上面绘制,擦除屏幕外的部分?我可以直接在 UIScrollView 中绘制吗?

或者我应该执行某种平铺?创建较小的视图并在其上绘图?

【问题讨论】:

【参考方案1】:

查看CATiledLayer。它支持巨大的尺寸,但只绘制可见的“瓷砖”。这意味着在您的drawLayer:inContext: 中,您需要计算如何绘制您被要求绘制的图块。这可能实现起来相当复杂,但性能提升弥补了这一点。我用它来绘制一个通常超过 20.000 像素宽的“条”,平铺成 256 像素块(这是默认设置)。

您想要这个不仅是因为速度,还因为内存:如果您真的有一个那么大的视图或图层,它将占用大量内存。平铺是这里唯一的解决方案。

请参阅this nice article by Michael Heyeck 了解如何使用 CATiledLayer(Apple 也有演示,但我认为链接的文章更好)。

【讨论】:

太棒了!这听起来正是我需要的。【参考方案2】:

如果您正在绘制的东西不是静态的,那么使用 CATiledLayer(s) 就不能很好地工作。 http://www.mlsite.net/blog/?p=1342 部分提供了更好的解决方案。我用它作为一些交互式绘图的基础。有点慢,但我仍在优化。使用http://red-glasses.com/index.php/tutorials/catiledlayer-how-to-use-it-how-it-works-what-it-does/ 作为是否应该使用 CATiledLayer(s) 的检查列表。

【讨论】:

以上是关于绘制非常大的图形上下文的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Android 涂鸦最佳实践

业务数据可视化的6个最佳实践

OnPaint、Invalidate、Clipping 和 Regions 的最佳实践

Canvas 最佳实践总结2021

Canvas 最佳实践总结2021

需要很长时间才能打开的基于文档的核心数据应用程序的最佳实践