이 작업을 시작하게 된 썰


현재 만들고 있는 게임은 데이터들을 xml 형식으로 읽어온다.

그런데 전체 데이터 로드를 게임 진입부에서 한꺼번에 하기 때문에 (왜 그렇게 했을까... ㅠ_ㅠ)

데이터량이 많아지면 많아질수록 당연하게도 데이터 로딩시간은 점점 늘어날 수 밖에 없다.


전체적으로 데이터 로딩 구조를 바꾸기엔 손봐야할 부분이 너무 많기 때문에

일단 기존에 사용하던 기본 xml 파서를 가볍고 날렵한 놈으로 바꿔보기로 했다.


여기 저기 구글링을 통해 알아보니

TinyXml, Mono.xml, RapidXml 등 유니티에서 사용할 수 있는 몇몇 파서가 있었는데

그 중 RapidXml을 소개해보겠다.




먼저 기본 System.xml 파서와 Mono.xml, RapidXml 파서를 사용한 xml 데이터 로딩, 파싱에 소요되는 시간은 다음과 같다.

퍼포먼스 테스트 - 데이터 로딩 : xml 데이터 로드 10회 반복 


  • System.xml (유니티 기본) : 53.96 / ms


  • Mono.xml : 34.63 / ms

  • RapidXml : 0.39 / ms


  • 퍼포먼스 : RapidXml >>>>> Mono.xml > System.xml

0.39 !!!!????
잘못잰건가 싶어서 몇번을 다시 돌려봐도 결과는 비슷했다.
우앙 ㅋ 굿



그렇담 이번엔 파싱.


퍼포먼스 테스트 - 데이터 파싱 : xml 데이터 파싱 10회 반복 


  • System.xml (유니티 기본) : 293.79 / ms


  • Mono.xml : 242.64 / ms


  • RapidXml : 252.11 / ms

  • 퍼포먼스 : Mono.xml > RapidXml > System.xml



결론


파싱에서는 Mono.xml이 수치적으로 젤 퍼포먼스가 좋았지만 RapidXml과 근사치였다.
하지만 RapidXml의 어마무시하게 빠른 로딩속도까지 생각해보면

RapidXml의 압승!!!


사실 간단한 xml 로딩은 기본 파서를 사용해도 전혀 상관이 없다.

하지만 나와 같은 고민을 해본 개발자라면 Parser 교체를 해보는것도 좋은 대안이 될듯하다.

(현재 개발중인 게임도 RapidXml로 파서를 바꿔서 사용중인데 데이터 로딩 시간이 대폭 감소되었다. ^^;;)


교훈 : 데이터 구조 설계부터 잘 해라...   ㅜ_ㅜ





첨부된 파일 설명



첨부된 파일은 https://github.com/sczybt/UnityRapidXml의 샘플 코드를 기반으로 작성한 유니티 테스트 프로젝트이며
유니티 에디터 (Mac osx, Windows), Android 디바이스에서 사용 가능하도록 라이브러리를 추가해두었다.



- Plugins > Android > libs > 하위 파일들 : Android 빌드용 라이브러리


- Plugins > RapidXml.dll : PC용 라이브러리


- Plugins > RapidXml.bundle : Mac용 라이브러리


- Plugins > RapidXml > RapidXml.cs : RapidXml c# wrapper


- Assets > RapidXml > Scenes > Main.unity : 테스트 씬




Plugins 폴더 이외의 파일들은 테스트용이므로 실제 사용시에는 plugins폴더만 본인의 프로젝트로 임포트해서 사용하면 된다.












Corona SDK는 Box2D 물리 엔진을 탑재하고 있으며 아주 간단한 방법으로 물리 엔진을 사용 할 수 있도록
관련 API를 제공해주고 있다.

corona api 레퍼런스 중 physics 관련 부분을 간단히 정리해 본다. 
(영문의 압박으로 틀린 부분이 상당히 많으리라 생각한다~;;; ㅜㅜ)

Physics world setup
local physics = require "physics"
딸랑 한줄이다.
소스 상에서 물리 엔진이 적용되어야 하는 시작부분에 넣어주고 
physics.start() -- 물리 엔진 적용 시작
physics.pause() -- 물리 엔진 적용 멈춤
physics.stop()  -- 물리 엔진 적용 종료
상황에 맞게 start, pause, stop 메서드를 호출해주면 된다.
Physics.setGravity
physics.setGravity( 0, 9.8 ) -- @param (x축 값, y축 값)
물리 엔진의 중력 값을 셋팅한다. setGravity를 사용하지 않을 경우 default 값으로 9.8(표준 지구 중력)이 셋팅된다.

Physics.getGravity
gx, gy = physics.getGravity() -- 한번에 x,y축 중력값을 모두 가져올 수 있다.
현재의 중력 값을 가져 온다.


 

'개발 > Corona SDK' 카테고리의 다른 글

Corona SDK 소개  (0) 2011.05.11
멀티 플랫폼 개발 툴 Corona SDK - iPhone / Android  (0) 2011.05.10

+ Recent posts