androidplot 1.4.3使用JNI getY(idx)访问重新绘制运行时分析 我在一个Nexus 7中用XY函数(简单的合成正弦波)来评估一个6 XYSRANS绘图设置(500 x轴采样)的运行时性能,并将其与JNI GTEY(IDX)为基础的设置进行比较,JNI C++代码简单地从JNI胶囊内的缓冲区中取出数据。

androidplot 1.4.3使用JNI getY(idx)访问重新绘制运行时分析 我在一个Nexus 7中用XY函数(简单的合成正弦波)来评估一个6 XYSRANS绘图设置(500 x轴采样)的运行时性能,并将其与JNI GTEY(IDX)为基础的设置进行比较,JNI C++代码简单地从JNI胶囊内的缓冲区中取出数据。,android,androidplot,Android,Androidplot,以下是合成正弦波生成的简化设置(示例显示一个XYSeries) 垂直滚动将启动循环,并定期调用DatUpd()函数 public static long Tstart, Tsum ; public synchronized void DataUpd () { LogI (String.format ("sum %d", (System.nanoTime () - Tstart) / 1000)) ; DataY_0.DatCnt = 500 ; DataY_1.DatCnt =

以下是合成正弦波生成的简化设置(示例显示一个XYSeries)

垂直滚动将启动循环,并定期调用DatUpd()函数

public static long Tstart, Tsum ;

public synchronized void DataUpd ()
{

  LogI (String.format ("sum %d", (System.nanoTime () - Tstart) / 1000)) ;

  DataY_0.DatCnt = 500 ;
  DataY_1.DatCnt = 500 ;
  DataY_2.DatCnt = 500 ;
  DataY_3.DatCnt = 500 ;
  DataY_4.DatCnt = 500 ;
  DataY_5.DatCnt = 500 ;

  Tstart = System.nanoTime () ;
  Tsum   = 0 ;

  Plot.redraw () ;
}
“dat3 25299 110229”显示每个系列的exex时间(dat0-dat5),而第一个数字是从x数据0到500的单个时间累积,第二个是运行时间计数。。。dat3系列为25299美元,dat0至dat3系列为110299美元,依此类推。。。每个ZYSeries的平均数据获取时间约为25 ms

总计272247 us是从第一次DatUpd()调用到滚动操作中的下一次调用的时间。。。我不知道情节重画过程何时完成

所有6个XYSeries的总getY(idx)数据获取时间为159576 us,总重画周期时间为272247 us。。。272247-159576=112671美国

当然,我不知道112671us剩余时间(在提取时间之后)的百分比,这是androidplot时间,这是滚动手势处理

现在到C++的JNI设置时间< /P>
06-04 17:09:39.783 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onDown x_1620 y_497
06-04 17:09:39.881 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onScroll x_16
06-04 17:09:39.882 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: sum 25543273
06-04 17:09:39.947 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: rdif  36865  36865
06-04 17:09:39.995 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: rpm   36956  73822
06-04 17:09:40.032 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: tdif  36224 110046
06-04 17:09:40.085 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: ext0  42205 152252
06-04 17:09:40.138 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: ext1  41778 194030
06-04 17:09:40.202 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: raw2  53955 247985
06-04 17:09:40.226 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onScroll x_724
06-04 17:09:40.226 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: sum 344085
06-04 17:09:40.293 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: rdif  36956  36956
06-04 17:09:40.341 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: rpm   36651  73608
06-04 17:09:40.377 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: tdif  36315 109924
06-04 17:09:40.429 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: ext0  40954 150878
06-04 17:09:40.481 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: ext1  40802 191680
06-04 17:09:40.534 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: raw2  41015 232696
06-04 17:09:40.555 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onScroll x_4
06-04 17:09:40.555 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: sum 329620
06-04 17:09:40.619 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: rdif  36712  36712
06-04 17:09:40.666 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: rpm   36499  73211
06-04 17:09:40.702 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: tdif  36163 109375
06-04 17:09:40.779 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: ext0  63323 172698
06-04 17:09:40.836 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: ext1  42266 214965
06-04 17:09:40.888 4067-4067/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: raw2  41259 256225
比较:

累计提取时间为247985 us

正弦合成数据取平均25毫秒/级数,而C++ JNI数据取约40 ms。比正弦波合成示例长15 ms,增加60%

getY(idx)合成正弦波产生时间部分的百分比未知,从一个getY(idx)到下一个getY(idx)的androidplot内发生的其他情况也未知

25 ms/500 x-样本等于50 us,15 ms/500 x-样本等于30 us。。。假设正弦计算不能占用50个us中的大部分,我会说一个getY(idx)调用处理,不计算数据获取可能需要40到45个us

< 30 C++的JNI数据取取时间不是闪电般快,而是我必须要忍受的东西…30 us*500*6=90毫秒,仅用于整个数据提取部分。。。如果重新绘制不需要任何时间,我可以每秒做10次

我使用FastLineAndPointRenderer.Formatter设置

public static FastLineAndPointRenderer.Formatter LineFormat (int color, int width, int dash, int spc)
{
  Paint paint = new Paint () ;
  paint.setColor (color) ;
  paint.setStyle (Paint.Style.STROKE) ;
  paint.setAntiAlias (false) ;
  paint.setStrokeWidth (PixelUtils.dpToPix (width)) ;
  paint.setPathEffect (new DashPathEffect (
                       new float [] { PixelUtils.dpToPix (dash), PixelUtils.dpToPix (spc) }, 0)) ;

  FastLineAndPointRenderer.Formatter line = new FastLineAndPointRenderer.Formatter (paint.getColor (), null, null) ;
  line.setLinePaint     (paint) ;
  line.setVertexPaint       (null) ;
  line.setPointLabelFormatter (null) ;

  return line ;
}
请问,有谁能稍微了解一下我的设置并评论一下这篇文章吗

有没有一种方法可以加快速度,但仍然有500个x点。。。这就是QT在桌面设置中使用的东西,它的速度非常快

可以改进什么?我应该提供哪些其他信息


我希望我没有犯太多的错误;)

进行了更多的测试,将正弦合成图的x点从500降低到50,以下是数据

06-04 20:11:16.172 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onDown x_1464 y_562
06-04 20:11:16.407 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onScroll x_24
06-04 20:11:16.407 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: sum 46652130
06-04 20:11:16.442 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat0   2319   2319
06-04 20:11:16.471 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat1   2380   4699
06-04 20:11:16.512 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat2   2410   7110
06-04 20:11:16.549 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat3   2288   9399
06-04 20:11:16.580 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat4   2593  11993
06-04 20:11:16.610 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat5   2532  14526
06-04 20:11:16.650 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onScroll x_350
06-04 20:11:16.651 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: sum 243133
06-04 20:11:16.689 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat0   2288   2288
06-04 20:11:16.720 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat1   2319   4608
06-04 20:11:16.751 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat2   2288   6896
06-04 20:11:16.782 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat3   2685   9582
06-04 20:11:16.812 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat4   2319  11901
06-04 20:11:16.842 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat5   2410  14312
06-04 20:11:16.881 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onScroll x_46
06-04 20:11:16.881 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: sum 230346
06-04 20:11:16.915 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat0   2319   2319
06-04 20:11:16.944 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat1   2349   4669
06-04 20:11:16.973 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat2   2410   7080
06-04 20:11:17.002 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat3   2319   9399
06-04 20:11:17.033 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat4   2471  11871
06-04 20:11:17.064 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat5   2563  14434
06-04 20:11:17.116 26868-26868/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onScroll x_2
是的,与500个样本相比,50个样本的getY(idx)时间现在为2.5毫秒,而500个样本的getY(idx)时间为25毫秒

但重画烤饼的总时间仍然是240毫秒。。。为什么

下面是我的滚动函数,它是从一个基类继承的,只是调用它

protected boolean OnScroll (MotionEvent evt0, MotionEvent evt1, float dx, float dy)
{
  DataY.Offs += (dx * 50) / (mWidth - mWidth / 12) ; DataUpd () ;
  return true ;
}
我是不是在用卷轴处理情节时出错了

以前的计时值与500个x数据点有点匹配,但现在???在243毫秒内,getY(idx)只占用14毫秒,会发生什么。。。为什么滚动刷新频率没有增加


整个图形的滚动仍然像以前一样不稳定

就滚动特征而言,我没有一个深入的答案,但我想象操作系统中会出现某种消息循环/限制。您是否在没有重画调用的情况下测量了滚动回调,以了解滚动cb的最大理论频率

在任何情况下,加快渲染时间都会有所帮助,因此以下是一些一般性建议:

为了提高应用程序的性能,您能做的最大的事情可能就是使用
FastXYSeries
。这意味着要么使用您自己的,要么使用
SampledXYSeries
,这是唯一的“开箱即用”实现。我的建议是实施你自己的

为了从这种方法中获得最佳结果,还需要设置最小/最大y边界,并确保序列最小/最大y-VAL都位于该边界内。其思想是,对于绘制传入数据流的应用程序,可以保持观察到的最小/最大值的运行记录。
FastXYSeries
界面为Androidplot提供了一种查询这些值的方法,使其能够跳过在每个系列中迭代查找可见最小/最大VAL的非常昂贵的步骤

如果
FastXYSeries
不可行,那么除了
SimpleXYSeries
之外,使用几乎任何优化的
XYSeries
实现都将是一种改进,因为它是针对通用性而不是性能进行优化的。对于固定大小的动态绘图(就像您的一样)
fixedsizededitablexyseries
是一个特别好的选择

编辑:以下添加问题的更新

到目前为止,所有这些都是使用 格式化程序,它似乎并不关心 正在使用setInterpolationParams。。。既然我们 想快点吗

FastLineAndPointRenderer.Formatter line = new FastLineAndPointRenderer.Formatter (paint.getColor (), null, null) ;
line.setLinePaint       (paint) ;
line.setVertexPaint     (null) ;
line.setPointLabelFormatter (null) ;
line.setInterpolationParams (new CatmullRomInterpolator.Params (10, CatmullRomInterpolator.Type.Centripetal)) ;
正确(请在中注明)

有人想知道LineAndPointFormatter之间的区别 以及FastLineAndPointRenderer.Formatter,因为此设置提供 同样的时间

LineAndPointFormatter line = new LineAndPointFormatter (paint.getColor (), null, null, null) ;
line.setLinePaint       (paint) ;
line.setVertexPaint     (null) ;
line.setPointLabelFormatter (null) ;
有几个不同之处,但主要有两个: *每个渲染周期上新实例的最小实例化数。 *使用简单线段而不是路径绘制每个系列

肯定快多了。如果在基准测试中看不到差异,我必须假设基准测试不准确,或者在渲染周期的其他地方存在瓶颈。一吨
dat0   2349   2349
dat1   2258   4608
dat2   2716   7324
dat3   2624   9948
dat4   2258  12207
dat5   2471  14678
sum 69396
rdif   3936   3936
rpm    4150   8087
tdif   3784  11871
ext0   4058  15930
ext1   4089  20019
raw2   4150  24169
sum 74432
FastLineAndPointRenderer.Formatter line = new FastLineAndPointRenderer.Formatter (paint.getColor (), null, null) ;
line.setLinePaint       (paint) ;
line.setVertexPaint     (null) ;
line.setPointLabelFormatter (null) ;
line.setInterpolationParams (new CatmullRomInterpolator.Params (10, CatmullRomInterpolator.Type.Centripetal)) ;
LineAndPointFormatter line = new LineAndPointFormatter (paint.getColor (), null, null, null) ;
line.setLinePaint       (paint) ;
line.setVertexPaint     (null) ;
line.setPointLabelFormatter (null) ;
line.setInterpolationParams (new CatmullRomInterpolator.Params (10, CatmullRomInterpolator.Type.Centripetal)) ;
dat0   2838   2838
dat1   3112   5950
dat2   2716   8666
dat3   3021  11688
dat4   2136  13824
dat5   2258  16082
sum 277618
private RectRegion Region = new RectRegion (0, TApCfgX.SzeX (), 0, TApCfg.SzeY ()) ;