Я не понимаю, как это должно решить проблему в системе шрифтов. Это все тот же шрифт, используемый параллельно, верно?

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

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

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 не может быть использован как многопоточный. И я сообщу об ошибке завтра. Тем не менее, я мог бы просто что-то пропустить. Любой совет?

Спасибо Макс

Ответы на вопрос(5)

Ваш ответ на вопрос