Application lifecycle - kuimoani/defold GitHub Wiki

#Application lifecycle 이 λ¬Έμ„œλŠ” Defold의 κ²Œμž„κ³Ό μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 라이프사이클에 λŒ€ν•΄ μžμ„Ένžˆ μ•Œμ•„λ΄…λ‹ˆλ‹€.

Defold의 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄λ‚˜ κ²Œμž„μ˜ 라이프사이클은 맀우 λ‹¨μˆœν•©λ‹ˆλ‹€. 엔진은 μ΄ˆκΈ°ν™”(initialization), μ—…λ°μ΄νŠΈ 루프(update loop: μ—¬κΈ°μ„œ λŒ€λΆ€λΆ„μ˜ μ‹œκ°„μ΄ μ†ŒλΉ„λ¨), 마무리(finalization) μ„Έ λ‹¨κ³„λ‘œ μ§„ν–‰ν•©λ‹ˆλ‹€.

Lifecycle overview

λŒ€λΆ€λΆ„μ˜ κ²½μš°μ—” Defold λ‚΄λΆ€ λ™μž‘μ˜ 기본적인 μ΄ν•΄λ§Œ 해도 λ˜μ§€λ§Œ, 이 μž‘μ—…μ˜ μ •ν™•ν•œ μˆœμ„œλ₯Ό μ΄ν•΄ν•˜μ§€ λͺ»ν•˜λ©΄ λ‚œκ΄€μ— 빠질 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 이 λ¬Έμ„œλŠ” κ²Œμž„μ—”μ§„μ΄ μ–΄λ–»κ²Œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹œμž‘λΆ€ν„° λκΉŒμ§€ μ‹€ν–‰ν•˜λŠ”μ§€ μ„€λͺ…ν•©λ‹ˆλ‹€

μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 엔진을 μ‹€ν–‰ν•˜λŠ”λ° ν•„μš”ν•œ λͺ¨λ“  것을 μ΄ˆκΈ°ν™”(initialization)ν•˜λ©΄μ„œ μ‹œμž‘ν•©λ‹ˆλ‹€. main μ»¬λ ‰μ…˜μ„ λ‘œλ“œν•˜κ³  init() Lua ν•¨μˆ˜κ°€ μ‘΄μž¬ν•˜λŠ” λ‘œλ“œλœ λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈ(슀크립트 μ»΄ν¬λ„ŒνŠΈλ‚˜ GUIμŠ€ν¬λ¦½νŠΈκ°€ μžˆλŠ” GUI μ»΄ν¬λ„ŒνŠΈ)λ“€μ˜ init() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 μ»€μŠ€ν…€ν•˜κ²Œ μ΄ˆκΈ°ν™”λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμœΌλ‘œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ—…λ°μ΄νŠΈ 루프(update loop)에 μ§„μž…ν•΄μ„œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ 생λͺ…μ£ΌκΈ° λŒ€λΆ€λΆ„μ„ 머물게 λ©λ‹ˆλ‹€. λ§€ ν”„λ ˆμž„λ§ˆλ‹€, μΆ”κ°€λœ κ²Œμž„ μ˜€λΈŒμ νŠΈμ™€ μ»΄ν¬λ„ŒνŠΈλ“€μ΄ μ—…λ°μ΄νŠΈ 되며 μŠ€ν¬λ¦½νŠΈλ‚˜ GUI μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” update() ν•¨μˆ˜κ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€. μ—…λ°μ΄νŠΈκ°€ λ°˜λ³΅λ˜λŠ” λ™μ•ˆ λ©”μ„Έμ§€λŠ” μˆ˜μ‹ μž 츑에 λ°œμ†‘λ˜λ©°, μ‚¬μš΄λ“œλ₯Ό ν”Œλ ˆμ΄ν•˜κ³  κ·Έλž˜ν”½μ„ λ Œλ”λ§ ν•©λ‹ˆλ‹€.

μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ 라이프사이클을 μ’…λ£Œν•΄μ•Ό ν•˜λŠ” νŠΉμ • μ‹œμ μ—μ„œλŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ’…λ£Œν•˜κΈ° 직전에 엔진은 μ—…λ°μ΄νŠΈ 루프 단계λ₯Ό λΉ μ Έλ‚˜μ™€ 마무리(finalization) λ‹¨κ³„λ‘œ μ§„μž…ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œ λ‘œλ“œλœ λͺ¨λ“  κ²Œμž„ 였브젝트의 μ‚­μ œλ₯Ό μ€€λΉ„ν•˜κ²Œ λ©λ‹ˆλ‹€. λͺ¨λ“  였브젝트 μ»΄ν¬λ„ŒνŠΈμ˜ final() ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λ―€λ‘œ μ—¬κΈ°μ„œ μ»€μŠ€ν…€ν•œ λ¦¬μ†ŒμŠ€ ν•΄μ œ μž‘μ—…μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  μ˜€λΈŒμ νŠΈκ°€ μ‚­μ œλœ ν›„ main μ»¬λ ‰μ…˜λ„ μ–Έλ‘œλ“œ λ©λ‹ˆλ‹€.

Initialization

Lifecycle overview

이 λ‹€μ΄μ–΄κ·Έλž¨μ€ μ΄ˆκΈ°ν™” 단계λ₯Ό 더 μžμ„Ένžˆ μ„€λͺ…ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 이 λ‹¨κ³„μ˜ 더 μ •ν™•ν•œ μ„€λͺ…을 μœ„ν•΄ 라이프 사이클과 관련이 μžˆλŠ” "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" 블둝도 같은 이유둜 λΆ„λ¦¬ν•΄μ„œ λ³΄μ—¬μ€λ‹ˆλ‹€:

Update loop

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) μ‹œν€€μŠ€μ— μ§„μž…ν•©λ‹ˆλ‹€.

Finalization

λ¨Όμ € μ»΄ν¬λ„ŒνŠΈμ˜ final() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œ ν›„, 남은 메세지듀을 μ „λ‹¬ν•©λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ, λͺ¨λ“  κ²Œμž„ μ˜€λΈŒμ νŠΈκ°€ μ‚­μ œλ˜κ³  main μ»¬λ ‰μ…˜μ΄ μ–Έλ‘œλ“œ λ©λ‹ˆλ‹€.

λ‹€μŒμœΌλ‘œ 엔진은 μ„œλΈŒμ‹œμŠ€ν…œμ„ μ’…λ£Œν•˜κ³ , ν”„λ‘œμ νŠΈ 섀정을 μ‚­μ œν•˜κ³ , λ©”λͺ¨λ¦¬ ν”„λ‘œνŒŒμΌλŸ¬λ₯Ό μ’…λ£Œν•˜λŠ” λ“±μ˜ μž‘μ—…μ„ λ°±κ·ΈλΌμš΄λ“œμ—μ„œ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

이제 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ™„μ „νžˆ μ’…λ£Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.