love.thread (Русский)

Available since LÖVE 0.7.0
This module is not supported in earlier versions.

Модуль, позволяющий работать с потоками.

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

Практически все LÖVE объекты (userdata) могут быть переданы другому потоку по каналу связи. Вы можете столкнуться с проблемами параллелизма, если одновременно управляете объектом несколькими потоками.

Когда Поток запустится он загрузит лишь один модуль - love.thread. Любой другой LÖVE модуль может быть загружен через require.

O.png Модули love.graphics и love.window имеют ограничения из-за которых они могут быть использованы только в основном потоке.  


O.png Если вы не определите функцию love.threaderror или не вызовите Thread:getError вы не увидите ошибки, которые произошли во время выполнения потока.  


Типы

Channel (Русский) Объект, который используется для передачи сообщений от потока к потоку. Added since 0.9.0
Thread (Русский) Объект представляющий поток. Added since 0.7.0

Функции

love.thread.getChannel (Русский) Создаёт новый или получает существующий Канал для связи с Потоками. Added since 0.9.0
love.thread.getThread (Русский) Ищет поток и получает его объект. Added since 0.7.0 Removed in 0.9.0
love.thread.getThreads (Русский) Получает массив со всеми потоками. Added since 0.7.0 Removed in 0.9.0
love.thread.newChannel (Русский) Создать безымянный канал. Added since 0.9.0
love.thread.newThread (Русский) Создаёт новый поток из Lua файла или FileData объекта. Added since 0.7.0


Примеры

Простой пример, демонстрирующий как правильно использовать потоки и создавать между ними каналы связи.

-- В переменную threadCode записан код потока. По-хорошему он должен быть
-- помещён в отдельный Lua файл, но для упрощения понимания мы поместили его
-- здесь.
local threadCode = [[
-- Получаем переменные, которые были внесены в thread:start
local min, max = ...

for i = min, max do
    -- Объект Channel используется для коммуникации этого потока с основным,
    -- При каждой итерации поток будет отправлять сообщение, которое
    -- можно прочитать в основном потоке.
    love.thread.getChannel( 'info' ):push( i )
end
]]

local thread -- Объект потока.
local timer  -- Таймер для анимации окружности.

function love.load()
    thread = love.thread.newThread( threadCode )
    thread:start( 99, 1000 )
end

function love.update( dt )
    timer = timer and timer + dt or 0

    -- Убеждаемся, что поток выполняется без ошибок.
    local error = thread:getError()
    assert( not error, error )
end

function love.draw()
    -- Получаем информационный канал и читаем из него сообщение,
    -- полученное из потока, созданного выше
    local info = love.thread.getChannel( 'info' ):pop()
    if info then
        love.graphics.print( info, 10, 10 )
    end

    -- Рисуем анимированный круг, чтобы показать, что созданный поток не влияет на основной.
    love.graphics.circle( 'line', 100 + math.sin( timer ) * 20, 100 + math.cos( timer ) * 20, 20 )
end

Смотрите также

Другие языки