gpt4 book ai didi

android - 在 Android Canvas : dealing with antialiasing and KitKat's peculiarities 中快速绘制大量线条

转载 作者:行者123 更新时间:2023-11-29 00:08:22 25 4
gpt4 key购买 nike

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

  • drawLines() 带有硬件加速的 Canvas。速度很快,但线条变得抗锯齿模糊(见下图)。此外,在 KitKat 上,如果点数组包含 NaN
  • ,则不会绘制任何内容
  • drawLines() 与软件呈现 Canvas。速度适中,没有模糊,KitKat 问题依然存在
  • for (int i ...) drawLine() 使用硬件加速 Canvas。列出的三个中最慢的,没有模糊,没有 KitKat 问题

有些事情告诉我有几个简单的技巧可以避免抗锯齿和 KitKat 问题,从而保持高性能

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

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

UPD2:
这个问题包含两个不同的问题:
- 使用硬件加速和任意(但有效)输入的 drawLines() 时抗锯齿
- 如果输入包含 NaN

drawLines() 拒绝在 KitKat 上绘制任何内容

drawLines() 是焦点,因为它比使用 drawLine() 一条一条地绘制线条快方式

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

canvas.drawLines(toDraw, 0, qty, paint);
canvas.drawLines(toDraw, 2, qty-4, paint); //qty % 4 == 0

更新:
这就是模糊的样子。它在线路的末端

Pic1

最佳答案

这里的话题很乱;让我们试着解开它们。

线条“模糊”

根据我们的聊天记录,此问题只会在您开始绘制长度 < 1 像素的线段时出现。值得注意的是,drawLines() 将一次分割所有线段,并且由于集合中存在 <1px 线,分割器可能会折叠。这就是使用单独的 drawLine() 命令看不到“模糊”的原因;每个 drawLine() 仅分割您给它的部分,因此错误仅限于那些超小的部分(无论如何都太小了)。 这里的修复是添加一些逻辑来从你的集合中删除 <1px 长度的线,这将解决这个问题,并允许你使用 drawLines()比其他方法更快。

NaN 问题

NaN 会在 GPU 上引起很多问题,因此如果它们包含在您的绘图列表中,您就会看到问题是有道理的。 (很像导致模糊问题的 <1px 线段)。同样,这就是为什么使用单独的 drawLine() 命令看不到视觉问题; NaN 正在破坏 tesselator,并将其仅隔离到那些单个段,而不是整个行列表。同样,此处的解决方案将指向过滤列表以删除 NaN。

性能

鉴于镶嵌一条线的开销明显大于 CPU 检查以丢弃一条坏线,因此添加一个预处理以删除 NaN 和 <1px 线应该在您的性能预算之内是有意义的,并且会消除您看到的视觉问题。

关于android - 在 Android Canvas : dealing with antialiasing and KitKat's peculiarities 中快速绘制大量线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32126549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com