- 416
- 358
НЕБЕЗОПАСНАЯ ХУЙНЯ
GIF in mimgui - это библиотека написанная нейросетью, которая позволяет воспроизводить gif в окне mimgui.
Пример использования::
local imgui = require 'mimgui'
local giflib = require 'GIFinmimgui'
local ffi = require 'ffi'
local vkeys = require 'vkeys'
local wm = require 'windows.message'
local new, str, sizeof = imgui.new, ffi.string, ffi.sizeof
local renderWindow = new.bool()
local sizeX, sizeY = getScreenResolution()
imgui.OnInitialize(function()
imgui.GetIO().IniFilename = nil
end)
local newFrame = imgui.OnFrame(
function() return renderWindow[0] end,
function(player)
imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
imgui.SetNextWindowSize(imgui.ImVec2(220, 200), imgui.Cond.FirstUseEver)
imgui.Begin("Main Window", renderWindow)
imgui.Text("Hello")
giflib.draw('moonloader/resource/demo.gif', 256, 256)
imgui.End()
end
)
function main()
addEventHandler('onWindowMessage', function(msg, wparam, lparam)
if msg == wm.WM_KEYDOWN or msg == wm.WM_SYSKEYDOWN then
if wparam == vkeys.VK_X then
renderWindow[0] = not renderWindow[0]
end
end
end)
wait(-1)
end
Описание тоже написано нейросетью
Что она делает
- Загружает GIF через Windows GDI+ (читает кадры, задержки между кадрами)
- Каждый кадр конвертирует во временный PNG “в памяти”
- Создает из этого PNG текстуру для mimgui (CreateTextureFromFileInMemory)
- Рисует текущий кадр через giflib.draw(path, w, h)
- Подгружает кадры по одному “за кадр”, чтобы не было фриза
Где хранится то, что “декодировано”
PNG-файлы на диск не пишутся.Кадр сохраняется в PNG-байты как Lua-строка только на момент создания текстуры, потом эта строка становится не нужна и уйдет сборщиком мусора.
Основная память уходит в:
- VRAM: массив текстур (по одной на кадр)
- RAM: таблицы Lua с метаданными (кадры, задержки, счетчики) и, иногда, зеркала ресурсов драйвера
Как работает кэш
- Кэш ключуется по path (один путь = один объект в кэше)
- Если ты снова рисуешь тот же GIF, он не перечитывается заново, пока не выгружен
Как работает выгрузка
Когда окно закрыто и giflib.draw(path, ...) перестает вызываться:- библиотека через unload_after секунд вызывает imgui.ReleaseTexture(tex) для всех кадров и очищает frames
- тем самым освобождается GPU-память (на практике драйвер может освободить не “в ту же миллисекунду”, но обычно быстро)
Почему при первом открытии вместо гифки “Loading…”?
Потому что загрузка идет инкрементально: по 1 кадру за тик (или сколько ты поставишь в load_steps_per_frame). Это специально, чтобы не висла игра.Почему память не падает мгновенно после закрытия окна?
- стоит таймер unload_after
- драйвер GPU и сама игра могут держать свои кэши
- Lua GC не обязан прямо сейчас вычищать временные строки/таблицы
Можно выгрузить сразу принудительно?
Да:- giflib.unload(path) для одной
- giflib.clear() для всего кэша