Проблема с проектом после обновления macOS Mojave


#1

Добрый день коллеги! Нужна ваша помощь. !

Поставил. с ноля macOS Mojave. Возникла следующая проблема. Ранее скомпилированная программа для macOS (не для iOS) в Xcode9 и HighSierra, а также заново скомпилированная в Xcode10 в Mojave сразу после запуска загружает процессор на 100 процентов. В HighSierra ничего подобного не было, загруженность процессора была на нуле после запуска программы.Насколько я вижу загружается один и не основной поток. Но что конкретно не могу найти. Как наити что происходит, может кто сталкивался?


#2

Попробуйте time profiler.


#3

Спасибо, попробовал time profiler
Screen short прикрепил. Из него в чем причина я понять не могу, нужен взгляд профессионала.


#4

После double click на main обнаружил что видимо проблема возникла с extension Array, ниже скрин. В нем три функции. Но почему программа много раз обращается к это строке не понимаю. Есть проблема с этими функциями или что то еще ?


#5

У вас там SCNView отрисовывается, я бы смотрел в сторону SceneKit. Для SceneKit профайлинг есть, попробуйте его запустить, может что он интересного покажет)


#6

Ваш совет в точку. Обнаружил следующее. Программ стартует и процессор выходит на 100% . Но, как только я открываю popover View в котором и расположен SCNView процессор сбрасывает проценты до нуля. SCNView работает как и должно все ок.

Т.е. загрузка связана с SCNView и app постоянно обращается к чему то до того как прорисовывается SCNView, так как SCNView автоматически не запускается только при нажатии кнопки на запуск popover View. Осталось найти что такое связанное с SCNView грузит процессор при запуске программы.


#7

Чем дальше тем веселее. С моим кодом для SCNView описанное поведение не связано. Если просто вставить SCNView в какой угодно NSView то пока этот NSView с SCNView не открыт процессор будет на 100% , открываю - опускается до нуля. И как это ненормальное поведение исправить понятия не имею. Я не использую Storyboard (из-за popover), использую xib файл.

Может это связано с начальной загрузкой NSView в NSWindow. Использую следующий код.

class AppDelegate: NSObject, NSApplicationDelegate
{
    @IBOutlet weak var window: NSWindow!

    var allUnderControl: AllUnderControl!

    func applicationDidFinishLaunching(_ aNotification: Notification)
    {
        self.window!.titleVisibility = .hidden
        allUnderControl = AllUnderControl(nibName: NSNib.Name(rawValue: "AllUnderControl"), bundle: nil)
        window.contentView!.addSubview(allUnderControl.view)
        allUnderControl.view.frame = (window.contentView! as NSView).bounds

#8

Попробуйте так https://yadi.sk/d/t6QNIMk8AppUUw что бы SCNView инициализировался с контроллером а тот при нажатии на кнопку.


#9

Спасибо!!!
Попробую попозже, если не не найдется решение без обходных маневров. Ведь это не нормальное поведение SCNView и видимо что то где то должно быть исправлено.


#10

Создал простой тест проект для macOS (проще не бывает), c xib файл, не stroryboard - в window поместил NSTabView с двумя view , и в то view которое не открывается при старте программы поместил SCNView. Build and run - имеем ту же проблему, 100% загруженность процессора. Когда открываю view в котором находится SCNView то загруженность процессора падает до ноля.

Очевидный баг macOS Mojave.


#11

SCNView можно и кодом создать, в xib его пихать смысла особого нет.


#12

Так то оно так, но если есть стандартный объект SCNView в Xcode библиотеке, то добавление этого view в обычный NSView выглядит как стандартная процедура, и так все работало в трех macOS до Mojave. Не думаю что в apple хотели бы чтобы SCNView прописывался вручную. То что сейчас вдруг это изменилось может иметь только одно объяснение - это ошибка. Ведь использование xib, a не storyboard это все еще законная процедура и тогда можно вставлять SCNView в NSView и процессор при этом не должен быть на 100% все время пока юзер не откроет SCNView.

Проблему то я устранил, сделал дополнительный контролер и xib для NSView с SCNView и добавляю все это как subview в NSView of popover при нажатии кнопки для popover окна (с условием что последний subview не является этим NSView с SCNView чтобы исключить добавление subview каждый раз когда открывается окно popover).

Просто интересно почему вдруг все это возникло. И скорее всего потому что имеет место подготовка SCNView для работы при его инициализации через классический путь с xib файлом и она не может закончится из-за какой-то ошибки если SCNView не открыто. Вероятно ноги растут из storyboard где инициализация и открытие view происходит одновременно.

Да и если мне память не изменяет то раньше не было возможности в IB проставить цвет и камеру для SCNView, у меня это было прописано кодом. Так вот когда сейчас отметил в IB эти параметры то прокрутка трехмерной картинки SCNView нормально не работала. Только когда опять прописал кодом все работает как и раньше. Т.е. apple что то поменял в SCNView но толком оно не работает.


#13

И каков глобальный совет, ставить или подождать?)


#14

Выпилили OpenGL…


#15

Я бы сказал зависит от Ваших целей, если можно ждать то наверное это лучше, если нет то можно столкнутся с чем то подобным и придется искать решение. Прошлое обновление с Sierra до HighSierra было у меня еще веселее, поэтому сейчас подождал месяц, вроде особых жалоб не видел и решил поставить. Никогда не знаешь что вылезет.

Apple любит очень много про эможи рассказывать, про остальное существенно меньше.