【问题标题】:SVG conversion - efficient way to store Path, Paint and Matrix objects?SVG 转换 - 存储路径、绘画和矩阵对象的有效方法?
【发布时间】:2011-08-13 06:45:03
【问题描述】:

在我的 Android 应用程序中,我创建了一个 SVG 图像转换器类。它解析 SVG XML 数据并将其转换为适当的 Path、Paint 和 Matrix 对象,然后可以将其应用于 Canvas。使用这个类,我实现了一个 View,它使用我的 SVG 转换器类在屏幕上绘制我在 Inkscape 中生成的图像。到目前为止,一切都很好。 (我很欣赏编写自己的 SVG 转换器可以被视为轮子的重新发明,考虑到它以前已经完成,但对我来说,这是我第一个 Android 应用程序中的一个有用的学习练习,希望能给我一些额外的灵活性。)

使用 SVG 的目的是让我可以快速轻松地创作各种图形仪表设计。每个仪表通常由只需要绘制一次的图形部分(例如仪表面和图例)以及定期更新的图形(指针角度、数值文本)组成。

目前我的仪表视图效率不是很高,因为每次调用 onDraw() 时,都会调用我的 SVG 类来遍历整个 SVG 文件以生成画布的所有矢量数据。

我想做的是对矢量数据进行一些中间存储,以便 SVG XML 文件只需要解析一次。因此,我认为 View 可以在第一个 onDraw() 上从 SVG 文件延迟初始化自身,然后将所有生成的 Paths、Paint 和 Matrix 对象存储到各种列表中。然后,在随后的每个 onDraw() 中,我只是将它们从 List(s) 中拉出并在 Canvas 上嘎嘎作响。

这样做的另一个优点是使用单独的列表来存储“移动”的矢量图形部分,例如仪表指针。我想通过为 Inkscape 中代表指针的路径组分配一个特定的“魔术”ID 来做到这一点;然后 SVG 解析器类将识别出这个单独的组需要单独存储到“静止”图形中。然后,每当我需要根据测量数据刷新指针的角度时,View 只会对那一堆矢量数据应用旋转变换。实际上,我正在考虑这样做,以便在子视图中实际绘制移动指针图形,以便在必须刷新指针时仅重绘子视图。

所有这一切的最终目标是:我(甚至可能是用户)可以启动像 Inkscape 这样的矢量成像程序,并快速生成一个新设计的仪表小部件。我嵌入了一些元数据来指示图形的哪些位必须根据测量数据进行操作。

与其要求解决这样的问题,我想听听关于我在这里所做的事情的意见,以及我所提议的是否可以以更优化的方式完成。缓存 Path 和 Paint 对象组是否会导致内存效率非常低?

此外,一旦它足够好(!)如果有人觉得它有用,我很乐意在某个地方发布我的 SVG 类。

【问题讨论】:

    标签: android svg


    【解决方案1】:

    实施和衡量! 从简单的方法开始——将解析后的矢量数据存储在内存中的列表中。如果内存使用和渲染速度是可以接受的:问题解决了。 如果没有,请尝试其他方法并测量。一些想法:

    • 解析 SVG 一次,渲染一次位图,重复使用位图
    • 将 SVG 渲染为构建过程的一部分,使用应用传送光栅位图

    除了最简单的情况外,我们不太擅长评估特定技术的效果。因此流行的说法是过早的优化是万恶之源

    【讨论】:

    • 感谢您的意见。我最近在这个 SVG 转换器上做了更多的工作,现在我正处于解析 SVG 图像作为矢量数据存储在内存中的阶段,并且可以多次渲染到 Canvas。
    猜你喜欢
    • 2014-10-25
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 2020-10-14
    • 2021-02-27
    相关资源
    最近更新 更多