2014년 12월 21일 일요일

[Unity3D] Unity Batchmode build에서 reimport시간 단축하기

개요
Unity에서 각 플랫폼별의 빌드를 실시하는 경우, 플랫폼별 전환간에 Reimport all동작이 발생함으로 인해서 속도의 저하를 야기하는 현상을 해결하고자 함.

참고자료
http://sassembla.github.io/Public/2014:12:15%2000-00-00/2014:12:15%2000-00-00.html

기법
우선 reimport all의 동작 자체를 막는 방법은 없는듯 하다.
다만 이 과정에서 불필요한 파일들 마저 reimport되는 현상이 있기 때문에,
unity에서 터치하지 않는 파일들로 일시적으로 파일명을 바꾼후에, 리빌드를 실시.

상위 투고나,
http://jemast.com/unity/fast-platform-switch
와 같은 툴에서도 같은 기법을 쓰고있는데, 어느쪽이든 유니티 내부에서 해결하고 있다.

이번에 구축하는 포트폴리오에서는 shell script를 통한 배치모드에서의 reimport all에서의 처리량 경감을 목적으로 하기에, 단순하게 일시적인 rename도 쉘스크립트에서 해결하고자 한다.

# ------------------------------------------------------------
# for avoiding reimport all : temprally change extensions
# ------------------------------------------------------------
LIST=$(find ..)
TARGET="^../MasterCSV"
for FILE in $LIST; do
if [ -f $FILE ]; then # check is file
if [ ! $(echo $FILE | grep -e "[¥.dummy|¥.cs|¥.cs¥.meta|¥.dll|¥.dll¥.meta|¥.sh|¥.sh¥.meta|¥.prefab|¥.prefab¥.meta]$") ]; then
if [ ! $(echo $FILE | grep -e $TARGET) ]; then
echo $FILE
mv $FILE $FILE".dummy"
fi
fi
fi
done


# 유니티의 배치모드 러닝 코드.

echo "--------------------------------------------------------"
echo "일시적으로 이름을 변경한 파일들을 복원하고 있습니다.";
echo "--------------------------------------------------------"
# ------------------------------------------------------------
# for avoiding reimport all : restore filenames
# ------------------------------------------------------------
RESTORE_LIST=$(find .. -name "*.dummy")
for FILE in $RESTORE_LIST; do
if [ ! $(echo $FILE | grep -e $TARGET) ]; then
mv $FILE $(echo $FILE | sed s/.dummy$// )
#echo $FILE" restoring"
fi
done
# ------------------------------------------------------------

echo "--------------------------------------------------------"

위는 일부 반드시 유지되어야 할 파일들은 제외하고 .dummy라는 확장자를 잠시 붙였다가 빌드 실행후, MasterCSV라는 폴더만은 예외로 두어 유지한 채 이름 변경을 일괄적으로 실시한 예제이다.

보존해야 할 폴더의 이름이 다르다면 위를 참고로 하여 특정 패스만 보호된채 이름변경후 빌드 되게끔 수정하면 된다.

실제 빌드

이하에 현재 작업중인 포트폴리오를 실제 빌드처리해보았을때의 결과다.
아직 1개 게임의 리소스도 다 안들어간 상태에서의 빌드임에도 불구하고, 150초와 60초정도의 차이를 보인다.

플랫폼은 4개를 타겟으로 에셋번들을 빌드했을때의 결과이다.

적어도 총 5~6번의 스위칭이 일어난다 (배치모드 스타트업에서 standalone for PC -> project configured platform if not standalone for PC -> 1st targeted -> 2nd targeted -> 3rd targeted -> 4th targeted)

미 적용시
--------------------------------------------------------
유니티가 마스터 테이블의 에셋번들을 빌드하고 있습니다... 잠시 기다려주십시오
--------------------------------------------------------

Cleanup mono
debugger-agent: Unable to listen on 6
Exiting batchmode successfully now!
Material 0: Orc
Texture 0: Map #0
Material 0: Orc
Texture 0: Map #0
Material 0: Orc
Texture 0: Map #0
--------------------------------------------------------
일시적으로 이름을 변경한 파일들을 복원하고 있습니다.
--------------------------------------------------------
Buildup time : 150 sec
--------------------------------------------------------
Build trying done

--------------------------------------------------------

적용시
--------------------------------------------------------
Reimport할 필요 없는 파일들의 이름을 일시적으로 변경하고 있습니다.
--------------------------------------------------------
...
--------------------------------------------------------
유니티가 마스터 테이블의 에셋번들을 빌드하고 있습니다... 잠시 기다려주십시오
--------------------------------------------------------

...

----- Total AssetImport time: 0.089951s, AssetImport time: 0.065578s, Asset hashing: 0.000000s [0 B, 0.000000 mb/s]

Cleanup mono
debugger-agent: Unable to listen on 6
Exiting batchmode successfully now!
--------------------------------------------------------
일시적으로 이름을 변경한 파일들을 복원하고 있습니다.
--------------------------------------------------------
Buildup time : 60 sec
--------------------------------------------------------
Build trying done

--------------------------------------------------------

댓글 없음:

댓글 쓰기