반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

Storyboard: Scene Purging vs. Removal

2012. 8. 2. 11:01 | Posted by 솔웅


반응형

Storyboard: Scene Purging vs. Removal


Posted on . Written by


코로나 SDK 의 storyboard API에서 혼동되는 부분 중 하나가 scene을 purging 하고 removal 하는 겁니다. purging과 removing의 차이점은 무엇일까요? 그리고 scene을 purge 한다는게 무슨 의미죠? 이런것들이 우리가 자주 받는 질문들 중 일 부분입니다.


오늘은 이런 의문점을 깨끗하게 날려드리기 위해 purging과 removal이 되면 scene들 뒷편에선 어떤 일들이 일어나는지에 대한 high-level overview를 알려드리겠습니다. 그리고 몇가지 예제들도 보여드릴거구요.


Memory Consumption


Corona display object가 생성 됐을 때 이 객체는 texture 메모리 (graphics)와 Lua 메모리 (테이블과 변수 같은 데이터)를 차지하게 됩니다. scene 모듈 같은 모듈이 로딩 될 때 이것은 메모리에 저장돼 있는 단순한 테이블입니다. 그래서 좀 더 빠르게 메모리에서 로딩 할 수 가 있습니다. 그렇지만 한번에 메모리에 너무 많은 것들이 있으면 퍼포먼스에 지장을 줄 수 밖에 없겠죠. 이것 때문에 저희는 개발자들이 메모리에 무엇을 남길지 그리고 어떤 것들을 unload 시키거나 freed 시킬지의 여부에 대해서 전적으로 콘트롤 할 수 있도록 하자고 정했습니다. 


이러한 배경을 염두에 두신후 아래 스토리보드 scene들에 서 purging과 removing이 무엇인제에 대한 기본 개요를 보시기 바랍니다.


Purging은 scene에서 display object들만 remove 시키는 겁니다. 그렇게 되면 texture memory는 freeing 되겠죠. 그리고 이 scene이 external module에 의해 represent 되면 이 모듈은 계속 메모리에 남아있는 상태가 될 겁니다. 여러분이 만든 custom 변수들이 모두 메모리에 있게 된다는 겁니다.


scene을 Removing 한다는 것은 display 객체든 루아 객체든 모두 remove 한다는 의미 입니다. 그 결과로 texture 메모리 뿐만이 아니라 루아 메모리도 모두 freed 되게 됩니다.



So why purge at all?


만약에 유저가 나갔다가 다시 돌아올 것으로 예상되는 scene이 있다면 그런데 그 scene이 아주 많은 texture 메모리를 가지고 있다면 이 scene은 purge 시키는 것이 좋을 겁니다. 그러면 다른 scene이 로드될 떄 퍼포먼스에 지장을 주지 않겠죠. (그 모듈-scene-은 계속 메모리에 남아 있는 겁니다.)


예를 들어 action arcade 게임을 만든다고 했을 때, 그 게임은 아주 많은 physics와 아주 빠르게 움직이는 수 많은 객체들을 사용하게 될 겁니다. 두말 할 것도 없이 그 게임 scene은 아주 많은 texture 메모리를 필요로 하게 되죠.


이 game screen 구석에는 pause 버튼이있습니다. 그 버튼을 누르면 pausegame 이 로드 되죠. 유저기 이 scene을 자주 들락거려야 한다면 이 scene을 purge 하는게 훨씬 나을 겁니다. 유저는 이 scene에 다시 돌아올 가능성이 많을 겁니다. 그러니까 다른 scene의 퍼포먼스에  부담을 덜기 위해서 pause를 사용해서 texture 메모리를 절약하고 다시 돌아올 경우에 빨리 로드되게 하기 위해서 루아 객체는 메모리에 그대로 두는 pause가 유용하게 이용될 수 있을 겁니다


Functions for Purging


scene purging을 handle 하는 스토리보드의 function에는 두가지가 있습니다.



첫번째 함수는 single argument를 받습니다. sceneName을 받게 되죠. purge 할 특정 scene을 지칭하는 겁니다. purged 될 scene이 external module과 correspond 된다면 이것은 module name이 되겠죠. (.lua 확장자를 뺀 나머지 부분)

이렇게 purging이 되면 해당 scene의 display object들은 destroy 될 겁니다. 더이상 display object들이 화면에 display 될 필요가 없을 떄 사용하는 것이죠. 이 작업을 하기에 가장 알맞는 이벤트는 didExitScene 입니다.

scene이 완전히 screen에서 사라졌을 떄 그 scene을 purge 하는 예제가 아래에 있습니다.


-- scene1.lua
local storyboard = require "storyboard"
local scene = storyboard.newScene()

-- createScene event simply creates a background image
function scene:createScene( event )
    local bg = display.newImage( self.view, "background.png" )
end
scene:addEventListener( "createScene" )

function scene:didExitScene( event )
    storyboard.purgeScene( "scene1" )
end
scene:addEventListener( "didExitScene" )

return scene


어떤 scene에서 menu.lua로 전환한다고 칩시다. 이 경우 menu.lua로 되돌아 오는 다른 scene들은 여러경우가 있습니다. 이럴 경우 그 이전 scene이 어떤건지 확실히 모를 때 어떻게 이전 scene을 pause 하는지에 대한 예제가 아래에 있습니다.


-- menu.lua
local storyboard = require "storyboard"
local scene = storyboard.newScene()

-- createScene event simply creates a background image
function scene:createScene( event )
    local bg = display.newImage( self.view, "background.png" )
end
scene:addEventListener( "createScene" )

function scene:enterScene( event )
    local prior_scene = storyboard.getPrevious()
    storyboard.purgeScene( prior_scene )
end
scene:addEventListener( "enterScene" )

return scene


여러분들은 현재 작동중인 scene을 제외한 모든 scene들을 purge 시키기 위해 storyboard.purgeAll()를 사용하실 수 있습니다.  scene이 purge 될 때는 destroyScene 이벤트가 dispatch 될 겁니다. 그 이벤트를 이용해서 Runtime listener를 remove 한다던가 하는 last minute action들을 처리하실 수 있습니다.


Functions for Removing


scene을 removal 하는 것을 처리하기 위한 스토리 보드 함수에는 두가지가 있습니다. 아래 두 함수중에 하나가 call 되면 해당 scene은 우선 purge 하고 그 다음에 remove 될 겁니다.


첫번째 함수는 single argument를 받습니다. sceneName 인데요 remove 할 scene을 말하는 것이죠. 이 remove 될 scene이 external module 이면 그 모듈 이름이 되겠죠. (.lua 확장자를 제외한 부분)

remove 되기 전에 해당 scene이 purge 되면 destroyScene 이벤트가 해당 scene에 dispatch 될 겁니다.


Automatic Purging


iOS에서는 디폴트로 OS가 Low memory warning을 issue 하면 least-recently-used scene이 자동적으로 purge 됩니다. 이 purge가 자동적으로 이뤄지도록 하고 싶지 않으면 storyboard.disableAutoPurge 프로퍼티를 사용하시면 됩니다.


storyboard.disableAutoPurge = true


디폴트 값은 false 입니다. 그러니까 여러분이 true로 세팅하시면 더이상 필요하지 않거나 여러분 앱의 texture memory 소비를 많이 잡아 먹는 scene 이 있으면 여러분이 직접 pause 해 주셔야 합니다. 이 자동 pause 기능은 안드로이드 디바이스에서는 작동되지 않습니다.


만약 매뉴얼 purging 도 원하지 않고 automatic scene purging 도 원하지 않으면 storyboard.purgeOnSceneChange 프로퍼티를 true로 해 놓으세요. 그러면 scene이 바뀔 때마다 전환될 scene을 제외한 모든 scene들이 purge 될 겁니다.


좀 더 자세한 내용은 storyboard.* API documentation을 보세요.


반응형