gpt4 book ai didi

cocoa - 数百万点绘制直线的高效方法

转载 作者:行者123 更新时间:2023-12-03 16:02:03 24 4
gpt4 key购买 nike

我正在 Cocoa 中编写一个音频波形编辑器,具有多种缩放选项。在最宽处,它显示整首歌曲的波形( View 中约 1000 万个样本)。在最窄处,它显示了声波的像素精确表示( View 中约 1000 个样本)。我希望能够在这些缩放级别之间平滑过渡。一些商业编辑器(例如 Ableton Live)似乎以非常便宜的方式做到这一点。

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

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

我为不同缩减级别的音频文件创建了多个 CGMutablePathRef。当我一直缩小时,我使用的路径已减少到每 x 千个样本一个点。当我完全放大时,我使用包含每个样本的点的路径。当我处于缩小级别之间时,我会水平缩放路径。这使它可以正常工作,但仍然相当昂贵,并且在缩减级别之间转换时会出现伪影。

关于如何降低成本的一个想法是取消抗锯齿功能。我的编辑器中的波形是抗锯齿的,而 Ableton 中的波形则不是(参见下面的比较)。 enter image description here enter image description here

我没有找到关闭 CGMutablePathRef 抗锯齿功能的方法。在 Cocoa 的世界里是否有 CGMutablePathRef 的非抗锯齿替代方案?如果没有,有谁知道一些 OpenGL 类或示例代码可能会让我更有效地绘制我的巨线?

更新 1-21-2014: 现在有一个很棒的库,它完全可以满足我的需求:https://github.com/syedhali/EZAudio

最佳答案

我在我的应用程序中使用CGContextMoveToPoint+CGContextAddLineToPoint+CGContextStrokePath。使用预先计算的后备缓冲区为屏幕上的每个点绘制一个点以进行概览。缓冲区包含要绘制的精确点,并使用信号的插值表示(基于缩放/比例)。虽然如果我渲染到图像缓冲区,它可能会更快并且看起来更好,但我从未有过提示。如果设置正确,您可以从辅助线程计算并渲染所有这些。

抗锯齿与图形上下文有关。

CGFloat(CGPaths 的 native 输入)对于概述、作为中间表示以及计算波形概述来说是多余的。 16 位应该足够了。当然,在传递给 CG 调用时,您必须转换为 CGFloat。

您需要进行分析以找出您的时间花在哪里 - 重点关注花费最多时间的部分。另外,请确保只在必要时绘制必须绘制的内容,并尽可能避免覆盖/动画。如果您需要覆盖,最好渲染到图像/缓冲区并根据需要进行更新。有时,当表面很大时,将显示分解为多个绘图表面会有所帮助。

半OT:ableton使用s+h值,这可能会稍微快一些,但是......我更喜欢它作为一个选项。如果您的实现使用线性插值(根据其外观,可能会使用线性插值),请考虑更直观的方法。线性插值有点作弊,如果您正在开发专业应用程序,这确实不是用户所期望的。

关于cocoa - 数百万点绘制直线的高效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4849076/

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