SpriteKit: почему SKView исчезает на одной высоте, но появляется на другой высоте? Какова максимальная высота для SKView?

В приведенном ниже коде отображается SKView, пока вы не измените skHeight на 2050 или более высокое значение, например 5000.

1) Как сделать так, чтобы SKView отображалось даже на высотах 2050 или 5000?

2) Каков максимальный размер SKViews?

Чтобы воспроизвести:

1) Запустите код ниже. Вы увидите SKView в виде серого окна.

2) Измените skHeight на 2050 или 5000. SKView больше не появляется.

class TestViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        // Create SKView
        let skHeight = CGFloat(2050)
        let skFrame = CGRect(x: 0, y: 0, width: 100, height: skHeight)
        let skView = SKView(frame: skFrame)
        skView.backgroundColor = UIColor.red

        // Add test view to <scrollView>
        view.addSubview(skView)
    }
}

person Crashalot    schedule 31.08.2018    source источник
comment
Я не могу воспроизвести вашу проблему. У меня всегда серое окно меняется skHeight тоже с 10.000. Тесты проводились с Xcode 9.4.1 и iPhone SE. Может ли это быть связано с конкретным устройством?   -  person Alessandro Ornano    schedule 31.08.2018
comment
2048 — это ваш предел, потому что именно такого размера может быть буфер кадров (на самом деле это 4096, но это учитывает @2x сетчатку).   -  person Knight0fDragon    schedule 31.08.2018
comment
почему вы хотите, чтобы ваш вид был таким большим, ни у одного устройства нет экрана больше этого   -  person Knight0fDragon    schedule 31.08.2018
comment
@Knight0fDragon спасибо за помощь! потому что цель состоит в том, чтобы встроить SKView в UIScrollView. прокрутка отлично работает, когда сцена и SKView имеют значение ‹ 2048, но она прерывается, когда высота SKView составляет > 2048, потому что SKView (и, следовательно, сцена) больше не отображается. Кроме того, некоторым пользователям нравится первый отчет комментатора, который видит SKView с высотой > 2048.   -  person Crashalot    schedule 31.08.2018
comment
@AlessandroOrnano, не могли бы вы попробовать протестировать iPhone или iPad на симуляторе? Спасибо за помощь!   -  person Crashalot    schedule 31.08.2018
comment
Хорошо, система на самом деле не предназначена для того, что вы хотите, но чтобы обойти это, не помещайте свой SKView в свой UIScrollView, поместите в него UIView-заполнитель, затем передайте положение прокрутки в свой SKView и переместите свою сцену. Если бы у меня был лучший контекст относительно того, зачем вам нужен UIScrollView, я мог бы дать лучший ответ   -  person Knight0fDragon    schedule 31.08.2018
comment
@Knight0fDragon еще раз спасибо! этот вопрос возник из исходного вопроса (прокрутка SKView). мы пробовали использовать наполнитель UIView, но происходило два уровня прокрутки: один с UIScrollView и второй при перемещении сцены. как вы обойти это?   -  person Crashalot    schedule 31.08.2018
comment
Вы не помещаете skview в свой вид прокрутки, лол   -  person Knight0fDragon    schedule 31.08.2018
comment
@Knight0fDragon, конечно. :) так глупо! Благодарность! Кстати, вы уверены насчет ограничения 2048? другие пользователи (например, первый комментатор) сообщают, что видят SKView с высотами > 2048. Еще раз спасибо!   -  person Crashalot    schedule 31.08.2018
comment
@Crashalot - первый комментатор сказал ... всегда серое окно... - я не думаю, что он когда-либо видел красное подвид.   -  person DonMag    schedule 31.08.2018
comment
@DonMag SKView на самом деле не красный, установка backgroundColor в SKView на самом деле ничего не делает (должно было быть удалено из вопроса). SKView представлен серым окном.   -  person Crashalot    schedule 31.08.2018
comment
@Crashalot, это не проблема с рендерингом металла, только с OpenGL   -  person Knight0fDragon    schedule 04.09.2018


Ответы (1)


Рендеринг OpenGL не поддерживает размеры холста больше 4096x4096 на многих устройствах, ваше представление составляет 2050x2050, поэтому, когда вы учитываете режим сетчатки, оно действительно становится 4100x4100.

Теперь устройства @3x еще более сумасшедшие, потому что им нужно обрабатывать аппаратное масштабирование и сжатие, поэтому в конечном итоге вы получаете изображения только около 1501x1501.

В Metal такой проблемы нет, а начиная с iOS 12 OpenGL устарел, так что, надеюсь, симуляторы тоже будут использовать Metal. (Так и должно быть, поскольку Мохаве поддерживает только металлические устройства)

person Knight0fDragon    schedule 04.09.2018
comment
Металл имеет ограничения по размеру текстуры в зависимости от графического процессора. Текущий максимальный размер текстуры в Metal составляет 16384×16384. - person Alexander Stepanishin; 28.08.2020