Скорее всего в коде объекта присутствует ошибка, вызывающая утечку памяти. Поможете её найти?
GMS2 v2.1.0.136, Win7x64. Объект objects_special_camera_create_and_set Его задача - создание камеры и вида. Объект не persistent. Он помещен в 2 комнаты (пока 2 комнаты в проекте, планирую помещать во все). Если объект помещен в одну комнату - ошибки не возникало. Если объект помещен в две комнаты и осуществляется переход из первой комнаты во вторую (goto_room) - возникает ошибка.
Ошибка появляется в 20% случаев как зависание при запуске игры. Темный экран приложения и зависание. Ошибка появляется в 40% случаев как зависание при завершении игры. При нажатии на крестик-закрыть окно или выполнении кода game_end(); игра зависает. Ошибка не появляется во время игры. Хотя игра пока - 2 комнаты и одно меню.
Windows error
Signature of the problem: The name of the problem event: APPCRASH Application name: Runner.exe Application version: 99.99.99.99 Application timestamp: 59a526a1 Module name with error: Runner.exe The version of the module with an error: 99.99.99.99 Timestamp of the module with error: 59a526a1 Exception code: c0000005 Offset exception: 00071cb0 OS version: 6.1.7601.2.1.0.256.1 Language code: 1049 Additional Information 1: 0a9e Additional information 2: 0a9e372d3b4ad19135b953a78882e789 Additional Information 3: 0a9e Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
Read the privacy statement on the Internet: http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0419
If the privacy statement on the Internet is not available, check out its local version: C: \ Windows \ system32 \ en-US \ erofflps.txt
GMS2 output
Saving project to: D:\Облако mail.ru\Личные папки\Евгений\Синхронизируемые файлы и папки\GameMaker Studio 2\My game\Проект\24\game\game.yyp "C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.1.0.136/bin/Igor.exe" -options="C:\Users\User\AppData\Local\GameMakerStudio2\GMS2TEMP\build.bff" -- Windows Run
Loaded Macros from C:\Users\User\AppData\Roaming\GameMakerStudio2\Cache\GMS2CACHE\game_57A3FC7A\macros.json Options: C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.1.0.136\bin\platform_setting_defaults.json Options: C:\Users\User\AppData\Roaming/GameMakerStudio2\2405384_1231723\local_settings.json Options: C:\Users\User\AppData\Roaming\GameMakerStudio2\Cache\GMS2CACHE\game_57A3FC7A\targetoptions.json C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.1.0.136/bin/GMAssetCompiler.exe /c /zpex /mv=1 /iv=0 /rv=0 /bv=0 /j=4 /gn="game" /td="C:\Users\User\AppData\Local\GameMakerStudio2\GMS2TEMP" /cd="C:\Users\User\AppData\Roaming\GameMakerStudio2\Cache\GMS2CACHE\game_57A3FC7A" /zpuf="C:\Users\User\AppData\Roaming/GameMakerStudio2\2405384_1231723" /m=windows /tgt=64 /nodnd /cfg=default /o="C:\Users\User\AppData\Local\GameMakerStudio2\GMS2TEMP\game_79DFBCEC_VM" /sh=True /optionsini="C:\Users\User\AppData\Local\GameMakerStudio2\GMS2TEMP\game_79DFBCEC_VM\options.ini" /cvm /baseproject="C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.1.0.136\BaseProject\BaseProject.yyp" "D:\Облако mail.ru\Личные папки\Евгений\Синхронизируемые файлы и папки\GameMaker Studio 2\My game\Проект\24\game\game.yyp" /preprocess="C:\Users\User\AppData\Roaming\GameMakerStudio2\Cache\GMS2CACHE\game_57A3FC7A" Reading project file....D:\Облако mail.ru\Личные папки\Евгений\Синхронизируемые файлы и папки\GameMaker Studio 2\My game\Проект\24\game Reading project file....C:\ProgramData\GameMakerStudio2\Cache\runtimes\runtime-2.1.0.136\BaseProject Reading config delta 'D:\Облако mail.ru\Личные папки\Евгений\Синхронизируемые файлы и папки\GameMaker Studio 2\My game\Проект\24\game\options\main\inherited\options_main.inherited.yy' finished.
C:\Windows\system32\cmd.exe DONE (0) DoSteam Igor complete. [Run] Run game Options: C:\Users\User\AppData\Roaming\GameMakerStudio2\Cache\GMS2CACHE\game_57A3FC7A\MainOptions.json C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.1.0.136/windows/Runner.exe -game "C:\Users\User\AppData\Local\GameMakerStudio2\GMS2TEMP\game_79DFBCEC_VM\game.win" Attempting to set gamepadcount to 12 DirectX11: Using hardware device Total memory used = 104006085(0x063301c5) bytes
C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.1.0.136/windows/Runner.exe exited with non-zero status (-1073741819) elapsed time 00:00:37.8991677s for command "C:\ProgramData/GameMakerStudio2/Cache/runtimes\runtime-2.1.0.136/bin/Igor.exe" -options="C:\Users\User\AppData\Local\GameMakerStudio2\GMS2TEMP\build.bff" -- Windows Run started at 09/27/2017 16:10:26 FAILED: Run Program Complete
Код событий Create
Код
//ОБЪЕКТ УСТАНАВЛИВАЕТ, НАСТРАИВАЕТ И УДАЛЯЕТ КАМЕРУ //Получаем ширину и высоту экрана пользователя display_width=display_get_width(); display_height=display_get_height(); //Позиция камеры (левый верхний угол) display_width_left=(2560-display_width)/2; //x display_height_top=(1440-display_height)/2; //y
//Отключаем и перерисовываем поверхность application_surface_draw_enable(false); //Изменяем поверхность в соответствии с настройками surface_resize(application_surface, display_width, display_height);
Заметил, что ошибка происходит чаще при использовании графики. Добавил простейший код меню с анимацией и начало чаще "вылетать" при запуске и завершении игры. Если не переходить во вторую комнату - то вылетов нет. Разместил меню в первой комнате. Не вылетает. Я думаю, что то не то с камерой.
Вот кстати весь проект https://cloud.mail.ru/public/RxXf/cdXbapP2W
Сообщение отредактировал useruser - Понедельник, 02 Октября 2017, 10:43
Если верить документации, перед использованием этой функции Вы должны проверить существование поверхности, прежде чем указывать на нее в функции. К тому же в эту функцию первым элементом должен входить индекс, а у Вас переменная возвращает точку. Что бы вернуть индекс поверхности, Вам её надо создать с помощью:
Цитата
surface_create(w, h);
выглядеть это будет примерно так:
Цитата
mySurface = surface_create(800, 600);
Цитата
draw_surface_ext(mySurface, 0, 0, 0, 0, 0, 0, 0);
Потому что на данный момент, непонятно с какой Вы поверхностью работаете.
Сообщение отредактировал maker-rus - Понедельник, 02 Октября 2017, 23:07
Если верить документации, перед использованием этой функции Вы должны проверить существование поверхности
Да знаю, читал. Но на официальном форуме мне посоветовали писать так.
Цитатаmaker-rus ()
Потому что на данный момент, непонятно с какой Вы поверхностью работаете.
application_surface - поверхность по умолчанию. Её не надо создавать. Она уже есть.
Анализируя ошибку вот что ещё вышло Возможно, ошибка связана с камерой, но.... В моёй игре у меня пока две комнаты. В каждой из которых есть камера. Вот код комнат.
Комната 1
Код
//Создаем глобальный массив с основными настройками (один раз только в первой комнате ) create_main_settings_array();
//Показываем логотип show_main_logo();
//Показываем бэкграунд show_main_background();
//Переходим в следующую комнату room_goto_next();
Комната 2
Код
//Показываем логотип show_main_logo();
//Показываем бэкграунд show_main_background();
//Показываем главное меню show_main_menu();
С таким кодом комнат часто возникает ошибка.
Первая комната будет использоваться позже. Т.е. я наполню её контентом потом. Пока комната 1 вызывает пару скриптов и сразу осуществляется переход в комнату 2. В комнате 2 меню.
Но если изменить код первой комнаты, убрать там
Код
//Переходим в следующую комнату room_goto_next();
и разместить в этой комнате таймер или объект для перехода в комнату 2, то ошибка появляться не будет. По крайней мере пока не появлялась.
Выходит, что быстрое выполнение кода в комнате 1 (наверно доли секунды) и почти мгновенный переход в комнату 2 вызывает ошибки?
Сообщение отредактировал useruser - Вторник, 03 Октября 2017, 07:07
application_surface - поверхность по умолчанию. Её не надо создавать. Она уже есть.
Не совсем так, на сколько я понимаю, это глобальное пространство, использовать глобальные пространства в игре очень дурная практика, каждая комната должна иметь изолированную среду от других комнат, иначе это может приводить к непредвиденным и сложно уловимым ошибкам, хотя в данном случае, врятли в этом ошибка.
Цитатаuseruser ()
//Переходим в следующую комнату room_goto_next();
Я немного почитал про GML в GMS, так вот, бытует мнение, что скриптовой движок стал привередлив и требует для себя проверки, и у меня появилась мысль, заключается она в следующем:
Код
if room_exists(room_next(room)){ room_goto_next(); }
Попробуй вот так сделать.
Сообщение отредактировал maker-rus - Вторник, 03 Октября 2017, 18:58