OpenGL не рендерится на MacOS Mojave

Если вы создадите NSView и пользовательский NSOpenGLContext в macOS Mojave, окно не отображается до тех пор, пока оно не будет изменено. Но все работает, если вы используете вместо этого NSOpenGLView. Я вижу множество хаков, которые изменяют размер окна программно ( http://people.bath.ac.uk/abscjkw/ComputerPrograms/C++programs/OpenGL/MojaveOpenGL.cpp ) перед рендерингом в него или вызовом [NSOpenGLContext update] дважды ( https: //github .com /go-gl /glfw /pull /229 /commits /9e6129a572227a13ff9acb4904443d2ae7d66e77 ), но они кажутся действительно хакерскими и ненадежными.

4 голоса | спросил Elviss Strazdins 23 +03002018-10-23T01:22:30+03:00312018bEurope/MoscowTue, 23 Oct 2018 01:22:30 +0300 2018, 01:22:30

3 ответа


0
Я разобрал фреймворки Apple и обнаружил, что они изменили работу рендеринга OpenGL в Mojave.Кажется, что даже если вы отключите многоуровневое резервное копирование, установив ---- +: = 0 =: + ---- 's ---- +: = 1 =: + ---- к ---- +:= 2 =: + ---- , ---- +: = 3 =: + ---- по- прежнему создает и присоединяет слой к вашему виду в Мохаве.Изменение размера окна перед его рендерингом работает, потому что это обычно приводит к вызову ---- +: = 4 =: + ---- .Вызов обновления дважды работает, потому что в первом кадре ---- +: = 5 =: + ---- к нему не прикреплен слой, а метод обновления ничего не делает, кроме второго кадра, слой там и ---- +: = 6 =: + ---- фактически инициализирует кадровый буфер.Таким образом, решение состоит в том, чтобы вызывать ---- +: = 7 =: + ---- вручную каждый раз, когда установлен слой ---- +: = 8 =: + ---- , например:Я протестировал его, и он работает как на Mojave, так и на старых версиях macOS ( ---- +: = 10 =: + ---- не вызывается на macOS 10.13 и более старых версиях).Вот полный коммит, который я сделал для движка Ouzel: https://github.com/elnormous/ouzel/commit/7e708636189d970bad6b013ecd5375cfe693f3f3
ответил Elviss Strazdins 23 +03002018-10-23T01:22:30+03:00312018bEurope/MoscowTue, 23 Oct 2018 01:22:30 +0300 2018, 01:22:30
0
На моем подклассе NSView, который управляет NSOpenGLContext вручную, мне нужно было вызвать NSView.displayIfNeeded вместо NSView.display для замены буфера.Переопределение NSView.setLayer и вызов NSOpenGLContext.update не помогли.Обратите внимание, что мое использование похоже на SDL, где я использую пользовательский цикл выполнения, так что это может быть не так в программе постеров.
ответил GenericPtr 29 Jam1000000amTue, 29 Jan 2019 01:51:23 +030019 2019, 01:51:23
0
После обновления до Mojave 10.14.3 и Xcode 10.1 эта проблема была исправлена.
ответил Raydelto Hernandez 9 MarpmSat, 09 Mar 2019 14:53:02 +03002019-03-09T14:53:02+03:0002 2019, 14:53:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132