5

我正在开发一个小型库作为某些应用程序的基础。当我即将创建一个场景图(2D)时,我想知道从性能、可维护性、易用性等角度来看,以下哪种方法看起来更有前途。

  1. 我可以给每个可绘制元素一个矩阵,我可以在其中执行平移、旋转等操作。
  2. 我可以在画布上而不是元素上做所有事情。

第一个解决方案有一个缺点:对于像圆这样的原始元素,我无法在绘图调用中传递矩阵,我必须像这样访问矩阵中的翻译值:

private float get(int index) {
    final float[] values = new float[9];
    getValues(values);
    return values[index];
}

public float getX() {
    return get(Matrix.MTRANS_X);
}

public float getY() {
    return get(Matrix.MTRANS_Y);
}

因此,在每次绘制调用中,我为每个 getter 调用创建一个浮点数组(一个用于 getX(),一个用于 getY())。假设我在屏幕上有很多元素,这可能会导致内存和性能影响。

第二种方法有“消极”思维的缺点。如果我想在点 100/100 绘制一个元素,我必须将画布转换为 -100/-100,就像在 0/0 上绘制一样。如果我在那之后恢复画布,结果将是元素被绘制在想要的 100/100 上。我不确定这种消极的想法是否会对代码的可维护性和理解度造成严重影响(甚至从未开始考虑通过简单地忘记否定某些东西来引入错误......)。

有人有提示应该首选哪种方式?

4

2 回答 2

2

似乎确实必须将两种解决方案结合起来。

我对第二种方法的假设是完全错误的。如果我将一个元素转换为 100/100,则原点将更改为 100/100。当然,这同样适用于画布。消极的想法对我来说完全是胡说八道。

合并后的结果如下:

  1. 每个将被绘制的元素都有自己的矩阵,其中包含旋转、平移和缩放。
  2. 画布将通过 保存save(),使用提供的方法concat(Matrix matrix)可以应用元素的矩阵。绘图将完成,画布将恢复restore()
  3. 每个作为其他可绘制元素的父元素的可绘制元素将循环遍历子元素并以相同的方式保存、连接和恢复。

这使得 2D 场景图的实现无需任何大的实现工作。

于 2012-10-24T18:11:17.510 回答
1

出于性能原因,使用内部矩阵方法可能更快,因为它允许库自动进行硬件加速,如果您正在这样做的话。再说一次,我不完全确定它是否会被硬件加速。

#2是有趣的方式。从长远来看,它肯定会给你更多的力量和灵活性。此外,您也许可以将两者结合起来。

还有#3:当你说drawable元素时,如果你使用Android Drawables,你可以创建一个自定义的Drawable类。

我认为没有完美的方法可以做到这一点

于 2012-10-23T19:59:59.660 回答