我有一个轮廓图渲染程序,它快速炽热。它基本上渲染到OnPaint事件中的一个表单,并且非常快速地更新...基本上和移动鼠标一样快。我很高兴。它基于这篇论文:
http://paulbourke.net/papers/conrec/
然而,我把它移植到Android / Java并且针对一个非常快的平板电脑(Nexus 9)而且它的速度非常慢,我觉得我必须使用错误的方法。基本上我:
1)以编程方式创建视图, 2)实现onDraw方法来调用我的cContourPlot类的Draw方法,其中 3)迭代2-D数据阵列,比较1-D" bins"数组,并对" DrawPolygonRegion"进行几千次调用。我在下面写的功能。
这需要花费相当长的时间,比.NET慢大约100倍,直到我想知道我是否做错了。具体问题:
a)功能是否低于速度可调?绘制多边形比使用Path更快吗? (在.NET中有一个DrawPolygon函数,不得不为Android端口创建新东西) b)我是否需要做一些事情"批次"我的渲染命令?如(想象:) Canvas.SuspendUpdates,Canvas.ResumeUpdates? c)我需要激活双缓冲还是什么?我的快速研究表明,这是在Android中自动完成的,但不确定。 (我不得不在.NET中激活它,但不确定我是否必须在这里)
非常感谢您提供任何见解/帮助。
void DrawPolygonRegion(Canvas c, int color, double ... p)
{
int length = p.length;
if (length >= 6)
{
paint.setColor(color);
paint.setStyle(Style.FILL);
Path path = new Path();
path.moveTo((float) p[0], (float) p[1]); // used for first point
path.lineTo((float) p[2], (float) p[3]);
path.lineTo((float) p[4], (float) p[5]);
int idx = 6;
for (int n=6; n<length; n+=2)
{
path.lineTo((float) p[n], (float) p[n+1]);
}
c.drawPath(path, paint);
}
}
答案 0 :(得分:4)
召唤这几千次。哦,是的,你遇到了一些问题。
1)它分配一个新路径。分配在Android上迅速增加。尽量避免它们。更喜欢重用对象,特别是在像onDraw这样的函数中。
2)你真的不应该一直创造整个路径 - 他们最好保存并在追加模式下重复使用。
3)从double到float的向下转换不是免费的。避免它
4)你是直接在屏幕画布上做的吗?唐&#39;吨。在自己的线程中对位图画布执行此操作,并将结果blit到屏幕画布。
我真的怀疑这个代码在具有更好处理器和RAM的PC上即使在.NET中也非常快速。我认为你的屁股是通过硬件加速来拯救的。