Понедельник, 23 Декабря 2024, 04:23

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Утечка памяти? (GMS2)
useruserДата: Понедельник, 02 Октября 2017, 07:18 | Сообщение # 1
был не раз
Сейчас нет на сайте
Скорее всего в коде объекта присутствует ошибка, вызывающая утечку памяти.
Поможете её найти?


GMS2 v2.1.0.136, Win7x64.
Объект objects_special_camera_create_and_set Его задача - создание камеры и вида.
Объект не persistent. Он помещен в 2 комнаты (пока 2 комнаты в проекте, планирую помещать во все).
Если объект помещен в одну комнату - ошибки не возникало.
Если объект помещен в две комнаты и осуществляется переход из первой комнаты во вторую (goto_room) - возникает ошибка.

Ошибка появляется в 20% случаев как зависание при запуске игры. Темный экран приложения и зависание.
Ошибка появляется в 40% случаев как зависание при завершении игры. При нажатии на крестик-закрыть окно или выполнении кода game_end(); игра зависает.
Ошибка не появляется во время игры. Хотя игра пока - 2 комнаты и одно меню.

Windows error


GMS2 output


Код событий
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

view_camera[0] = camera_create_view(display_width_left, display_height_top, display_width,display_height, 0, 0, 0, 0, 0, 0);
view_set_xport(0, 0);
view_set_yport(0, 0);
view_set_wport(0, display_width);
view_set_hport(0, display_height);
view_visible[0] = true;
view_enabled = true;

//Отключаем и перерисовываем поверхность
application_surface_draw_enable(false);
//Изменяем поверхность в соответствии с настройками
surface_resize(application_surface, display_width, display_height);


Clean Up
Код

//Уничтожаем камеру
camera_destroy(view_camera[0]);


Post-Draw
Код

//Объект включает отображение поверхности
draw_surface_ext(application_surface, 0, 0, 0, 0, 0, 0, 0);
application_surface_draw_enable(true);


Сообщение отредактировал useruser - Понедельник, 02 Октября 2017, 07:21
maker-rusДата: Понедельник, 02 Октября 2017, 07:48 | Сообщение # 2
Гений
Сейчас нет на сайте
useruser,
Цитата useruser ()
camera_create_view(display_width_left, display_height_top, display_width,display_height, 0, 0, 0, 0, 0, 0);


Что за "нулевой объект", за которым нужно следить камере (выделил жирным)?
useruserДата: Понедельник, 02 Октября 2017, 10:26 | Сообщение # 3
был не раз
Сейчас нет на сайте
Цитата maker-rus ()
Что за "нулевой объект", за которым нужно следить камере (выделил жирным)?

И правда.
object The object ID (or instance ID) for the camera view to follow (default is -1, no object).
Изменил на -1.
Код
camera_create_view(display_width_left, display_height_top, display_width,display_height, 0, -1, 0, 0, 0, 0);

Тот же результат.

Заметил, что ошибка происходит чаще при использовании графики.
Добавил простейший код меню с анимацией и начало чаще "вылетать" при запуске и завершении игры.
Если не переходить во вторую комнату - то вылетов нет. Разместил меню в первой комнате. Не вылетает.
Я думаю, что то не то с камерой.

Вот кстати весь проект
https://cloud.mail.ru/public/RxXf/cdXbapP2W


Сообщение отредактировал useruser - Понедельник, 02 Октября 2017, 10:43
maker-rusДата: Понедельник, 02 Октября 2017, 22:46 | Сообщение # 4
Гений
Сейчас нет на сайте
Цитата useruser ()
draw_surface_ext(application_surface, 0, 0, 0, 0, 0, 0, 0);

Цитата
You should ALWAYS check that a surface exists using surface_exists before referencing them directly. For further information see Surfaces. © Yo-Yo Games

Если верить документации, перед использованием этой функции Вы должны проверить существование поверхности, прежде чем указывать на нее в функции. К тому же в эту функцию первым элементом должен входить индекс, а у Вас переменная возвращает точку. Что бы вернуть индекс поверхности, Вам её надо создать с помощью:
Цитата
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
useruserДата: Вторник, 03 Октября 2017, 07:05 | Сообщение # 5
был не раз
Сейчас нет на сайте
maker-rus спасибо за ответы

Цитата maker-rus ()
Если верить документации, перед использованием этой функции Вы должны проверить существование поверхности

Да знаю, читал. Но на официальном форуме мне посоветовали писать так.

Цитата 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
maker-rusДата: Вторник, 03 Октября 2017, 18:58 | Сообщение # 6
Гений
Сейчас нет на сайте
Цитата useruser ()
application_surface - поверхность по умолчанию. Её не надо создавать. Она уже есть.

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

Цитата useruser ()
//Переходим в следующую комнату
room_goto_next();

Я немного почитал про GML в GMS, так вот, бытует мнение, что скриптовой движок стал привередлив и требует для себя проверки, и у меня появилась мысль, заключается она в следующем:
Код

if room_exists(room_next(room)){
    room_goto_next();
}

Попробуй вот так сделать.


Сообщение отредактировал maker-rus - Вторник, 03 Октября 2017, 18:58
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг