По отзывам трудящихся я обнаружил многия говнокоды. Я их давил, давил, давилдавилдавил!
Подробнее расскажу с выкладом результатов и отвечу на комментарии завтра. Сегодня мозг опух от стахановского труда.
Добавлено спустя 19 часов 58 минут 51 секунду:Сражался с говнокодами аки Лаокоон со змиями. Довёл до состояния когда игровой модуль гарантированно падает.
Мозг опух. Продолжу завтра.
Добавлено спустя 14 часов 11 минут 39 секунд:Обновил:
http://chebmaster.com/downloads/chentrah_test019.zipставбте по чистому, там куча исходников была переименована. Порядок наводил в этой авгиевой гаврюшне.
Добавлено спустя 22 минуты 8 секунд:Перелопатил системные меню и обработку исключений.
Заметьте, что у этой версии режим разработчика по умолчанию выключен, и она показывает скример об ошибке вместо синего экрана смерти (там ещё мой аватар должен прилетать !внезапно!, шмякаться об экран и сползать из поля зрения. Потом доделаю
)
Добавился красный экран сметри при фатальных ошибках и автовылет при фатальных ошибках с оставление завещания, показываемого при следующем запуске. Но это вы вряд-ли увидите, хряпнуться должно действительно всерьёз.
скалогрыз писал(а):очевидно, нужна утилита просмотра лога,
Не. Офонарел от того, какие коленца говнокод выкидывал, и повис при попытке придумать, как это исправить
Иногда восстановление точки не прокатывает, и останавливается на гордом "Загрузка 8/9"
Весьма элегантный дедлок при актуализации ресурсов
До этой части руки пока не дошли, буду перетряхивать всерьёз и с песней.
Короче, ресурсы (assets) делятся на два вида: обязательные (necessary) и необязательные (optional). Пока все обязательные не будут актуализированы, модуль стоит на паузе и отображает индикатор загрузки. По идее, в таковых должны быть только нижние лоды, чтобы игра начиналась как можно сразу, а потом в фоне подгружала текстуры нормального разрешения (идею я честно скоммуниздил у Unreal Engine).
Но! Необязательные ресурсы начинают актуализироваться только когда обязательных не осталось. А ресурсы могут зависет друг от друга и ждать друг друга. Например, картинка (точнее, её фоновая задача) ждёт файловый менеджер, а файловый менеджер ждёт пока пропарсятся все pk3 файлы.
В данном случае каким-то образом получалось, что текстура (обязательная) ждёт картинку (необязательную) - и здравствуй, жопа, дедлок.
при "откате" сферы и фон почему-то моргают в течении первых нескольких секунд.
Вы таки не поверите, какой *страшный* говнокод там обеспечивал этот эффект "мгновенное зачернение с последующим плавным проявлением". Причём, размазанный вдоль всей программы, с частями в игровой DLL. Переделал с глобальной переменной на функцию API матки, и добавил пару костылей (в частности, пропускается первый SwapBuffers после начала затемнения)
в полноэкранном режиме судя по всему, освещение ярче, чем в окном,
Это обман зрения. Кубмапа очень тёмная, теряется на фоне соседних белых окон.
P.S. При отключённом режиме разработчика сообщения консоли не показываются на экране, пока не включишь её (ScrollLock). А механизм "всплывающих уведомлений" я пока не сделал.
Добавлено спустя 13 часов 5 минут 46 секунд:Отчаялся, и с тяжёлым сердцем решил бросить поддержку Windows 98
Причина: древнедрайверы OpenGL - это глюкавая дыра, которая высосет все мои производительные силы и не подавится.
Сейчас пробовал на целевой машине с Windows XP (98-я упала, лень переустанавливать). И что вы думаете? С детонатором 93 от 2006-го сказало: а OpenGL 2.1 - где? Переставил на детонатор 165 от 2007-го. Вроде, бы 2.1.1, да? А вот хрен. Сказало: а GL_ARB_framebuffer_object - где?
Нет, там есть GL_EXT_framebuffer_object, но я прикинул разницу между ними, и сразу приувял
Раньше был мой самописный модуль для OpenGL, который пытался прозрачно для программы разрулить эти два расширения, загружая функции не под своими именами. Но писать собственные заголовки OpenGL, ручками добавляя каждую новую функцию когда понадобится - это слишкомм жёсткий мазохизм даже для меня. Перешёл на заголовки, цельнотянутые с фри паскаля. Ну, и как побочный эффект потерял шаманистику с FBO.
З.Ы. Зачем свои заголовки: DLL игрового модуля ничего не знает о DLL OpenGL. Обращается к матке, та уже обращается к оглю и возвращает адрес функции. Смысл: 1. полностью системно-независимый код игрового модуля. 2. Более гибкий механизм загрузки нужной OpenGL DLL. Кажется, в линуксе раньше был с этим эпический геморрой.
Вообще, движок устроен так, что умеет пробовать несколько разных DLL пока не найдёт такую, которая загрузится. В былые времена, в линуксе надо было перебирать:
libGL.so
libGL.so.2
libGL.so.1.2
libGL.so.1
, OpenGL 2.0 могла оказаться под любым из этих имён, в зхависимости от желания левой пятки сосдателей дистрибутива. А также,
libopenal.so
libopenal.so.0
libopenal.so.1
И даже если это всё в прошлом, надо перебирать
xinput1_3.dll
xinput9_1_0.dll
(геймпад Xbox 360), ибо в висте и семёрке по дефолту идёт другая версия, чем накатывается установкой всяческих игр с редистом директикса.