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.
Модули love.graphics и love.window имеют ограничения из-за которых они могут быть использованы только в основном потоке. |
Если вы не определите функцию love.threaderror или не вызовите Thread:getError вы не увидите ошибки, которые произошли во время выполнения потока. |
На Android устройствах вы должны убедиться, что все потоки были завершены ДО выхода/перезапуска, иначе при следующем запуске LOVE выдаст ошибку! |
Типы
Channel (Русский) | Объект, который используется для передачи сообщений от потока к потоку. | 0.9.0 | |
Thread (Русский) | Объект представляющий поток. | 0.7.0 |
Функции
love.thread.getChannel (Русский) | Создаёт новый или получает существующий Канал для связи с Потоками. | 0.9.0 | |
love.thread.getThread (Русский) | Ищет поток и получает его объект. | 0.7.0 | 0.9.0 |
love.thread.getThreads (Русский) | Получает массив со всеми потоками. | 0.7.0 | 0.9.0 |
love.thread.newChannel (Русский) | Создать безымянный канал. | 0.9.0 | |
love.thread.newThread (Русский) | Создаёт новый поток из Lua файла или FileData объекта. | 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
Смотрите также
Другие языки
Dansk –
Deutsch –
English –
Español –
Français –
Indonesia –
Italiano –
Lietuviškai –
Magyar –
Nederlands –
Polski –
Português –
Română –
Slovenský –
Suomi –
Svenska –
Türkçe –
Česky –
Ελληνικά –
Български –
Русский –
Српски –
Українська –
עברית –
ไทย –
日本語 –
正體中文 –
简体中文 –
Tiếng Việt –
한국어
More info