Шукати в цьому блозі

coroutine / червоточина

coroutine

Підтримувані платформи   

Available since version: Gideros 2011.6

Опис:

Механізм червоточини дозволяє поділити  виконання тривалої функції дрібними порціями між кроками основного циклу щоб не тормозити гру обчисленням важкої функції.

Застосування червоточини може виявитися корисним в циклічних програмах.
Наприклад, в відеоіграх працює основний цикл відтворення кадрів, між кроками якого проводиться обробка введення від користувача, моделювання та інша робота.
Оскільки оновлення кадрів гри повинна проводитися рівномірно з частотою близько 25 кадрів в секунду, то виконання тривалих обчислень між кадрами неприпустимо, тому ми ділимо їх на порції з допомогою coroutine .

У даному прикладі алгоритм функції розбитий на три кроки з поверненням управління після кожного кроку. В кожному кроці основного циклу програми проводиться продовження виконання функції, якщо вона ще не завершила роботу остаточно.

Приклади:

-- ***************************************************************************************
 
-- ТЯЖКА ФУНКЦІЯ ПОДІЛЕНА ЧЕРВОТОЧИНАМИ
function f(x)
    local step = 1
    print("Стартовий скачок червоточини= "..step.." з x = "..x)
    -- ...
    -- Повернення управління, проміжних результатів і очікування продовження виконання.

    x = coroutine.yield(step)
    step = step + 1
    print(" проміжний скачок= "..step.." з x = "..x)
    -- ...
    -- Повернення управління, проміжних результатів і очікування продовження виконання
    x = coroutine.yield(step)
    step = step + 1
    print("фінішний скачок= "..step.." з x = "..x)
    -- ...
    -- Завершення виконання і повернення результатів
    return step
end
-- ***************************************************************************************
n = 5
-- створення червоточини cr = coroutine.create(f)


-- ОСНОВНИЙ ЦИКЛ ГРИ for i=1,n do print("Основний цикл "..i)
 -- Якщо червоточина активна   
    if coroutine.status(cr) ~= "dead" then
        -- повертаємось чревоточиною назд  і передаємо потрібні параметри
        b,res = coroutine.resume(cr, i)
        print("червоточина переміщає до основного циклу: b = ", b,", res = " ,res)
    end
    -- ...  

end

 



  Методи
  coroutine.create
  coroutine.resume
  coroutine.status
  coroutine.wrap
  coroutine.yield

Немає коментарів:

Дописати коментар