Приложение SceneKit с оверлеем SKScene, отрисовывающим SKSpriteNode с неправильными текстурами в macOS - PullRequest
2 голосов
/ 25 мая 2020

У меня есть работающая игра в iOS и магазине приложений tvOS, которую я сейчас портирую на macOS. Это приложение SceneKit, которое интенсивно использует overlaySKScene для предоставления подробного HUD и игровой области в 2D.

На iOS и tvOS все работает нормально, однако на macOS я вижу это странная периодически возникающая проблема, когда SKSpriteNodes, которые являются дочерними элементами overlaySKScene, отрисовываются для 1 или 2 кадров с неправильной текстурой. добавлено в overlaySKScene, узлы, которые рисовали нормально, начинают мерцать. И что более интересно, когда они мерцают, кажется, что они рисуют текстуры из других узлов, растянутые по размеру их фреймов. Я инициирую анимацию на узлах. Я профилировал приложение на случай, если анимация съедает ресурсы, но я не вижу никаких признаков этого.

Все художественные ресурсы находятся в стандартном каталоге ресурсов Xcode с размером Ma c

Все это происходит на совершенно новом Ma c на базе Catalina. Это происходит в среде Xcode и за ее пределами.

Последнее наблюдение: проблема возникает только тогда, когда у меня приложение развернуто для использования всего экрана.

Это изображение показывает, что должно отображаться на экране.

This is what it should look like

На этом изображении кратковременно показано, что происходит, вызывая мерцание. После мерцания отображается то, что нужно. Так что мне кажется, что это повреждение где-то в том, как SpriteKit управляет узлами, но только на macOS.

This is what it looks like when the glitch occurs

Любые предложения о том, что может вызвать такого рода проблемы с SceneKit / SpriteKit на MacOS будут признательны.

[ОБНОВЛЕНИЕ 1]:

Ну, похоже, что проблемы напрямую связаны с тем, что приложение работает в полноэкранном режиме Режим. После еще одной недели попыток выяснить, что я делаю не так, новый поиск привел меня к другому другому сообщению SO .

Я применил некоторые методы из этого сообщения, в частности:

self.view.window!.styleMask = NSBorderlessWindowMask  
self.view.window!.level = Int(CGWindowLevelForKey(Int32(kCGMainMenuWindowLevelKey))) + 1  
self.view.window!.opaque = true  
self.view.window!.hidesOnDeactivate = true  
let size = NSScreen.mainScreen()!.frame.size  
NSMenu.setMenuBarVisible(false)  
self.view.window!.setFrame(CGRect(x: 0, y: 0, width: size.width, height: size.height+1), display:true)  

Это, безусловно, имеет большое значение, искажение текстур прекращается в 99,9% случаев, однако у меня остается около 20 неиспользуемых пикселей в нижней части экрана.

Учитывая, что этот пост был задан в 2016 году, и есть комментарий, в котором говорится, что проблема была исправлена ​​в 2016 году, мне интересно, почему я все еще вижу это в 2020 году. Я заметил, что такая же проблема возникает на моем старом Macbook Pro (2013, core i5, 2.3 ГГц) с Mojave.

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

Замечу, что в приведенном выше решении, если я закомментирую строку:

NSMenu.setMenuBarVisible(false)  

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

* 1050 запустить ОК, значит, должен быть способ, чтобы все это работало. Хотя было бы неплохо не прибегать к обходному пути.

Вот еще несколько снимков экрана, показывающих проблему.

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

Full FPS in near fullscreen with menubar not visible

Затем на изображении ниже показано, что я получаю, закомментировав строку, так что, хотя строка меню на самом деле не видна, это вызывает серьезное падение частоты кадров, а затем, как показано на последнем изображении, когда когда бы я ни делал что-то в приложении, которое запускает некоторые анимации SpriteKit, SKSpriteNodes в оверлее SpriteKit отрисовываются для нескольких кадров с использованием неправильных текстур:

drop in FPS with the menubar visible (but not)

the texture glitching in virtually every SKSpriteNode

...