androidplot 1.4.3 重绘 运行-时间分析与 JNI getY (idx) 访问
androidplot 1.4.3 redraw run-time analysis with JNI getY (idx) access
我确实评估了 6 XYSeries 图设置(500 个 X 轴样本)在 nexus 7 2013 上的 运行 时间性能,在 getY (idx) 函数中使用简单的合成正弦波并将其与基于 JNI getY (idx) 的设置,其中 JNI C++ 代码只是从 JNI 胶囊中的缓冲区中获取数据
这里是合成正弦波生成的简化设置(示例显示了一个 XYSeries)
public static int DatCnt = 0 ;
static long DatSav ;
@Override
public double GetY (int idx) // being called by super.getY (idx), which implements XYSeries
{
long t0 = 0 ;
if (DatCnt > 0) { DatCnt-- ; t0 = System.nanoTime () ; }
if (DatCnt == 499) DatSav = t0 ;
double dat = Sin (idx) * 45 + 50 ;
//if (DatCnt > 0 &&
// DatCnt < 10) {
// Log.i ("com.efiLabs.PlotXYtst", String.format ("dat0 %6d %d", (System.nanoTime () - t0) / 1000, DatCnt)) ;
//}
if (DatCnt == 1) { ActPlotNew0.Tsum += t0 - DatSav ;
Log.i ("com.efiLabs.PlotXYtst", String.format ("dat0 %6d %6d", (t0 - DatSav) / 1000, ActPlotNew0.Tsum / 1000)) ;
}
return dat ;
//return Sin (idx) * 45 + 50 ;
}
这是android监视器输出
06-04 16:14:40.707 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onDown x_1493 y_523
06-04 16:14:40.797 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onScroll x_23
06-04 16:14:40.797 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: sum 233989457389
06-04 16:14:40.861 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat0 33874 33874
06-04 16:14:40.901 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat1 26428 60302
06-04 16:14:40.938 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat2 24627 84930
06-04 16:14:40.974 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat3 25299 110229
06-04 16:14:41.010 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat4 24047 134277
06-04 16:14:41.046 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat5 25299 159576
06-04 16:14:41.069 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onScroll x_517
06-04 16:14:41.069 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: sum 272247
06-04 16:14:41.129 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat0 24322 24322
06-04 16:14:41.165 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat1 24536 48858
06-04 16:14:41.200 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat2 24688 73547
06-04 16:14:41.236 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat3 24414 97961
06-04 16:14:41.271 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat4 23895 121856
06-04 16:14:41.305 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat5 23834 145690
06-04 16:14:41.326 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onScroll x_37
06-04 16:14:41.326 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: sum 256622
06-04 16:14:41.387 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat0 23834 23834
06-04 16:14:41.429 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat1 30395 54229
06-04 16:14:41.473 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat2 28411 82641
06-04 16:14:41.507 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat3 23406 106048
06-04 16:14:41.542 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat4 23803 129852
06-04 16:14:41.576 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat5 24108 153961
垂直滚动将开始循环并定期调用 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" 显示每个系列 (dat0 - dat5) 的 exex 时间,而第一个数字是从 x 数据 0 到 500 的个人时间累积,第二个是 运行宁时间统计...dat3 系列为 25299 us,dat0 到 dat3 系列为 110299 us,依此类推...每个 ZYSeries 的平均数据获取时间约为 25 ms
272247 us 的总和是滚动操作中从第一个 DatUpd() 调用到下一个调用的时间...我没有了解情节重绘过程何时完成
所有 6 个 XY 系列的总 getY (idx) 数据获取时间为 159576 us,总重绘周期时间为 272247 us ... 272247 - 159576 = 112671 us
当然我不知道 112671 us 的剩余时间(在获取时间之后)的百分比,这是 android绘图时间和滚动手势处理
现在是 C++ JNI 设置时间
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 毫秒……长 15 毫秒,比正弦波合成示例增加 60%
getY (idx) 合成正弦波生成时间部分的百分比未知,android从一个 getY (idx) 到下一个 getY (idx) 的绘图内部发生的其他情况也是如此
25 ms / 500 x-samples 是 50 us,15 ms / 500 x-samples = 30 us ...假设正弦计算不能占用 50 us 的大部分,我会说单个getY (idx) 调用处理,不计算数据获取可能需要 40 到 45 us ...
30 us 的 C++ JNI 数据获取时间不是闪电般的快,但我不得不忍受......整个数据获取部分的 30 us * 500 * 6 = 90 ms ...我可以如果重绘不需要任何时间,请执行此操作 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 个样本为 25 毫秒
但是重绘 scoll 的总时间仍然是 240 毫秒...怎么会???
这是我的滚动函数,继承自一个基 class 只是调用它
protected boolean OnScroll (MotionEvent evt0, MotionEvent evt1, float dx, float dy)
{
DataY.Offs += (dx * 50) / (mWidth - mWidth / 12) ; DataUpd () ;
return true ;
}
我对情节的滚动处理有问题吗???
之前的时间值与 500 个 x 数据点有点匹配,但现在 ???在 getY (idx) 仅占用 14 毫秒的 243 毫秒内发生了什么...为什么滚动刷新频率没有增加???
整个图还是像以前一样抖动
就滚动特性而言,我没有深入的答案,但我想 OS 内部发生了某种消息循环/节流。您是否测量了没有重绘调用的滚动回调以了解滚动 cb 的最大理论频率是多少?
无论如何,加快渲染时间只会有所帮助,所以这里有一些一般性建议:
要提高应用程序的性能,您可以做的最重要的事情可能就是使用 FastXYSeries
。这意味着要么使用您自己的,要么使用 SampledXYSeries
这是唯一的 "out of the box" 实现。我的建议是实施您自己的。
为了从这种方法中获得最佳结果,您还需要设置一个 min/max y 边界并确保您的系列 min/max y-vals 都落在该边界内。这个想法是,对于绘制传入数据流的应用程序,可以维护观察到的 min/max 值的 运行 计数。 FastXYSeries
接口为 Androidplot 提供了一种查询这些值的方法,允许它跳过迭代每个系列以查找可见 min/max 值的非常昂贵的步骤。
如果 FastXYSeries
不可行,那么除了 SimpleXYSeries
之外,使用任何优化的 XYSeries
实现都将是一种改进,因为它针对多功能性而非性能进行了优化。对于固定大小的动态图(如您所见),FixedSizeEditableXYSeries
是一个特别好的选择。
编辑:更新以下添加的问题
all the above so far has been done using the
FastLineAndPointRenderer.Formatter which doesn't seem to care if the
setInterpolationParams is being used ... would make sense since we
want to do it fast
正确(在 class Javadoc 中注明)
one wonders about the differences between the LineAndPointFormatter
and the FastLineAndPointRenderer.Formatter since this setup provides
the same timing
有几个不同之处,但主要有两个:
*每个渲染周期中新实例的最小实例化数量。
* 使用简单的线段而不是路径绘制每个系列。
肯定快多了。如果您在基准测试中没有看到差异,我将不得不假设基准测试不准确或者渲染周期中的其他地方存在瓶颈。您可以尝试的一件事是在 DemoApp 中使用 Androidplot 的 PlotStatistics utility. The DemoApp's orientation sensor sample provides a usage example. It provides an actual performance and theoretical performance (performance of Androidplot's internal rendering only) value in FPS overlay on the plot for which it is enabled. If the two numbers are vastly different then it means the bottleneck is outside of Androidplot. The most common source of bottlenecks is not usin separate threads thread to monitor your sample source and trigger redraws to your plot at a stable frequency. The ECG plot 提供了这样做的合理示例。
我还注意到您在上面的代码中进行了大量的日志记录。请记住,日志记录非常昂贵并且会对性能产生重大影响,特别是如果您在每次调用 getY() 时都调用它,如上所示。如果这里的开销超过 10-30%,我一点也不会感到惊讶。
不知何故,我忽略了 XYSeries 中的 size () 函数,它提供了图表的真实 x 数据计数......在编码 12 小时后已经很晚了;)
下方:合成正弦波getY(idx)时序数据
dat0 2349 2349
dat1 2258 4608
dat2 2716 7324
dat3 2624 9948
dat4 2258 12207
dat5 2471 14678
sum 69396
50 个 x 样本和其中的 6 个绘图现在需要 69 毫秒,所有 getY (idx) 提取需要 14 毫秒
以下:C++ JNI getY(idx) 数据获取时序数据
rdif 3936 3936
rpm 4150 8087
tdif 3784 11871
ext0 4058 15930
ext1 4089 20019
raw2 4150 24169
sum 74432
现在 50 个 x 样本需要 74 毫秒,其中 6 个图需要 24 毫秒用于所有 getY (idx) 提取
到目前为止,以上所有内容都是使用 FastLineAndPointRenderer.Formatter 完成的,它似乎并不关心
正在使用 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)) ;
没有 setInterpolationParams 的单独 LineAndPointFormatter 产生与 FastLineAndPointRenderer 相同的时序
有人想知道 LineAndPointFormatter 和 FastLineAndPointRenderer.Formatter 之间的差异,因为此设置提供相同的时间
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)) ;
对常规的LineAndPointFormatter进行插值设置,下面的时间就是结果
dat0 2838 2838
dat1 3112 5950
dat2 2716 8666
dat3 3021 11688
dat4 2136 13824
dat5 2258 16082
sum 277618
getY (idx) 时间似乎相同,但整体循环时间从 69 毫秒变为 277 毫秒,这是有道理的,因为 50 x 6 点的插值需要一些时间
到目前为止,我对我的结果很满意,我将使用 50 个而不是 500 个 x 数据样本...JNI C++ 代码将只 return 一个值并跳过 4 个或平均其中的 5 个一起
也许我不起眼的 anroidplot eval 可以帮助其他人设计他们的 androidplot
我现在将 XYSeries 接口切换到新的 FastXYSeries 并添加了一个 minMax () 返回以下区域
private RectRegion Region = new RectRegion (0, TApCfgX.SzeX (), 0, TApCfg.SzeY ()) ;
其中 x-max 为 50 且 y-max = 1000,因为图形有 50 个 x 值且 y 数据不超过 1000
速度和没有它时差不多
我的设置是固定的 50 个 x 样本和 y = 0 到 1000
我可以通过更长的缓冲区在我的 getY (idx) 实现中通过和偏移变量移动图形
我不打算使用任何内置缩放功能
在什么情况下可以注意到速度的提高
总的来说,我对从(现在看起来很疯狂的)500 个 x 样本切换到 50 个样本所带来的速度提升感到非常满意
我需要在我的 JNI C++ getY (idx) 访问函数中获取每第 10 个 y 数据,或者对所有 10 个取平均值 ... 接下来要做的事情
我确实评估了 6 XYSeries 图设置(500 个 X 轴样本)在 nexus 7 2013 上的 运行 时间性能,在 getY (idx) 函数中使用简单的合成正弦波并将其与基于 JNI getY (idx) 的设置,其中 JNI C++ 代码只是从 JNI 胶囊中的缓冲区中获取数据
这里是合成正弦波生成的简化设置(示例显示了一个 XYSeries)
public static int DatCnt = 0 ;
static long DatSav ;
@Override
public double GetY (int idx) // being called by super.getY (idx), which implements XYSeries
{
long t0 = 0 ;
if (DatCnt > 0) { DatCnt-- ; t0 = System.nanoTime () ; }
if (DatCnt == 499) DatSav = t0 ;
double dat = Sin (idx) * 45 + 50 ;
//if (DatCnt > 0 &&
// DatCnt < 10) {
// Log.i ("com.efiLabs.PlotXYtst", String.format ("dat0 %6d %d", (System.nanoTime () - t0) / 1000, DatCnt)) ;
//}
if (DatCnt == 1) { ActPlotNew0.Tsum += t0 - DatSav ;
Log.i ("com.efiLabs.PlotXYtst", String.format ("dat0 %6d %6d", (t0 - DatSav) / 1000, ActPlotNew0.Tsum / 1000)) ;
}
return dat ;
//return Sin (idx) * 45 + 50 ;
}
这是android监视器输出
06-04 16:14:40.707 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onDown x_1493 y_523
06-04 16:14:40.797 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onScroll x_23
06-04 16:14:40.797 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: sum 233989457389
06-04 16:14:40.861 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat0 33874 33874
06-04 16:14:40.901 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat1 26428 60302
06-04 16:14:40.938 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat2 24627 84930
06-04 16:14:40.974 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat3 25299 110229
06-04 16:14:41.010 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat4 24047 134277
06-04 16:14:41.046 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat5 25299 159576
06-04 16:14:41.069 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onScroll x_517
06-04 16:14:41.069 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: sum 272247
06-04 16:14:41.129 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat0 24322 24322
06-04 16:14:41.165 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat1 24536 48858
06-04 16:14:41.200 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat2 24688 73547
06-04 16:14:41.236 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat3 24414 97961
06-04 16:14:41.271 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat4 23895 121856
06-04 16:14:41.305 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat5 23834 145690
06-04 16:14:41.326 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: onScroll x_37
06-04 16:14:41.326 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: sum 256622
06-04 16:14:41.387 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat0 23834 23834
06-04 16:14:41.429 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat1 30395 54229
06-04 16:14:41.473 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat2 28411 82641
06-04 16:14:41.507 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat3 23406 106048
06-04 16:14:41.542 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat4 23803 129852
06-04 16:14:41.576 18061-18061/com.efiLabs.PlotXY2tst I/com.efiLabs.PlotXYtst: dat5 24108 153961
垂直滚动将开始循环并定期调用 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" 显示每个系列 (dat0 - dat5) 的 exex 时间,而第一个数字是从 x 数据 0 到 500 的个人时间累积,第二个是 运行宁时间统计...dat3 系列为 25299 us,dat0 到 dat3 系列为 110299 us,依此类推...每个 ZYSeries 的平均数据获取时间约为 25 ms
272247 us 的总和是滚动操作中从第一个 DatUpd() 调用到下一个调用的时间...我没有了解情节重绘过程何时完成
所有 6 个 XY 系列的总 getY (idx) 数据获取时间为 159576 us,总重绘周期时间为 272247 us ... 272247 - 159576 = 112671 us
当然我不知道 112671 us 的剩余时间(在获取时间之后)的百分比,这是 android绘图时间和滚动手势处理
现在是 C++ JNI 设置时间
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 毫秒……长 15 毫秒,比正弦波合成示例增加 60%
getY (idx) 合成正弦波生成时间部分的百分比未知,android从一个 getY (idx) 到下一个 getY (idx) 的绘图内部发生的其他情况也是如此
25 ms / 500 x-samples 是 50 us,15 ms / 500 x-samples = 30 us ...假设正弦计算不能占用 50 us 的大部分,我会说单个getY (idx) 调用处理,不计算数据获取可能需要 40 到 45 us ...
30 us 的 C++ JNI 数据获取时间不是闪电般的快,但我不得不忍受......整个数据获取部分的 30 us * 500 * 6 = 90 ms ...我可以如果重绘不需要任何时间,请执行此操作 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 个样本为 25 毫秒
但是重绘 scoll 的总时间仍然是 240 毫秒...怎么会???
这是我的滚动函数,继承自一个基 class 只是调用它
protected boolean OnScroll (MotionEvent evt0, MotionEvent evt1, float dx, float dy)
{
DataY.Offs += (dx * 50) / (mWidth - mWidth / 12) ; DataUpd () ;
return true ;
}
我对情节的滚动处理有问题吗???
之前的时间值与 500 个 x 数据点有点匹配,但现在 ???在 getY (idx) 仅占用 14 毫秒的 243 毫秒内发生了什么...为什么滚动刷新频率没有增加???
整个图还是像以前一样抖动
就滚动特性而言,我没有深入的答案,但我想 OS 内部发生了某种消息循环/节流。您是否测量了没有重绘调用的滚动回调以了解滚动 cb 的最大理论频率是多少?
无论如何,加快渲染时间只会有所帮助,所以这里有一些一般性建议:
要提高应用程序的性能,您可以做的最重要的事情可能就是使用 FastXYSeries
。这意味着要么使用您自己的,要么使用 SampledXYSeries
这是唯一的 "out of the box" 实现。我的建议是实施您自己的。
为了从这种方法中获得最佳结果,您还需要设置一个 min/max y 边界并确保您的系列 min/max y-vals 都落在该边界内。这个想法是,对于绘制传入数据流的应用程序,可以维护观察到的 min/max 值的 运行 计数。 FastXYSeries
接口为 Androidplot 提供了一种查询这些值的方法,允许它跳过迭代每个系列以查找可见 min/max 值的非常昂贵的步骤。
如果 FastXYSeries
不可行,那么除了 SimpleXYSeries
之外,使用任何优化的 XYSeries
实现都将是一种改进,因为它针对多功能性而非性能进行了优化。对于固定大小的动态图(如您所见),FixedSizeEditableXYSeries
是一个特别好的选择。
编辑:更新以下添加的问题
all the above so far has been done using the FastLineAndPointRenderer.Formatter which doesn't seem to care if the setInterpolationParams is being used ... would make sense since we want to do it fast
正确(在 class Javadoc 中注明)
one wonders about the differences between the LineAndPointFormatter and the FastLineAndPointRenderer.Formatter since this setup provides the same timing
有几个不同之处,但主要有两个: *每个渲染周期中新实例的最小实例化数量。 * 使用简单的线段而不是路径绘制每个系列。
肯定快多了。如果您在基准测试中没有看到差异,我将不得不假设基准测试不准确或者渲染周期中的其他地方存在瓶颈。您可以尝试的一件事是在 DemoApp 中使用 Androidplot 的 PlotStatistics utility. The DemoApp's orientation sensor sample provides a usage example. It provides an actual performance and theoretical performance (performance of Androidplot's internal rendering only) value in FPS overlay on the plot for which it is enabled. If the two numbers are vastly different then it means the bottleneck is outside of Androidplot. The most common source of bottlenecks is not usin separate threads thread to monitor your sample source and trigger redraws to your plot at a stable frequency. The ECG plot 提供了这样做的合理示例。
我还注意到您在上面的代码中进行了大量的日志记录。请记住,日志记录非常昂贵并且会对性能产生重大影响,特别是如果您在每次调用 getY() 时都调用它,如上所示。如果这里的开销超过 10-30%,我一点也不会感到惊讶。
不知何故,我忽略了 XYSeries 中的 size () 函数,它提供了图表的真实 x 数据计数......在编码 12 小时后已经很晚了;)
下方:合成正弦波getY(idx)时序数据
dat0 2349 2349
dat1 2258 4608
dat2 2716 7324
dat3 2624 9948
dat4 2258 12207
dat5 2471 14678
sum 69396
50 个 x 样本和其中的 6 个绘图现在需要 69 毫秒,所有 getY (idx) 提取需要 14 毫秒
以下:C++ JNI getY(idx) 数据获取时序数据
rdif 3936 3936
rpm 4150 8087
tdif 3784 11871
ext0 4058 15930
ext1 4089 20019
raw2 4150 24169
sum 74432
现在 50 个 x 样本需要 74 毫秒,其中 6 个图需要 24 毫秒用于所有 getY (idx) 提取
到目前为止,以上所有内容都是使用 FastLineAndPointRenderer.Formatter 完成的,它似乎并不关心 正在使用 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)) ;
没有 setInterpolationParams 的单独 LineAndPointFormatter 产生与 FastLineAndPointRenderer 相同的时序
有人想知道 LineAndPointFormatter 和 FastLineAndPointRenderer.Formatter 之间的差异,因为此设置提供相同的时间
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)) ;
对常规的LineAndPointFormatter进行插值设置,下面的时间就是结果
dat0 2838 2838
dat1 3112 5950
dat2 2716 8666
dat3 3021 11688
dat4 2136 13824
dat5 2258 16082
sum 277618
getY (idx) 时间似乎相同,但整体循环时间从 69 毫秒变为 277 毫秒,这是有道理的,因为 50 x 6 点的插值需要一些时间
到目前为止,我对我的结果很满意,我将使用 50 个而不是 500 个 x 数据样本...JNI C++ 代码将只 return 一个值并跳过 4 个或平均其中的 5 个一起
也许我不起眼的 anroidplot eval 可以帮助其他人设计他们的 androidplot
我现在将 XYSeries 接口切换到新的 FastXYSeries 并添加了一个 minMax () 返回以下区域
private RectRegion Region = new RectRegion (0, TApCfgX.SzeX (), 0, TApCfg.SzeY ()) ;
其中 x-max 为 50 且 y-max = 1000,因为图形有 50 个 x 值且 y 数据不超过 1000
速度和没有它时差不多
我的设置是固定的 50 个 x 样本和 y = 0 到 1000
我可以通过更长的缓冲区在我的 getY (idx) 实现中通过和偏移变量移动图形
我不打算使用任何内置缩放功能
在什么情况下可以注意到速度的提高
总的来说,我对从(现在看起来很疯狂的)500 个 x 样本切换到 50 个样本所带来的速度提升感到非常满意
我需要在我的 JNI C++ getY (idx) 访问函数中获取每第 10 个 y 数据,或者对所有 10 个取平均值 ... 接下来要做的事情