Эффективный метод для рисования линия с миллионами точек

Я пишу редактор звуковых сигналов в Какао с широким диапазоном опций масштабирования. В самом широком смысле он показывает форму волны для всей песни (в поле зрения ~ 10 миллионов сэмплов). В самом узком месте он показывает точное представление звуковой волны с точностью до пикселя (~ 1 тысяча отсчетов в обзоре). Я хочу иметь возможность плавно переключаться между этими уровнями масштабирования. Некоторые коммерческие редакторы, такие как Ableton Live, делают это очень недорого.

Моя текущая реализация удовлетворяет желаемый диапазон масштабирования, но она неэффективна и нестабильна. Дизайн во многом вдохновлен этой прекрасной статьей о рисовании сигналов с помощью кварца:

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

Я создаю несколько CGMutablePathRef ' s для аудиофайла с различными уровнями сжатия. Когда я полностью уменьшен, я использую путь, который уменьшен до одной точки на каждую тысячу образцов. Когда я полностью увеличиваю масштаб, я использую этот путь, который содержит точку для каждого образца. Я масштабирую путь по горизонтали, когда нахожусь между уровнями уменьшения. Это делает его функциональным, но все же довольно дорого, и при переходе между уровнями уменьшения появляются артефакты.

Одна мысль о том, как я могу сделать это менее затратным, - это убрать сглаживание. Форма волны в моем редакторе сглажена, а в Ableton - нет (см. Сравнение ниже). Я использую тот путь, который содержит точку для каждого образца. Я масштабирую путь по горизонтали, когда нахожусь между уровнями уменьшения. Это делает его функциональным, но все же довольно дорого, и при переходе между уровнями уменьшения появляются артефакты.

Одна мысль о том, как я могу сделать это менее затратным, - это убрать сглаживание. Форма волны в моем редакторе сглажена, а в Ableton - нет (см. Сравнение ниже). Я использую тот путь, который содержит точку для каждого образца. Я масштабирую путь по горизонтали, когда нахожусь между уровнями уменьшения. Это делает его функциональным, но все же довольно дорого, и при переходе между уровнями уменьшения появляются артефакты.

Одна мысль о том, как я могу сделать это менее затратным, - это убрать сглаживание. Форма волны в моем редакторе сглажена, а в Ableton - нет (см. Сравнение ниже). enter image description hereenter image description here

Я не вижу способа отключить сглаживание для CGMutablePathRef. Есть ли в мире какао альтернатива CGMutablePathRef без сглаживания? Если нет, знает ли кто-нибудь о некоторых классах OpenGL или образцах кода, которые могут помочь мне более эффективно рисовать огромную линию?

Обновление 1-21-2014: Теперь есть отличная библиотека, которая делает именно то, что я искал: https://github.com/syedhali/EZAudio

19
задан tassock 21 January 2014 в 17:21
поделиться