Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Попытка починить levelshots #1443

Closed
wants to merge 1 commit into from

Conversation

vklachkov
Copy link
Contributor

@vklachkov vklachkov commented Oct 11, 2023

Ситуация

При переходе между уровнями что ref_gl, что в ref_vk рисуется чёрный экран. В оригинале игры изображение "застывает", пока не прогрузится следующий уровень. Чёрный экран сильно давит на глаза во время игры.

На этот баг жаловались пару раз:

А так же было одно ишью в форке от @w23:

Причины проблемы

При смене уровня явно подразумевалась отрисовка скриншота уровня: для этого есть весь код. Но скриншота на момент смены локации не существует.

Поковыряв цепочку вызовов я выяснил, что для создания скриншотов происходит вызов SCR_MakeLevelShot, которая дёргает команду levelshot. Команда проставляет переменные и активирует SCR_MakeScreenShot, которая сделает скриншот сразу после отрисовки следующего кадра.

Но SCR_MakeLevelShot не отрабатывает, ибо в переменную scrshot_request не прописан scrshot_plaque, на который сделана проверка.

Судя по всему, скриншот должен создаваться после вызова CL_ParseServerData. При вызове этой функции прописываются пути до скриншота уровня, а так же происходит какая-то неочевидная проверка с установкой scrshot_plaque.

Больше никто не проставляет scrshot_plaque для создания скриншота уровня.

Не долго думая, я безусловно выставил scrshot_plaque в CL_ParseServerData.

Последствия фикса

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

Дополнение

Я не думаю, что мой фикс правильный. У меня в голове нет понимания, что хотел сказать автор своим кодом и как лучше сделать "застывание" камеры при переключении уровней. Кажется, что скриншот для этого не очень подходит: копировать картинку с видеокарты, писать на диск и потом читать явно работает медленнее, чем сама смена уровня.

@Vladislav4KZ
Copy link
Member

В моих багрепортах levelshots был отключен.
Там чёрный экран при смене карты был по другой причине.

@a1batross
Copy link
Member

Я ничего не понял. Вы можете объяснить проблему более связно, лучше всё-таки попробовав воспроизвести баг с ref_gl?

Фича левелшотов описана в документации на оригинальный Xash3D (надо бы её кстати к нам в Documentation кинуть):

Auto-Levelshots System
The engine supports creation personal levelshots for each level. To enable it, enter the following at the console: "allow_levelshots" "1". The screenshots will be created automatically, but you can substitute your own at any time.

Это всего-лишь генерация скриншотов. При дальнейшей загрузке именно этот скриншот будет использоваться для отрисовки во время первой загрузки уровня: из опции в меню (new game ил создания сервера) или команды map в консоли.

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

@vklachkov
Copy link
Contributor Author

Видимо, я неправильно понял, зачем нужны levelshot'ы. Но всё выглядело именно так, будто это именно они отвечают за изображение, пока загружается уровень. Прошу прощения, не разобрался.

Чёрный экран у меня стабильно воспроизводится и в ref_gl. При переходе между уровнями показывает чёрный экран с надписью "Loading...", как в упомянутых ишью

@vklachkov
Copy link
Contributor Author

MR не имеет смысла. Я его закрою, и создам ишью.

@Vladislav4KZ
Copy link
Member

У меня чёрный экран при смене карты появлялся на Android устройстве с графическим ускорителем Mali.

Если конкретно, Meizu C9 Pro

А на Adreno происходит вот это:
Screenshot_20231012_160403_Xash3D FWGS (Test).png
Снято на Samsung Galaxy A52.

@vklachkov
Copy link
Contributor Author

Я думаю, что нельзя полагаться на то, что рендер не отчистит экран и сам как-то догадается оставить предыдущий кадр при загрузке следующего уровня. В ref gl, как видно, это работает через раз: у меня на Alder Lake GT-1 не работает, на Vega 7 работает, на телефонах вообще как попало. Напрашивается какое-то другое решение, более явное...

@vklachkov vklachkov closed this Oct 12, 2023
@vklachkov vklachkov deleted the try-to-fix-levelshots branch October 12, 2023 10:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants