2D 게임을 위한 최고의 엔진 Defold 한글 매뉴얼

Defold 공식 사이트 바로가기

Defold 한글 매뉴얼 바로가기


2D 기반 크로스플랫폼 게임 엔진을 찾던 중 Defold의 많은 가능성을 보고 매뉴얼을 번역하게 되었습니다. 기본적으로 유니티와 비슷한 GameObject-Component 기반 설계 방식을 따르면서 더 구조적이고 더 가볍고 2D 작업에 더 직관적인 기능을 제공하고 있다고 생각합니다.


아직은 게임엔진들 중에서 후발주자에 속하므로 성공 사례가 부족하지만 캐주얼급 게임을 개발하는 데에는 그 어느 엔진보다 쉽고 강력한 기능을, 그것도 완전 무료로 제공해 줄 것으로 기대하고 있습니다.


이 매뉴얼은 2017년 3월을 기준으로 번역 되었으며, 올해 안에 에디터2가 나올 예정이므로 원본 매뉴얼은 수시로 수정될 수 있습니다.


부디 Defold에 관심있으신 다른 분들께도 도움이 되길 바랍니다.

저작자 표시 동일 조건 변경 허락
신고
  1. 이드 2017.03.24 17:01 신고

    정말 감사합니다. ^^

★ assets 폴더 bin 폴더 밑으로 pre-build할때 복사시키기

//프로젝트 구조상 asset load하기 위한 assets 폴더는 /assets 에 위치하는데 mobile용으로 FlashDevelop에서 테스트시에는 bin/assets 폴더에 있어야 한다. (app://의 root가 swf파일이 있는 위치이기 때문.) 보통 svn에서 bin폴더는 ignore하므로 이럴땐 pre-build에 아래 명령어를 써서 빌드 전에 /bin/assets 폴더를 지우고 /assets에서 /bin/assets로 복사시키면 된다.
cmd /C if not exist $(OutputDir) mkdir $(OutputDir)
cmd /C if exist $(OutputDir)\assets\ rmdir /q /s $(OutputDir)\assets\
xcopy /EY $(ProjectDir)\assets $(OutputDir)\assets\

//혹은 xcopy /D 옵션을 추가해서 수정날짜가 원본파일보다 나중인 파일만 복사하는 방법도 있다. (삭제된 파일도 그냥 남는 문제가 있음..그래서.. 아래 글 참조)


★ assets 폴더 bin 폴더 밑으로 링크시키기

//위의 방법은 assets 파일이 많을 경우 빌드가 느려진다. 아래 코드를 pre-build에 넣으면 bin 폴더 아래에 상위 assets 폴더를 링크만 시켜 주므로 매번 복사가 발생하지 않는다.
cmd /C if not exist $(OutputDir) mkdir $(OutputDir)
cmd /C if not exist $(OutputDir)\assets mklink /d /j $(OutputDir)\assets assets


★ ane 붙이기
출처1 : https://fermmm.wordpress.com/2014/01/04/working-tutorial-to-install-air-native-extensions-in-flash-develop-4-windows-desktop-project
출처2 : http://www.innerdrivestudios.com/blog/air-mobile/include-an-adobe-air-goviral-native-extension-in-flashdevelop

1. ane 폴더에 ane파일 떨구기..
2. ane파일 add to library... 추가(검색해보면 External library로 설정하라는 설명이 많은데 여기선 걍 기본값으로 하나 마나 아무 차이가 없음)
3. Packager.bat 에서 call adt... 어쩌구 끝에 -extdir ane 추가
4. application.xml에 extensions id 추가 (모르면 ane파일 zip압축 풀면 META폴더안에 xml파일에 있음)
//여기까지는 apk패키징은 잘 됨.. 하지만 데스크탑에서 디버깅 테스트를 하려하면 extension id를 못찾는 에러 발생.. 테스트와 패키징 때마다 application.xml 수정해야하는 불편함...  그래서!
5. ane파일을 ane 폴더에 압축 풀기 (Test.ane의 extensionID가 com.test.Test라면 /ane/com.test.Test.ane 라는 이름의 폴더에 압축을 풀면 됨)
6. RunApp.bat 에서 adl ... 어쩌구 끝에 -extdir ane 추가
//이렇게 하면 FlashDeveop에서 실행도 에러 없이 잘 됨


★ Scout로 성능 테스트하기

- 사용법 : http://www.adobe.com/devnet/scout/articles/adobe-scout-getting-started.html
- 그냥 빌드하면 debug/release 상관없이 CPU 테스트는 됨.. flash/air core 함수별 오버헤드는 볼 수 있음
- 근데 Compiler Option에서 Advanced Telemetry=TRUE로 주고 컴파일해야 내가 짠 코드별 전체 오버헤드를 볼 수 있음
	- 근데 현재 flexsdk에선 모르는 명령어라고 함.. asc2.0으로 컴파일 해야됨 고로 Custom SDK에 C:\Users\giman\AppData\Local\FlashDevelop\Apps\ascsdk\21.0.0 경로를 주고
		Advanced Telemetry=TRUE로 주고 컴파일하고.. 혹시 코드에러나면 Enable All Warnings=False로 주고 빌드해보면 잘 됨
- 파이썬 연동하는건 안됨 (https://github.com/adamcath/telemetry-utils)


★ AIR mobile에서 starling 사용할때 mask 성능이슈

starling의 mask는 display buffer에 두 번 더 쓰게 되므로 drawcall 2 만큼 증가됨.
mask를 mobile에서 쓰기 위해선 application.xml에서 depthAndStencil=true 를 해줘야 하는데, 안드로이드 기기에서 테스트 해 본 결과 fps12나 더 떨어지는 문제 발생
가능하면 mask는 안쓰는게 좋을듯 하다.


★ 크롬 FlashPlayer에서 trace log 보기

출처 : http://stackoverflow.com/questions/27791515/how-to-get-trace-output-from-ppapi-content-debugger-flash-player
- %USERPROFILE%/AppData/Local/Google/Chrome/User Data/Default/Pepper Data/Shockwave Flash/System/mm.cfg 파일 생성해서
	TraceOutputFileEnable=1
	ErrorReportingEnable=1
	라고 써주고 크롬 재시작하면 
	%USERPROFILE%/AppData/Local/Google/Chrome/User Data/Default/Pepper Data/Shockwave Flash/WritableRoot/Logs/flashlog.txt 파일에 로그 쌓임


★ FlashDevelop 에서 Array code hint 주는 방법

var groundObjectpool:Array/*GroundEntity*/ = new Array();


★ 초간단 objectpool
//array에서 push와 shift 활용
for (var j:int = 0; j < 5; j++) 
{
	var particleSystem:PDParticleSystem = new PDParticleSystem(Egg.assets.getXml("particle"), Egg.assets.getTexture("Fruits_pop.png"));
	particleSystemList.push(particleSystem);
}
var particleSystem:PDParticleSystem = playworld.particleSystemList.shift();
playworld.particleSystemList.push(particleSystem);


★ 여러가지 array clear 방법들

// best performance (benchmark: 1157)
array.length = 0;
// lower performance (benchmark: 1554)
array = [];
// even lower performance (benchmark: 3592)
array.splice(0);


★ iterator dilemma

http://wiki.starling-framework.org/manual/performance_optimization
반복문 최적화 방법
for each (var item:Object in array) { ... }	// slowish:
for (var i:int=0; i < array.length; ++i) { ... }	// better:
for (var i:int = 0, len:int = array.length ; i < len ; i++)	// fastest:
근데 반복문 안에서 array element를 삭제시엔 난감해짐... for each를 쓰는게 편한데 성능이 안좋고...
그럴땐 반복문을 역순으로 돌리면 됨
for (var i:int = array.length - 1 ; i >= 0 ; i--)


★ starling상속구조

Object -> EventDispatcher -> DisplayObject -> DisplayObjectContainer -> Sprite
Object -> EventDispatcher -> DisplayObject -> DisplayObjectContainer -> Sprite3D
Object -> EventDispatcher -> DisplayObject -> DisplayObjectContainer -> TextField
Object -> EventDispatcher -> DisplayObject -> Quad -> Image -> MovieClip
Object -> EventDispatcher -> DisplayObject -> Canvas


★ 이미지 텍스쳐불러오기 방법 성능 비교

//-------------------- 일단 출력되면 빠른데.. 불러올때 엄청 버벅임... 가능하면 embed 이미지는 쓰지말자
graphic = new Image(Texture.fromBitmap(new Embeds.Img_Snake));	//fromBitmap 이거 엄청느리다..
graphic = new Image(Texture.fromEmbeddedAsset(Embeds.Img_Snake));	// 이것도 느림
graphic = new Image(SP.assets.getTexture("mon_snake_02"));	//빠름

//--------------------단 embeds class 를 AssetManager에 넣어서 불러오는건 빠름
public final class Embeds 
{
	[Embed(source = "../assets/mon_snake_02.png")]
	public static const Img_Snake:Class;
}
SP.assets.enqueue(
	Embeds	//embed가 있는 클래스를 통째로 
);
graphic = new Image(SP.assets.getTexture("Img_Snake"));	//빠름



★ 폰트는 웬만하면 비트맵 폰트를 쓰자

//참고 : http://wiki.starling-framework.org/manual/displaying_text
//otf는 assetManager로 동적로드하는게 모바일에서 안됨... PC에선 잘 되는데 모바일에서 기본폰트로 바뀜.. 맥용 폰트라 그런가..
//filter도 쓰지말자 2~5 정도 drawcall이 낭비됨
//웬만하면 http://kvazars.com/littera/ 에서 비트맵 폰트를 쓰기를 강력히 추천함..  ttf폰트를 사용한 TextField의 text 프로퍼티가 수정되면 약4fps 정도의 framerate가 떨어지는거로
//stat정보창에 나오는데.. 실체 체감은 10fps가 넘는 프레임드롭이 느껴짐....


저작자 표시 동일 조건 변경 허락
신고

MongoDB를 주로 쓰다가 AWS 환경을 염두에 두게되면서 DynamoDB를 알아보던 중 눈에 들어온 글이 있어 대충 번역해서 공유해봅니다.

출처 : http://www.masonzhang.com/2013/08/7-reasons-you-should-use-mongodb-over.html


DynamoDB 대신 MongoDB를 써야 하는 7가지 이유


이유 1 : 인덱싱 필드가 변경될 수 있다면 MongoDB를 써라.

DynamoDB는 인덱싱 필드가 변경이 안된다고 합니다.... 으허


이유 2 : document database가 필요하다면 MongoDB를 써라.

DynamoDB는 key-value방식이라 sub-document를 지원하지 않습니다.


이유 3 : Perl, Erlang, C++로 개발할거면 MongoDB를 써라.

DynamoDB는 Java, JavaScript, Ruby, PHP, Python, .NET 만 지원합니다.


이유 4 : 한 item에 저장할 데이터가 64k를 넘는다면 MongoDB를 써라.

DynamoDB는 한 item(key-value)에 64k 까지만 저장 된다는데... 제가 직접 Limits에서 확인해본 바로는 keyname size(attribute)와 value size 포함해서 총 itemsize가 400kb를 넘으면 안된다고 나와 있네요. 일본어 버전 설명서에는 아직 64kb라고 나와있는 것으로 봐서 버전업이 있었나 봅니다.. 여쨌든 400kb라도 넉넉하긴한데 신경쓰이는 수치네요..


이유 5 : string, number, base64 인코딩된 바이너리 외의 데이터타입을 쓸 계획이라면 MongoDB를 써라.

예전에는 일부 스칼라와 스칼라 세트만 제공했었나 보네요.. DataModel 문서를 보면 Document Data Type으로 Complex data structure도 저장할 수 있는 것으로 봐서 이 부분은 큰 문제 없을 것으로 보입니다.


이유 6 : 쿼리에 정규식을 쓸거라면 MongoDB를 써라.

DynamoDB는 scan시에 string substring이나 contains같은 간단한 기능만 제공한다네요.


이유 7 : Document Database에 흥미가 있다면 MongoDB를 써라.

이건 뭐 원글쓴이 개인적인 경험담인데.. MongoDB를 개발한 10gen에서 유저들과 소통이 원활해서 좋았다고 하네요..



원글 외에 단점을 추가하자면

- Query나 Scan의 결과 최대 크기가 1MB까지라는 점... (Scan은 재호출시 다음 결과가 이어서 검색됨)

- Batch 작업 제한도 대부분 1MB제한에 100개 항목 제한...


결론

- MongoDB나 SQL류 DB 대신 쓸 계획이라면 Limits와 DataType에 대해 정말정말 신중하게 알아봐야 함

- Redis나 Memcache로 써도 되는 데이터인데, 저장과 검색이 필요한 데이터라면 고려해볼만함

- 무난한 장점들이 있는 반면 작은 단점이 너무 큼.... 






저작자 표시 동일 조건 변경 허락
신고

티스토리 툴바