Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android画布中快速绘制大量线条:处理抗锯齿和KitKat';中国的特点_Android_Performance_Android Canvas - Fatal编程技术网

在Android画布中快速绘制大量线条:处理抗锯齿和KitKat';中国的特点

在Android画布中快速绘制大量线条:处理抗锯齿和KitKat';中国的特点,android,performance,android-canvas,Android,Performance,Android Canvas,我需要快速抽签(~10k/帧是一个常见的数量)。绘制这些线的已知方法(单线程、抗锯齿): drawLines()带有硬件加速的Canvas。速度很快,但线条会出现抗锯齿模糊(请参见下图)。此外,在KitKat上,如果点数组包含NaN值,则不会绘制任何内容 drawLines()和软件渲染的Canvas。中速,无模糊,KitKat问题依然存在 用于(int i…)drawLine()和硬件加速的画布。列出的三个问题中速度最慢的一个,没有模糊,没有KitKat问题 有些东西告诉我,有几个简单的技

我需要快速抽签(~10k/帧是一个常见的数量)。绘制这些线的已知方法(单线程、抗锯齿):

  • drawLines()
    带有硬件加速的
    Canvas
    。速度很快,但线条会出现抗锯齿模糊(请参见下图)。此外,在
    KitKat
    上,如果点数组包含
    NaN
    值,则不会绘制任何内容
  • drawLines()
    和软件渲染的
    Canvas
    。中速,无模糊,
    KitKat
    问题依然存在
  • 用于(int i…)drawLine()
    和硬件加速的
    画布
    。列出的三个问题中速度最慢的一个,没有模糊,没有KitKat问题
有些东西告诉我,有几个简单的技巧可以避免抗锯齿和
KitKat
问题,从而保持高性能

对于第一个选项-例如,是否可以绘制未抗锯齿的线条,然后对整个位图应用抗锯齿(最快选项的变体)

对于第二种情况,没有想法,只有一些处理
NaN
s的微调方法。无论如何,
KitKat
是一个相对较新和流行的平台,应该有一些解决方案来解决它的问题,否则该平台的使用将是一个相当头痛的问题

UPD2:
此问题包含两个独立的问题:
-使用带有硬件加速和任意(但有效)输入的
drawLines()
时的抗锯齿
-
drawLines()
如果输入包含
NaN
s,则拒绝在
KitKat
上绘制任何内容

drawLines()
之所以成为焦点,是因为它比使用
drawLine()

此外,以下图片是对同一数组应用两次
drawLines()
的结果:

canvas.drawLines(toDraw, 0, qty, paint);
canvas.drawLines(toDraw, 2, qty-4, paint); //qty % 4 == 0
UPD
这就是模糊的样子。在队伍的尽头


这里的话题错综复杂;让我们试着解开它们

线条“模糊”


根据我们的聊天,只有在开始绘制长度小于1px的线段时,才会出现此问题。值得注意的是,
drawLines()
将一次对所有线段进行镶嵌,并且很可能由于存在而导致镶嵌器崩溃。好的,解决方案只是chat中编写的结果(参见Colt的帖子):

1) 原始输入数组被拆分为不包含NAN的片段

2) 将这些段分开,以便子段中的线长度之间的最大差异小于
4x
(实验获得的值)。将
drawLines()
应用于最终子阵列不会产生模糊,而且性能相当好

我不确定抗锯齿“模糊”是什么意思?根据定义,抗锯齿是一种模糊。也许可以用一张图片来描述这个问题?更新了问题,所以,我猜是那些NAN导致了GPU方面的问题。作为一项健全性检查,您是否在绘图之前通过软件移除了NaN(只是为了看看这是否是视觉问题?)我没有,但有不同的点集:包含
NaN
s和不包含。后者绘制在
KitKat
上。我怀疑这是GPU方面的问题,
NaN
问题是特定于
KitKat
,并且不受渲染模式双重健全性测试的影响:NaN在哪里?它们是否位于每条线段的末端?(这是图片中出现视觉问题的地方?)。别忘了Android会将所有这些线段拼接成一组GPU原语。NaN让GPU做奇怪的事情。如果你看到这样的副产品,我也不会感到惊讶。