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 ]