androidplot 1.4.3使用JNI getY(idx)访问重新绘制运行时分析 我在一个Nexus 7中用XY函数(简单的合成正弦波)来评估一个6 XYSRANS绘图设置(500 x轴采样)的运行时性能,并将其与JNI GTEY(IDX)为基础的设置进行比较,JNI C++代码简单地从JNI胶囊内的缓冲区中取出数据。
以下是合成正弦波生成的简化设置(示例显示一个XYSeries) 垂直滚动将启动循环,并定期调用DatUpd()函数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 =
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 ()) ;