可可 – 高效的方法画出数百万点的线

可可 – 高效的方法画出数百万点的线,第1张

概述我在Cocoa中编写了一个音频波形编辑器,具有广泛的缩放选项。在最广泛的地方,它显示了一首整首歌曲的波形(约1000万个视频样本)。在最窄的位置,它显示了一个像素精确的声波表示(一个视图中的一千个样本)。我想能够在这些缩放级别之间顺利过渡。一些像Ableton Live这样的商业编辑似乎以非常便宜的方式做到这一点。 我目前的实现满足了我想要的缩放范围,但是效率低下且波澜不惊。该设计很大程度上受到这 我在Cocoa中编写了一个音频波形编辑器,具有广泛的缩放选项。在最广泛的地方,它显示了一首整首歌曲的波形(约1000万个视频样本)。在最窄的位置,它显示了一个像素精确的声波表示(一个视图中的一千个样本)。我想能够在这些缩放级别之间顺利过渡。一些像Ableton live这样的商业编辑似乎以非常便宜的方式做到这一点。

我目前的实现满足了我想要的缩放范围,但是效率低下且波澜不惊。该设计很大程度上受到这个关于用石英绘制波形的优秀文章的启发:

http://supermegaultragroovy.com/blog/2009/10/06/drawing-waveforms/

我为各种缩减级别的音频文件创建了多个CGMutablePathref。当我全部缩小时,我使用每千次样本减少到一个点的路径。当我一直放大时,我使用的路径包含每个样本的点。当我处于缩减级别之间时,我会横向缩放一个路径。这使它功能,但仍然相当昂贵,并且在缩小级别之间转换时出现工件。

有一个想法,我如何使这个更便宜的是取消反锯齿。我的编辑器中的波形是反锯齿的,而Ableton的波形不是(参见下面的比较)。

我没有看到可以关闭CGMutablePathref的反锯齿方法。在Cocoa世界中是否有一个非反锯齿替代CGMutablePathref?如果没有,有没有人知道一些OpenGL类或示例代码,可能会让我更加有效地绘制我的线条?

更新1-21-2014:现在有一个伟大的图书馆,正是我正在寻找:https://github.com/syedhali/EZAudio

解决方法 我在我的应用程序中使用CGContextMovetoPoint CGContextAddlinetoPoint CGContextstrokePath。使用预先计算的后台缓冲区来绘制一个屏幕上点的一点。缓冲区包含要绘制的精确点,并使用信号的内插表示(基于缩放/缩放)。虽然它可以更快,看起来更好,如果我渲染到图像缓冲区,我从来没有抱怨。如果正确设置,您可以从次要线程中计算并渲染所有这些。

抗锯齿属于图形上下文。

CGfloat(CGPaths的本地输入)对于概述来说是过度的,作为中间表示,并用于计算波形概述。 16位应该足够了当然,当传递给CG调用时,你必须转换为CGfloat。

您需要了解您的时间花费在哪里 – 专注于花费最多时间的部分。还要确保你只画一些必要的东西,当你必须和避免覆盖/动画在可能的时候。如果需要叠加,最好是渲染到图像/缓冲区,并根据需要进行更新。有时,当表面较大时,有助于将显示分解成多个绘图面。

半OT:能力使用s h值可以稍快一点,但我更喜欢它作为一个选项。如果您的实现使用线性插值(可能会根据其外观),考虑一个更直观的方法。线性内插是一个骗子,真的不是用户期望如果你正在开发一个专业应用程序。

总结

以上是内存溢出为你收集整理的可可高效的方法画出数百万点的线全部内容,希望文章能够帮你解决可可 – 高效的方法画出数百万点的线所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1038019.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存