CoreText вылетает при запуске в нескольких потоках

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

Хотя в целом это работает нормально, иногда дает сбой. Все эти сбои происходят на одной и той же линии:

framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)myText);

Фактически, они также, кажется, происходят из аналогичной точки в структуре. Я знаю, что вам это не нравится, но вот заголовок журнала сбоев:

Thread 8 Crashed:
0   ???                             0x0764f446 typeinfo for FT::data_stream + 6
1   libCGFreetype.A.dylib           0x076048b8 FT::font::copy_table(unsigned int) const + 94
2   libCGFreetype.A.dylib           0x0760b085 (anonymous namespace)::copy_table(void*, unsigned int) + 53
3   CoreText                        0x00f9592e TBaseFont::CopyTable(unsigned int) const + 334
4   CoreText                        0x00f670f6 TAATMorphTable::TAATMorphTable(TLine&, long, unsigned int) + 110
5   CoreText                        0x00f6744c TAATMorphTableMorx::TAATMorphTableMorx(TLine&, long, TGlyphList<TDeletedGlyphIndex>&) + 54
6   CoreText                        0x00f53eb5 TShapingEngine::ShapeGlyphs(TLine&, TCharStream const&, CFRange&, TGlyphList<TDeletedGlyphIndex>*) + 215
7   CoreText                        0x00f579ce TTypesetter::FinishEncoding(TLine&, signed char, TGlyphList<TDeletedGlyphIndex>*) const + 260
8   CoreText                        0x00f6664b TTypesetterAttrString::Initialize(__CFAttributedString const*) + 543
9   CoreText                        0x00f6683e TTypesetterAttrString::TTypesetterAttrString(__CFAttributedString const*) + 158
10  CoreText                        0x00f6102e TFramesetterAttrString::TFramesetterAttrString(__CFAttributedString const*) + 86
11  CoreText                        0x00f6099e CTFramesetterCreateWithAttributedString + 78
...

Все сбои, которые я могу вспомнить, были в функции FT :: font :: copy_table . Интересно, что чем сложнее требования к шрифту, тем чаще происходят сбои. Китайский текст почти всегда дает сбой - эти шрифты кажутся довольно сложными.

Временное решение: Обходной путь, который я нашел, - это упорядочить вызовы CTFramesetterCreateWithAttributedString либо в основной очереди, либо в отдельной. Проблема в том, что этот единственный вызов составляет 79% от общего времени выполнения макета и рендеринга. Так что я бы хотел, чтобы это было в нескольких потоках.

Вопрос: Есть какие-нибудь профи, которые могли бы помочь? Для меня это звучит как состояние гонки где-то глубоко внутри. Я не нашел ничего, говорящего о том, что CoreText нельзя использовать в многопоточном режиме. А я завтра запишу ошибку. Однако, возможно, я просто что-то упустил. Есть совет?

Спасибо, Макс

13
задан Max Seelemann 12 April 2011 в 23:18
поделиться