Application lifecycle - kuimoani/defold GitHub Wiki
#Application lifecycle μ΄ λ¬Έμλ Defoldμ κ²μκ³Ό μ΄ν리μΌμ΄μ μ λΌμ΄νμ¬μ΄ν΄μ λν΄ μμΈν μμλ΄ λλ€.
Defoldμ μ΄ν리μΌμ΄μ μ΄λ κ²μμ λΌμ΄νμ¬μ΄ν΄μ λ§€μ° λ¨μν©λλ€. μμ§μ μ΄κΈ°ν(initialization), μ λ°μ΄νΈ 루ν(update loop: μ¬κΈ°μ λλΆλΆμ μκ°μ΄ μλΉλ¨), λ§λ¬΄λ¦¬(finalization) μΈ λ¨κ³λ‘ μ§νν©λλ€.

λλΆλΆμ κ²½μ°μ Defold λ΄λΆ λμμ κΈ°λ³Έμ μΈ μ΄ν΄λ§ ν΄λ λμ§λ§, μ΄ μμ μ μ νν μμλ₯Ό μ΄ν΄νμ§ λͺ»νλ©΄ λκ΄μ λΉ μ§ μλ μμ΅λλ€. μ΄ λ¬Έμλ κ²μμμ§μ΄ μ΄λ»κ² μ΄ν리μΌμ΄μ μ μμλΆν° λκΉμ§ μ€ννλμ§ μ€λͺ ν©λλ€
μ΄ν리μΌμ΄μ μ μμ§μ μ€ννλλ° νμν λͺ¨λ κ²μ μ΄κΈ°ν(initialization)νλ©΄μ μμν©λλ€. main 컬λ μ μ λ‘λνκ³ init() Lua ν¨μκ° μ‘΄μ¬νλ λ‘λλ λͺ¨λ μ»΄ν¬λνΈ(μ€ν¬λ¦½νΈ μ»΄ν¬λνΈλ GUIμ€ν¬λ¦½νΈκ° μλ GUI μ»΄ν¬λνΈ)λ€μ init() ν¨μλ₯Ό νΈμΆν©λλ€. μ΄λ₯Ό ν΅ν΄ 컀μ€ν νκ² μ΄κΈ°νλ₯Ό ν μ μμ΅λλ€.
λ€μμΌλ‘ μ΄ν리μΌμ΄μ μ μ λ°μ΄νΈ 루ν(update loop)μ μ§μ ν΄μ μ΄ν리μΌμ΄μ μλͺ μ£ΌκΈ° λλΆλΆμ λ¨Έλ¬Όκ² λ©λλ€. λ§€ νλ μλ§λ€, μΆκ°λ κ²μ μ€λΈμ νΈμ μ»΄ν¬λνΈλ€μ΄ μ λ°μ΄νΈ λλ©° μ€ν¬λ¦½νΈλ GUI μ€ν¬λ¦½νΈμμλ update() ν¨μκ° νΈμΆλ©λλ€. μ λ°μ΄νΈκ° λ°λ³΅λλ λμ λ©μΈμ§λ μμ μ μΈ‘μ λ°μ‘λλ©°, μ¬μ΄λλ₯Ό νλ μ΄νκ³ κ·Έλν½μ λ λλ§ ν©λλ€.
μ΄ν리μΌμ΄μ λΌμ΄νμ¬μ΄ν΄μ μ’ λ£ν΄μΌ νλ νΉμ μμ μμλ μ΄ν리μΌμ΄μ μ μ’ λ£νκΈ° μ§μ μ μμ§μ μ λ°μ΄νΈ 루ν λ¨κ³λ₯Ό λΉ μ Έλμ λ§λ¬΄λ¦¬(finalization) λ¨κ³λ‘ μ§μ ν©λλ€. μ¬κΈ°μ λ‘λλ λͺ¨λ κ²μ μ€λΈμ νΈμ μμ λ₯Ό μ€λΉνκ² λ©λλ€. λͺ¨λ μ€λΈμ νΈ μ»΄ν¬λνΈμ final() ν¨μκ° νΈμΆλλ―λ‘ μ¬κΈ°μ 컀μ€ν ν 리μμ€ ν΄μ μμ μ ν μ μμ΅λλ€. λͺ¨λ μ€λΈμ νΈκ° μμ λ ν main 컬λ μ λ μΈλ‘λ λ©λλ€.
Initialization

μ΄ λ€μ΄μ΄κ·Έλ¨μ μ΄κΈ°ν λ¨κ³λ₯Ό λ μμΈν μ€λͺ νκ³ μμ΅λλ€. μ΄ λ¨κ³μ λ μ νν μ€λͺ μ μν΄ λΌμ΄ν μ¬μ΄ν΄κ³Ό κ΄λ ¨μ΄ μλ "dispatch messages" λ¨κ³("spawn dynamic objects"λ¨κ³ λ°λ‘ μ§μ μ νΈμΆλ¨)μ λν μμΈν μ€λͺ μ μ€λ₯Έμͺ½ λΈλ‘μ λ°°μΉνμ΅λλ€.
μ¬μ€, main컬λ μ μ΄ λ‘λλκΈ° μ μ΄κΈ°ν λμ μμ§μ΄ λ΄λΆμ μΌλ‘ μννλ λ¨κ³λ ν¨μ¬ λ§μ΅λλ€. λ©λͺ¨λ¦¬ νλ‘νμΌλ¬, μμΌ, κ·Έλν½, HID(μΈν λλ°μ΄μ€), μ¬μ΄λ, 물리 λ±λ±μ λ§μ κ²λ€μ μ€μ νκ³ "game.project" κ°μ μ΄ν리μΌμ΄μ μ€μ κ°μ λν λ‘λ ν μ²λ¦¬νλ μμ μ μνν©λλ€.
μμ§μ μ΄κΈ°νκ° λλ ν μ¬μ©μκ° λ§¨μ²μμΌλ‘ μ§μ μ μ΄ν μ μλ μ§μ μ μ λ λ μ€ν¬λ¦½νΈμ init() ν¨μμ λλ€.
main 컬λ μ μ΄ λ‘λλκ³ μ΄κΈ°ν λλ©΄ 컬λ μ μ λͺ¨λ κ²μ μ€λΈμ νΈλ μμ μ transform μ 보(μμΉ(position), μ΄λ(movement), νμ (rotation), νλμΆμ(scaling))λ₯Ό μμλ€μκ² λ°μν©λλ€. μ»΄ν¬λνΈμ init() ν¨μκ° μλ€λ©΄ νΈμΆλ©λλ€.
κ²μμ€λΈμ νΈ μ»΄ν¬λνΈμ init() ν¨μκ° νΈμΆλλ μμλ μ ν΄μ§ κ²μ΄ μμΌλ―λ‘ κ²μμμ§μ΄ λμΌν 컬λ μ μ μν μ€λΈμ νΈλ€μ νΉμ ν μμλ‘ μ΄κΈ°ν ν κ±°λΌκ³ 미리 μμΈ‘νμ¬ κ°λ°νμ§ μλ κ²μ΄ μ’μ΅λλ€.
init() ν¨μ μ΄νμλ μ λ©μΈμ§λ₯Ό λ³΄λΌ μλ μκ³ , ν©ν λ¦¬κ° μ μ€λΈμ νΈλ₯Ό μ€ν°λκ² ν μλ μκ³ , μμ νλ €λ μ€λΈμ νΈμ λ§νΉ μμ μ νκΈ°λ νκ³ μμ§μ΄ λ€μ "post-update" λ¨κ³λ₯Ό μννκΈ° μν΄ μ 리 μμ μ ν μλ μμ΅λλ€. μ¬κΈ°μλ λ©μΈμ§λ₯Ό λμ€ν¨μΉνκ³ ν©ν 리λ₯Ό μ¬μ©νμ¬ κ²μ μ€λΈμ νΈλ₯Ό μ€ν°νκ³ μ€λΈμ νΈλ₯Ό μμ νλ μμ μ ν©λλ€.
post-update λ¨κ³μλ λ©μΈμ§ νλ₯Ό λ³΄λΌ λΏλ§μλλΌ λν λ©μΈμ§κ° 컬λ μ νλ‘μλ‘ μ μ‘λλ μΌμ λ€λ£¨λ "dispatch messages" λ¨κ³λ₯Ό ν¬ν¨νκ³ μλ€λ κ²μ μμλκΈ° λ°λλλ€. μ΄ λ¨κ³κ° μνλλ λμμ proxyλ₯Ό ν΅νμ¬(νμ±ν, λΉνμ±ν, λ‘λ©, μΈλ‘λ©μ μν λ§νΉμμ λ±) νμ μμ λ€μ΄ μ λ°μ΄νΈ λ©λλ€.
μμ λ€μ΄μ΄κ·Έλ¨μ μ΄ν΄λ³΄λ©΄, init() νλ λμμ 컬λ μ νλ‘μ(Collection proxy)λ₯Ό λ‘λνκ³ νλ‘μμ λͺ¨λ μ€λΈμ νΈλ€μ μ΄κΈ°ννκ³ νλ‘μμ 컬λ μ μ μΈλ‘λνλ κ²μ΄ κ°λ₯νλ€λ κ²μ μ μ μμ΅λλ€. μ΄ λͺ¨λ κ²μ΄ μ»΄ν¬λνΈμ update()κ° μ²μ νΈμΆλκΈ° μ΄μ μ λ°μν©λλ€. μ¦ μμ§μ΄ λͺ¨λ μ΄κΈ°ν(initialization) λ¨κ³λ₯Ό λΉ μ Έλκ°μ μ λ°μ΄νΈ λ°λ³΅(update loop) λ¨κ³λ‘ μ§μ νκΈ° μ΄μ μ λλ€:
function init(self)
print("init()")
msg.post("#collectionproxy", "load")
end
function update(self, dt)
-- μ΄ μ½λκΉμ§ λλ¬νκΈ° μ μ νλ‘μ 컬λ μ
μ΄ μΈλ‘λλ¨
print("update()")
end
function on_message(self, message_id, message, sender)
if message_id == hash("proxy_loaded") then
print("proxy_loaded. Init, enable and then unload.")
msg.post("#collectionproxy", "init")
msg.post("#collectionproxy", "enable")
msg.post("#collectionproxy", "unload")
-- μ΄ μ€λΈμ νΈμ update()κ° νΈμΆλκΈ° μ΄μ μ
-- νλ‘μ컬λ μ
μ init()κ³Ό final()μ΄ νΈμΆλ¨
end
end
The update loop
μ λ°μ΄νΈ 루νλ λ§€ νλ μ λ§λ€ ν λ²μ© κΈ΄ μνμ€λ‘ μ€νλ©λλ€. λͺ νν μ΄ν΄λ₯Ό μν΄ μλ κ·Έλ¦Όμμ μ΄ μ λ°μ΄νΈ μνμ€λ₯Ό λ Όλ¦¬μ μΈ μνμ€ λΈλ‘μΌλ‘ ꡬλΆνμ΅λλ€. λν "Dispatch messages" λΈλ‘λ κ°μ μ΄μ λ‘ λΆλ¦¬ν΄μ 보μ¬μ€λλ€:

Input
μ λ ₯(input)μ μ¬μ© κ°λ₯ν λλ°μ΄μ€λ‘λΆν° μ½νμ§λ©°, μΈν λ°μΈλ©(input binding)μ λν΄ λ§€νλμ΄ λμ€ν¨μΉ λ©λλ€. μ λ ₯ ν¬μ»€μ€λ₯Ό νλν κ²μ μ€λΈμ νΈλ μ¬μ©μμ μ λ ₯μ λ°μ on_input() ν¨μκ° μλ λͺ¨λ μ»΄ν¬λνΈμκ² μ μ‘ν©λλ€. μ€ν¬λ¦½νΈ μ»΄ν¬λνΈμ GUIμ€ν¬λ¦½νΈκ° μλ GUIμ»΄ν¬λνΈλ₯Ό μ¬μ©νλ κ²μ μ€λΈμ νΈκ° μ λ ₯μ λ°μ μ΄λ€ μ»΄ν¬λνΈμ on_input() ν¨μλ‘ λ³΄λ λλ€.
μ λ ₯ ν¬μ»€μ€λ₯Ό νλνκ³ μ»¬λ μ νλ‘μ μ»΄ν¬λνΈλ₯Ό ν¬ν¨νκ³ μλ κ²μμ€λΈμ νΈλ νλ‘μ 컬λ μ μ μλ μ»΄ν¬λνΈλ€μκ² κΉμ§ μ λ ₯μ μ λ¬ν©λλ€. μ΄ νλ‘μΈμ€λ νμ±νλ 컬λ μ νλ‘μλ€μ λ°λΌ μ¬κ·μ μΌλ‘ λ°λ³΅λμ΄ μ λ¬λ©λλ€.
Update
main 컬λ μ μ κ° κ²μ μ€λΈμ νΈ μ»΄ν¬λνΈ μννλ©° μνλ©λλ€. λ§μ½ μ»΄ν¬λνΈμ μ€ν¬λ¦½νΈμ update()ν¨μλ₯Ό μ μΈνλ€λ©΄ μ΄ ν¨μλ₯Ό νΈμΆν΄ μ€λλ€. λν μ»΄ν¬λνΈκ° 컬λ μ νλ‘μλΌλ©΄ μ΄ νλ‘μμ 컬λ μ μμ μλ κ° μ»΄ν¬λνΈλ μ¬κ·μ μΌλ‘ μ λ°μ΄νΈ λμ΄ μ λ€μ΄μ΄κ·Έλ¨μ "update" μνμ€μ λͺ¨λ λ¨κ³λ₯Ό μνν©λλ€.
κ²μμ€λΈμ νΈ μ»΄ν¬λνΈμ update() ν¨μκ° νΈμΆλλ μμλ μ ν΄μ§ κ²μ΄ μμΌλ―λ‘ κ²μμμ§μ΄ λμΌν 컬λ μ μ μν μ€λΈμ νΈλ€μ νΉμ ν μμλ‘ μ΄κΈ°ν ν κ±°λΌκ³ 미리 μμΈ‘νμ¬ κ°λ°νμ§ μλ κ²μ΄ μ’μ΅λλ€.
λ€μ λ¨κ³μμ κ²μλ λͺ¨λ λ©μΈμ§κ° μ λ¬(dispatch)λ©λλ€. μμ μ»΄ν¬λνΈμ on_message() μ½λλ μΆκ°μ μΈ λ©μΈμ§λ₯Ό κ²μν μ μμΌλ―λ‘ λ©μΈμ§ μ λ¬μ(message dispatcher)λ λ©μΈμ§ νκ° λ€ λΉμμ§ λ κΉμ§ κ²μλ λ©μΈμ§λ₯Ό μ λ¬νλ μμ μ μ§μν©λλ€. κ·Έλ¬λ λ©μΈμ§ μ λ¬μκ° μν κ°λ₯ν νμμλ μ±λ₯μ νκ³κ° μμ΅λλ€. λ©μΈμ§ μ λ¬(Message passing) λ¬Έμμ "Advanced topics" μΉμ μ μ°Έκ³ λ°λλλ€.
μΆ©λ(collision) μ€λΈμ νΈ μ»΄ν¬λνΈμ κ²½μ°μ, 물리 λ©μΈμ§(collisions, triggers, ray_cast λ±μ μ²λ¦¬ν¨)κ° κ²μμ€λΈμ νΈκ° μν₯μ μ£Όλ μ£Όλ³ μ€λΈμ νΈμ μ€ν¬λ¦½νΈμ μ°μΈ on_message() ν¨μλ‘ μ λ¬λ©λλ€.
λ€μμΌλ‘λ κ²μ μ€λΈμ νΈμ μ΄λ, νμ , νλ/μΆμ μμ μ κ°κΈ° μ»΄ν¬λνΈμ μμ κ²μ μ€λΈμ νΈμ μ»΄ν¬λνΈ λ€μκ² λ°μμν€λ κ²μΌλ‘ λ³ν(transform)μ μλ£ν©λλ€.
Render update
λ λ μ λ°μ΄νΈ λΈλ‘μ λ©μΈμ§λ€μ @render μμΌ(μ€λΈμ νΈ URLμ socket, λ€νΈμν¬ μμΌ μλ)μΌλ‘ μ λ¬ν©λλ€(μΉ΄λ©λΌ μ»΄ν¬λνΈμ "set_view_projection" λ©μΈμ§λ "set_clear_color" λ©μΈμ§ λ±). λ€μμΌλ‘λ λ λ μ€ν¬λ¦½νΈμ update() ν¨μκ° νΈμΆλ©λλ€.
Post update
μ λ°μ΄νΈ μμ νμ, ν¬μ€νΈ μ λ°μ΄νΈ(post update) μνμ€κ° μ€νλ©λλ€. μ¬κΈ°μ μΈλ‘λλ₯Ό μν΄ μμ½λ 컬λ μ νλ‘μμ λ©λͺ¨λ¦¬λ₯Ό μΈλ‘λν©λλ€(μ΄λ "dispatch messages" μνμ€ μν μ€μλ λ°μν¨). μμ κ° μμ½λ κ²μ μ€λΈμ νΈλ λͺ¨λ μμ μ»΄ν¬λνΈλ€μ final() ν¨μλ₯Ό νΈμΆν©λλ€. final()ν¨μμ μ½λμμ λ©μΈμ§νλ‘ μ λ©μΈμ§λ₯Ό 보λ΄λ κ²½μ°μ "dispatch messages"κ° μ΄λ₯Ό λμ€μ μ²λ¦¬νκ² λ©λλ€.
λ€μμΌλ‘λ κ²μμ€λΈμ νΈλ₯Ό μ€ν°νλλ‘ μ§μλ°μ ν©ν 리 μ»΄ν¬λνΈκ° μμ μ μμνκ³ , λ§μ§λ§μΌλ‘λ μμ κ° μμ½λ κ²μμ€λΈμ νΈλ€μ΄ μ€μ λ‘ μμ λ©λλ€.
μ λ°μ΄νΈ 루νμ λ§μ§λ§ λ¨κ³λ @system λ©μΈμ§("exit", "reboot" λ©μΈμ§, νλ‘νμΌλ¬ ν κΈνκΈ°, λΉλμ€ μΊ‘μ³λ₯Ό μμνκ±°λ λ©μΆκΈ° λ±λ±)λ₯Ό μ λ¬νλ κ²μ ν¬ν¨νκ³ μμ΅λλ€. λ€μμΌλ‘ κ·Έλν½μ λ λλ§ν©λλ€. κ·Έλν½μ΄ λ λλ§ λλ λμ, λΉλμ€ μΊ‘μ³ μμ κ³Ό λΉμ£ΌμΌ νλ‘νλ¬(visual profiler)μ λ λλ§ μμ λ μνλ©λλ€. ( Debugging λ¬Έμλ₯Ό μ°Έκ³ λ°λλλ€.)
Frame rate and collection time step
μ΄λΉ νλ μ μ λ°μ΄νΈμ μ(FPS, μ¦ update-loopμ μ€ν μμ λμΌν¨)λ νλ‘μ νΈ μ€μ (project settings)μμ μ ν ν μ μμΌλ©° νλ‘κ·Έλλ° λ°©μμΌλ‘ @system μμΌμ "set_update_frequency" λ©μΈμ§λ₯Ό 보λ΄μ μ ν ν μλ μμ΅λλ€. κ·Έλ¦¬κ³ νλ‘μλ‘ "set_time_step" λ©μΈμ§λ₯Ό 보λ΄μ 컬λ μ νλ‘μμ μκ° νλ¦(time step)μ κ°λ³μ μΌλ‘ μ€μ νλ κ²λ κ°λ₯ν©λλ€. 컬λ μ μ μκ° νλ¦μ λ³κ²½ν΄λ νλ μ λ μ΄νΈμ μν₯μ μ£Όμ§λ μμ΅λλ€. λμ , 물리 μ λ°μ΄νΈ(physics update)μ μκ° νλ¦κ³Ό, update() ν¨μλ‘ μ λ¬λλ "dt" μΈμκ°μ μν₯μ μ€λλ€. λν, μκ° νλ¦μ λ³κ²½νλ κ²μ κ° νλ μμ νΈμΆλλ update()μ νμλ₯Ό λ³κ²½νλ κ²μ μλλλ€. update()λ νλ μλΉ νλ²μ©λ§ νΈμΆλ©λλ€.
(μμΈν κ²μ Collection proxy μ set_time_step λ₯Ό μ°Έκ³ νμΈμ.)
Finalization
μ΄ν리μΌμ΄μ μ΄ μ’ λ£λλ μμ μλ, λ§μ§λ§ μ λ°μ΄νΈ 루ν μνμ€λ₯Ό λλ΄κ³ , 컬λ μ νλ‘μλ€μ μΈλ‘λνμ¬ νλ‘μ 컬λ μ μ λͺ¨λ κ²μμ€λΈμ νΈμ λ§λ¬΄λ¦¬(finalizing)μ μμ (deleting)λ₯Ό μνν©λλ€.
μμ§μ λ§μ§λ§μΌλ‘ main 컬λ μ κ³Ό μ€λΈμ νΈλ€μ λ€λ£¨κΈ° μν λ§λ¬΄λ¦¬(finalization) μνμ€μ μ§μ ν©λλ€.

λ¨Όμ μ»΄ν¬λνΈμ final() ν¨μλ₯Ό νΈμΆν ν, λ¨μ λ©μΈμ§λ€μ μ λ¬ν©λλ€. λ§μ§λ§μΌλ‘, λͺ¨λ κ²μ μ€λΈμ νΈκ° μμ λκ³ main 컬λ μ μ΄ μΈλ‘λ λ©λλ€.
λ€μμΌλ‘ μμ§μ μλΈμμ€ν μ μ’ λ£νκ³ , νλ‘μ νΈ μ€μ μ μμ νκ³ , λ©λͺ¨λ¦¬ νλ‘νμΌλ¬λ₯Ό μ’ λ£νλ λ±μ μμ μ λ°±κ·ΈλΌμ΄λμμ μνν©λλ€.
μ΄μ μ΄ν리μΌμ΄μ μ μμ ν μ’ λ£λμμ΅λλ€.