Pull to refresh
59
0
Александр Ушанов @Megaxela

C++ Программист

Send message
В одном из прошлых уроков было описано, что мы используем CoreProfile GL версии 3.3 и мы это фактически указали в коде директивами
//Мажорная 
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
//Минорная
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); 


После этого перестают работать функции из Fixed Pipeline.
Спасибо. Очень стараюсь закончить полностью всю серию. К сожалению в последнее время сильно насела работа и поэтому времени остается довольно мало и не получается выпускать по статье в неделю.
Да, это имеет смысл. Но тут в общем то само название мало что решает. Все равно все будет работать так как работает. Я внесу изменения в статью по этому поводу.
Хм, хорошо, спасибо. Как только появится возможность — сделаю сноску по этому поводу.
Да, я говорил об этом в первой статье, но решил все таки сохранить иерархию оригинала
Да, вы правы.
Нажмите на имя автора. Там ссылка на все уроки, поскольку там динамическая погрузка страниц.
Промазал с телефона и ответить в общую ветку.
Ну в общем то это правильное замечание, но на него можно ответить, что тут скорее были показаны проблемы создания окна и пути их решения. Создание самого окна будет описано в следующей части
Следующий урок на подходе. Там то и подоспеет «hello world».
На счет вулкана — писал в прошлой статье. Проблему решу в ближайшие 2 месяца и тогда начну готовить туторы по вулкану.
Ну на самом деле для осознания подобных особенностей можно пойти хардкорным путем и пойти читать исходники GLFW. Я думаю когда у меня появится немного свободного времени от переводов и работы я напишу небольшую статейку о подобной «проблеме».
И то и другое. Vulkan гораздо более низкоуровневый. Если проводить аналогии с языками программирования — то Vulkan это ассемблер, а OpenGL — C. Я не думаю, что разрабатывая арканоид вы захотите связываться с распределением полезной нагрузки на очереди видеокарты. Это как разрабатывать графический калькулятор на ASM.
Стоит заметить, что производительность не возрастет в 2 раза при найме двукратного количества сотрудников. В некоторых случаях она вообще может падать.
По поводу хранения const char* у меня в начале так и было, но позже когда пришлось конкатенировать имя функции с вычисляемым именем класса я изменил на std::string. Хотя, вполне логично, что хранить указатель гораздо дешевле, чем целый объект std::string, который в некоторых реализациях имеет pimpl и счетчик копий.
На счет препроцессорного кода — большое спасибо. По причине того, что я не пользовался никогда VS компилятором — я не знаю достоверно как там работает этот макрос (а в стандарте он не указан, что делает его не кросскомпиляторным), ваш код решает эту проблему.
По поводу thread_local написали ниже, обязательно в следующей реализации буду использовать глобальный thread_local переменную.
Как я понимаю при использовании array — это будет массив на стеке?
Вообще я старался не использовать кроссплатформенные функции, но сейчас я начинаю считать что это не очень честно по отношению к программе.
Для решения первой проблемы, которую вы указали выше предложили написать собственный препроцессор, который бы кушал обычные исходники, а выдавал исходники с макросами.
Но вот решить остальные проблемы невозможно без использования платформозависимых функций.
Справедливости ради стоит сказать, что я не знал об указанных вами функциях, так как не очень разбираюсь в winapi. Но я сейчас больше склоняюсь к тому, что бы написать обертку вокруг встроенных и в Linux и в Windows алгоритмов получения stack trace и отслеживания падений.
Кстати на счет Linux. В моем коде была представлена функция signal, работа которой не обязательно должна быть такой, какой я ее ожидал. Нигде не сказано, что Windows, так же как и Linux, получает сигнал SIGSEGV при падении. Пока что он его получает, в будущем может перестать.
P.S.
Как же я ненавижу приложения Habr для Android. Совершенно не удобно писать комментарии и стоит хотя бы попытаться взглянуть на статью или не дай б-г вернуть приложение — все. Комментарий утерян безвозвратно. Пришлось бросить все и идти за компьютер.
Проблема этого подхода в том, что постоянно идет запись в лог. Как известно это довольно затратная операция. И в результате даже после успешного завершения программы лог просто завален вызовами.
Хм, очень интересный механизм. То есть и изначальное исключение сохраняется и дополнительные данные через него передаются. Имеет смысл во время реализации дополнительного препроцессора взять эту функцию на вооружение.
Да, проблем очень много. На счет накладных расходов — это очевидно. Правда расходы на создание объекта на стеке и добавление элемента в связный список не очень велики и в большинстве программ (которые не используют сложные вычисления и не имеют явно очень горячих ф-ций) ничего особо страшного не происходит.
На счет AS-Safe, честно говоря вообще никогда не думал о такой проблеме. Хотя это довольно очевидная проблема разделяемых «глобальных» данных. Спасибо за ссылку и обязательно учту это в будущем.
Касательно std::bad_alloc сказать ничего не могу. Я хоть примерно знаю как работают исключения, но конкретно сказать не могу. На сколько я помню под bad_alloc память выделяется сразу, что бы при возникновении проблем с памятью ее не выделять заново. Но я скорее всего ошибаюсь, поправьте меня если я не прав. Поэтому при вызове std::bad_alloc программа просто вылетит и все. Оно же бросается не через THROW.
На счет отсутствия возможности получения stacktrace из библиотек — я думал, что я написал об этом в статье, но оказалось что нет. Сейчас исправлю.

Проще ли вызывать backtarce/backtrace_symbols под Linux? Да, проще. WinGdb тогда требуется тащить за программой и надеяться yа его вызов при падении.
Но вообще, если интересует, зачем вообще тот маразм, что я написал в статье — то для того, что бы если программа у пользователя упала и он вообще не может объяснить как он этого добился — то можно достать у него лог и посмотреть что вызывалось во время падения. Преимущественно для отлова ошибок во время написания кода.
макрос шел в теле функции первой строчкой _FUNCTION_PROLOGUE(m_sl, ClassName::FuncName);

Да, в моем текущем проекте в тестовой ветке примерно так все и есть. Только без аргументов. В общем то это было сделано для сохранения нормального внешнего вида кода и решения проблемы в операторными скобками.

Но третье отличие не совсем понял?
1

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity