programming/actionscript2016.03.21 18:19
★ 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가 넘는 프레임드롭이 느껴짐....


Posted by 귀뫄뉘

댓글을 달아 주세요

  1. 조희대

    안녕하세요. 저희가 현재 에어 개발자를 필요로 하는데 써칭중에 우연히 이 사이트를 접했습니다. 괜찮으시다면 꼭 아래 메일로 연락한번 주시면 감사하겠습니다. hiidecho6@gmail.com

    2017.05.23 16:14 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 저는 다른 일을 하고 있어서 시간이 안 날 것 같습니다~ 관심 감사드립니다~

      2017.06.04 07:15 신고 [ ADDR : EDIT/ DEL ]