2012-10-22 97 views
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调用创建一个float数组(一个用于getX(),另一个用于getY())。假设我在屏幕上有很多元素,这可能会导致内存和性能的影响。

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

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

回答

2

看来,确实这两种解决方案必须结合一个完美的方式。

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

的综合结果将是如下:

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

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

1

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

#2是有趣的方式。从长远来看,它肯定会给你更多的权力和灵活性。另外,你也许可以将两者结合起来。还有#3:当你说可绘制元素时,如果你使用的是Android Drawables,你可以创建一个自定义的Drawable类。

我不认为有这样做

+1

我发表了我的研究成果。我无法从你的答案中得到任何新东西,但我赞扬你的努力。 – WarrenFaith