Как бороться с OpenGL и Fullscreen на OS X

9

Я делаю большую часть своей разработки под OS X, и для моего текущего игрового проекта это моя целевая среда. Однако когда я играю в игры, я играю на Windows. Как геймер для Windows, я привык переключать Alt + Tab из игры в последнее открытое приложение.

На OS XI в настоящее время не может найти ни игру, которая поддерживает это, ни я не могу найти способ сделать это возможным. Мой текущий проект основан на SDL 1.3, и я вижу, что вкладка cmd + - это последовательность, которая отправляется непосредственно в мое приложение и не перехватывается операционной системой.

Теперь моей первой попыткой было скрыть окно рендеринга на вкладке cmd +, что, безусловно, работает, но имеет тот недостаток, что скрытое окно OpenGL в SDL не может быть восстановлено, когда пользователь вернется в приложение. Во-первых, для этого не сработало событие, или я не могу его найти, во-вторых, основная проблема заключается в том, что когда это окно приложения скрыто, моя игра остается активным приложением, просто окно исчезло.

Это невероятно раздражает.

Любые идеи, как приблизить поведение Windows / Linux для Alt + Tab?

Армин Ронахер
источник

Ответы:

2

Проблема заключается в том, что вы снимаете экран, как описано в документации Apple здесь: https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/QuartzDisplayServicesConceptual/Articles/DisplayCapture.html

Это означает, что ВСЕ команды клавиатуры перехватываются вашим приложением. У этого подхода есть свои преимущества в зависимости от вашего приложения.

В нижней части документа Apple говорится:

Примечание. Нет необходимости снимать изображение для полноэкранного рисования. Другой подход - создать и нарисовать в окне без полей размер дисплея. Такой подход позволяет использовать все возможности оконной системы. Он также хорошо работает с остальной частью операционной системы и снижает сложность обработки дисплеев (например, вам не нужно беспокоиться о зеркальных дисплеях). При таком подходе вы можете получать оповещения об ошибках, которые могут быть пропущены на захваченном дисплее. Вы также можете использовать Command-Tab для изменения приложений с этим подходом. В системах с современным графическим оборудованием производительность рисования в полноэкранном окне почти так же высока, как в полноэкранном контексте рисования.

Что вам нужно сделать, это сделать ваш OpenGL полноэкранный просмотр без захвата экрана. Вот как cocos2d в настоящее время обрабатывает полноэкранные приложения OS X. Вы можете просмотреть код для cocos2d Mac здесь: https://github.com/cocos2d/cocos2d-iphone/tree/master-v2/cocos2d/Platforms/Mac

Посмотрите конкретно в CCDirectorMac.m и CCGLView.m для их реализации.

Если вы решите, что хотите выборочно ограничивать некоторые функции, такие как переключение процессов, без ограничения всех функций оконной системы, вы можете обратиться к Техническому примечанию по режиму Apple Kiosk: http://developer.apple.com /library/mac/#technotes/KioskMode/Introduction/Introduction.html

глина
источник
1

Мой опыт этого на Mac заключается в том, что обычно есть ярлык для выхода из полноэкранного режима в оконный режим (обычно CMD + M или CMD + Return). Перейдя в оконный режим, вы сможете получить доступ ко всем своим приложениям в обычном режиме. Оконный режим также позволяет пользователю контролировать свою игру среди всех других приложений. Так что, думаю, вы могли бы просто реализовать такую ​​функциональность в своей игре.

Джеймс Бедфорд
источник