1. Для общения на форуме, в чате или личной переписке наличие аватара ОБЯЗАТЕЛЬНО!

Вопрос-ответ

Тема в разделе "S.T.A.L.K.E.R.", создана пользователем Доделкин, 8 дек 2010.

  1. Dennis Chikin

    Dennis Chikin Модератор

    250
    78
    3 мар 2019
    Мужской
    "после выхода из цикла "a" автоматически будет уничтожена и память освободиться, или хотя-бы так:"

    и даже это - неправда. Поведение сборщика мусора не стандартизировано.
    Единственно, что известно в данном случае, это то, что при каждом
    local a = a+1 будет происходить поиск свободной памяти и ее выделение для объявленной переменной.
     
  2. Баба Яга

    Баба Яга Ветеран

    137
    19
    13 апр 2019
    Если это действительно так в сталкере (игре) - то тогда печаль ...
    Потому-что для чистого Lua, это именно так и происходит, уборщик уничтожает переменную после выхода из блока, вот пример и результат:
    Код:
    for i=1,3 do
      local a = i+1
      print("переменная A -> внутри цикла: ", a)
    end
    print("переменная A -> снаружи цикла: ", a)
    результат работы скрипта:
    Код:
    переменная A -> внутри цикла:     2
    переменная A -> внутри цикла:     3
    переменная A -> внутри цикла:     4
    переменная A -> снаружи цикла:     nil
    >Exit code: 0
    как видим - уборщик сразу убил переменную.

    P.S. Проверил множество раз в игре, так вот
    - совершенно не обоснованное утверждение, в игре, как оказалось всё тоже отлично работает и сборщик мусора сразу убивает переменную, вот код и результат:
    Код:
    for i=1,3 do
      local ah = i + 1
      get_console():execute("load ~~~ переменная A -> внутри цикла: " .. tostring(type(ah)))
    end
    get_console():execute("load ~~~ переменная A -> снаружи цикла: " .. tostring(type(ah)))
    get_console():execute("flush")
    а вот и результат, как видим, в игре тоже всё ок, переменная уничтожена:
    Код:
    ! Cannot find saved game ~~~ переменная a -> внутри цикла: number
    ! Cannot find saved game ~~~ переменная a -> внутри цикла: number
    ! Cannot find saved game ~~~ переменная a -> внутри цикла: number
    ! Cannot find saved game ~~~ переменная a -> снаружи цикла: nil
    :drinks:
     
    Последнее редактирование: 27 сен 2019
  3. Dennis Chikin

    Dennis Chikin Модератор

    250
    78
    3 мар 2019
    Мужской
    Ничего он не убрал. Просто переменная вне области видимости.
    А что происходит на самом деле - это надо брать исходник именно ЭТОГО луа и смотреть. И то не факт, поскольку выделением/освобождением памяти занимается операционная система.
     
  4. Баба Яга

    Баба Яга Ветеран

    137
    19
    13 апр 2019
    Моё понимание (тыц - добавил в посте код и результат выполненный в сталкере - всё отлично чистится) процесса "убивания" переменных и освобождения памяти - основано на словах людей которые:
    1) написали сам язык Lua
    2) написали книги по Lua (которые я и изучаю в данный момент)
    3) на том, что я вижу сам на живых примерах, а именно то - что переменная таки уничтожается уборщиком (что подтверждает nil при её вызове), а именно об этом создатели языка и пишут: "что переменная убирается уборщиком и освобождается память".
    Если есть другие предложения с примерами кода (что переменная не уничтожается и память не освобождается) - рассмотрел бы с удовольствием, т.к. мне очень интересен язык Lua.
    :yes:
    P.S. Кстати, есть переменная или нет - можно проверить через CheatEngeene(и не только) - если после уничтожения адрес будет пуст - значит таки память освобождается. :drinks:

    случайно написал в коде:
    Код:
    get_console():execute( "load ~~~ ", x )
    и выполнил, посмотрел лог - ни ошибок, ни вылетов, хм, думаю, странно, сделал так и выполнил:
    Код:
    get_console():execute("load ~~~ ПОЧЕМУ НЕТ ВЫЛЕТА? ", "так можно", "и так можно", "а вот почему - не знаю")
    получил вывод:
    Код:
    ! Cannot find saved game ~~~ ПОЧЕМУ НЕТ ВЫЛЕТА?
    т.е. в лог вывелось только до первой запятой, а остальное - нет, но, ошибок нет и вылетов тоже. Странно. Знает кто по этому делу?... :mda:

    Если скриптово поставить игру на паузу используя -> device():pause( true ) -> то игра НЕ становится полноценно на паузу, а именно, звуки, музыка - работают дальше и возможно ещё что-то, не знаю. Т.е. если у костра кто-то рассказывает анекдоты - то после постановку на паузу через скрипт - он будет продолжать рассказывать анекдоты, хотя картинка - замирает. А вот если кнопкой "PAUSE" поставить игру на паузу, то останавливается всё.
    Кто знает почему так? И как скриптово ПОЛНОСТЬЮ поставить игру на паузу так-же как и кнопкой? Это вообще возможно?

    Обнаружил, что в одной переменной в pstor ГГ можно хранить 245 символов (type=string), на 246-ом сразу вылет. Может кому пригодится, а то нигде не нашёл, пришлось самому экспериментировать.
    Заодно (больше для себя, чтоб не потерять, тут оно точно нигде не денется, а может и пригодится кому), как добавить в pstor ГГ свою переменную без всяких посторонних скриптов и функций:
    Код:
    -- записываем новую переменную в pstor ГГ
    db.storage[0].pstor["zzz"] = 0 -- или = "" , или = {}
    -- удаляем переменную из pstor ГГ и из памяти
    db.storage[0].pstor["zzz"] = nil
    Чтобы эта переменная там и осталась при следующей загрузке игры, нужно - сохраниться.

    P.S. Давно хотел сделать в игре - записную книжку, кому интересно - подключайтесь! Идея в следующем: создаём записную книжку (картинку там и т.д.) в инвентаре, нажимаем на неё - открывается окно, в него пишем текст что надо сделать, чтобы не забыть, это дело сохраняется в pstor ГГ, закрываем записную книжку - после закрытия игра ставится на паузу и через консоль (скриптово) сохраняется.
     
    Последнее редактирование: 27 сен 2019
  5. Dennis Chikin

    Dennis Chikin Модератор

    250
    78
    3 мар 2019
    Мужской
    1. В lua нет средств, чтобы посмотреть, что делает уборщик. Работа уборщика в стандарте не определена. Из общих соображение никто не будет его запускать после выполнения КАЖДОГО оператора, и даже после завершения цикла - тоже никто не будет. Более того, как показывает практика, возврат из функции сам по себе его тоже НЕ вызывает. Еще раз: только просмотром конкретного исходника.

    2. Реакция движка сталкера на набираемое в консоли не имеет отношения к lua. Сталкер же на бессмысленные сочетания символов в консоли не реагирует никак, на команду загрузить файл с несуществующим именем выдает в лог сообщение о том, что такого файла не существует.
    get_console():execute() передает в консоль ОДНУ строку.

    3. device() - это, внезапно, экран, да.
     
  6. Баба Яга

    Баба Яга Ветеран

    137
    19
    13 апр 2019
    Я этого не знал. Хорошо, так есть возможность скриптово поставить игру на паузу полноценно так-же как кнопкой "pause", или скриптово можно ставить на паузу только изображение?

    Читал-читал - ничего вот с этого не понял, это о чём и к чему относится? ... :mda:

    Ребята - подскажите!
    На карте есть, например, level_vertex_id = 33555
    1) с помощью каких функций можно узнать координаты углов этого вертекса?
    2019-09-28_200220.jpg
     
    Последнее редактирование модератором: 28 сен 2019

Поделиться этой страницей