mac에 Unity 빌드 머신 구성하며 발생한 에러들

지속적인 통합(CI : Continous Integration)을 위한 빌드 머신 구성은 필수라고 생각했기 때문에

Unity 작업을 하면서도 빌드를 위한 환경을 구성했습니다.


Unity에서 ios 버전을 만들기 위해서 반드시 mac이 필요하기 때문에, 

mac에 빌드 환경을 구성했고, 작업 과정에서 발생한 몇몇 부분을 기록합니다.


빌드에는 jenkins가 필요하며, Unity 빌드를 위해서 Unity3d Plugin을 설치했습니다.


[문제1]

별 생각없이 인터넷 보고 설치했는데.. 에러가 발생했습니다.

_RegisterApplication(), FAILED TO establish the default connection to the WindowServer, _CGSDefaultConnection() is NULL. 

이 에러는 jenkins가 현재 로그인한 계정으로 빌드를 하지 않았기 때문에 발생합니다.

mac에서 jenkins를 사용하여 unity를 빌드하려면 jenkins가 현재 로그인한 계정으로 빌드를 해야 합니다.


이 얘기는 빌드 구성을 정상적으로 다 해놓고 다른 아이디로 맥 로그인이 되어있다면, 

jenkins를 통한 빌드를 할 수 없다는 이야기 입니다.


해결 방법은

1. http://breaklee.blog.me/60172910998 블로그 처럼 주석 처리할 곳은 주석 처리를 해줘야 합니다.

2. /Library/LaunchDaemons/org.jenkins-ci.plist 파일의 하단부에 <username>이란 항목이 있습니다.

   기본으로 이 값이 jenkins로 설정되어있을 텐데 이것을 현재 로그인한 사용자 이름으로 변경해줘야 합니다.


[문제2]

jenkins execution command로 svn사용시 store password unencrypted 메시지 발생


store password unencrypted라는 메시지와 Yes/No 선택하라는 메시지가 나오고 빌드가 실패합니다.

검색을 해보면 yes/no를 입력하고 안되면 "예"를 입력하라고 하지만, jenkins 빌드 과정에서 적용할 수 없는 방법입니다.


이때는 --no-auth-cache 를 svn 명령에 같이 넣어주면 됩니다.



이상 별거 아닌 에러들 정리입니다.

Unity C#에서 foreach와 GC(Garbage Collection)

유니티 스크립트로 C#을 사용합니다.


C#은 C++과 달리 명시적인 delete를 하지 않고 GC가 메모리 해제 작업을 하기 때문에

GC에서 시간을 많이 잡아먹으면 게임 프레임이 저하되는 문제가 발생할 수 있습니다.


GC 호출을 줄일 수 있는 방법에 대한 이야기들은 인터넷에 잘 정리된 문서가 많이 있는데

뭔가 꺼림직하면서 명확하지 않은 부분이 하나 있는데 그것이 foreach의 사용입니다.


Reducing Memory Usage in Unity, C# and .NET/Mono 에서 foreach에 대한 가이드 라인을 제시합니다.

Avoid using foreach(). It calls GetEnumerator() on your list type, which will allocate an enumerator on the heap just to throw it away. You’ll have to use the more verbose C++-style for(;;) syntax.

enumerator를 힙에 생성하기 때문에 C#의 foreach보다는 C++ 스타일의 for(;;;) 문을 사용하라는 이야기입니다.


그러나, Foreach, Garbage, and the CLR Profiler 는 다르게 이야기합니다.

Foreach, Garbage, and the CLR Profiler는 CLR Profiler를 사용하여 foreach를 사용할때 

GC가 발생하는지 여부를 테스트한 결과를 설명합니다. 핵심은 다음과 같습니다.

When doing a foreach over a Collection an enumerator WILL be allocated. 

When doing a foreach over most other collections, including as arrays, lists, queues, linked lists, and others: 

     if the collections are used explicitly, an enumerator will NOT be allocated. 

     if they are cast to interfaces, an enumerator WILL be allocated.

List<> 와 같이 명시적인 Collection을 foreach할 경우에는 enumerator가 할당되지 않지만,

IEnumerable과 같이 인터페이스를 사용하는 경우에는 enumerator가 할당된다고 이야기 합니다.

(정확한 번역은 아닙니다. 제가 이해를 잘못했을 수도 있지만, 웹페이지의 예제를 보면 큰 의미는 일치하다고 생각됩니다.)


두 문서에서 이야기하는 내용이 다르기때문에 foreach를 써도 되는건지,

정말로 Unity C#에서 foreach를 사용했을때 GC가 전혀 발생하지 않는 것인지 궁금했습니다.

Unity profiler에 GC에 대한 내용도 출력이 되니 테스트해봤습니다.


테스트는 Update()시 for(;;)와 foreach를 사용하여 List<>에 접근하여 해당 객체의 Update()를 호출하는것이 전부입니다.


결론은.. foreach에서 GC alloc이 24B 기록되었습니다.

24B가 무엇때문에 발생하는 것인지는 좀더 자세히 찾아봐야 알 것같습니다. 

적어도 Unity C#에서는 foreach가 GC를 전혀 발생시키지 않는다는것은 아닌것 같습니다.


좀더 정확한 이유를 알고 계시거나, 테스트에 문제가 있어서 결과가 잘못 나온것 같다고 

생각되는 부분들은 알려주시길 부탁드립니다. 저도 좀더 정확하게 파악하고 싶습니다.



using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Test
{
    public void Update() { }
}

public class GcTest : MonoBehaviour 
{
    private List _testList = new List();

	void Start () 
    {
        for (int i = 0; i < 100000; ++i)
        {
            Test test = new Test();
            _testList.Add(test);
        }
	}

    void Update() 
    {
        UpdateListUseFor();

        UpdateListUseForeach();     
	}

    void UpdateListUseFor()
    {
        for (int i = 0; i < _testList.Count; ++i)
        {
            Test test = _testList[i];
            test.Update();
        }
    }

    void UpdateListUseForeach()
    {
        foreach (Test test in _testList)
        {
            test.Update();
        }
    }
}


개발 문화? 개발자 문화(Developer Culture)?

다른 회사에서는 생각을 어떻게 수집하고 정리하여 일로 만드는지가 궁금해서 검색을 하다보니 개발 문화라는 큰 주제를 찾게 되어서 관련 내용을 정리합니다.


What makes a good Developer Culture?

(http://software.intel.com/en-us/blogs/2013/03/12/what-makes-a-good-developer-culture)

개발 문화에 대한 이야기를 하면서 구글의 20% 문화, JetCooper의 문화 및 개발 문화가 왜 필요한가에 대한 이야기가 있습니다.

 

구글 개발 문화(20% 프로젝트)

     하루 일과중 20% 또는 일주일중 하루를 사용하여 업무와 다른 프로젝트를 진행합니다.

     

     프로젝트 진행 방법

          1. 자신이 하려는 일이 아직 프로젝트가 돼있지 않다면 아이디어 마켓에 자신의 아이디어를 올린다.

          2. 일정 수 이상의 다른사람들이 좋은 아이디어라고 동의하면 20% 프로젝트가 된다.

          3. 20% 프로젝트가 어느정도 성과를 거두고 더 큰 자원이 필요하다고 판단되면 임원에게 

             보고하여 정식 프로젝트로 승격된다. 이제 80% 프로젝트가 되는 것이다.


     구글의 20% 프로젝트 성공의 조건(http://bumworld.dayindayout.co.kr/?p=212

     Management Friday : Google's 80/20 Innovation Model

         구글의 20% 프로젝트에 대한 설명과 적용시 고려해 볼만한 것들에 대한 이야기가 되어있다.

     Mix up the workweek by setting your own 20 percent time

     

JetCooper 개발 문화(http://www.jetcooper.com/blog/jqueryto-recap-creating-a-development-culture/)

      

페이스북 개발 문화(Hackaton, Hackamonth)

http://interpiler.com/2012/05/15/inside-facebook/


카카오와 페이스북이 지루함과 싸우는 법(http://interpiler.com/2012/11/05/small-tea/)


페이스북이 지루함과 싸우는 법에 대한 생각?(http://systemplug.com/1316)

     "카카오와 페이스북이 지루함과 싸우는 법" 을 읽고 자신의 생각을 정리한 글


티켓몬스터 - 코드크래프트(http://blog.ticketmonster.co.kr/7539)


다음 - 해커톤(http://www.bloter.net/archives/107844)

습관 만들기

KBS에서 방영되었던 습관 다큐멘터리(1부 마음의 밧줄을 끊어라, 제 2부 꼴찌탈출, 습관 변신 보고서)를 뒤늦게 보고 좋은 습관을 익히는 방법에 대해서 생각해보며 몇몇 자료를 정리했습니다.


바뀌고 싶은 습관을 어떻게 바뀌고, 좋은 습관을 어떻게 익히는지에 대해서 찾아보고 천천히 시도해 봐야겠습니다.


습관을 만들기 위해서는 66일의 기간이 필요하다.

습관이 생성되는데 평균 66일이 걸린다는 연구 논문

 - How are habits formed: Modelling habit formation in the real world

습관 연구 논문에 대한 블로그 글

How long to form a habit


다른 사람의 좋은 습관을 내것으로 만들 수도 있다.

빌게이츠의 습관은 다른 사람의 습관을 자신의 것으로 만드는 것이라고 한다.


습관이 되었는지 확인하는 질문

1. 이 행동을 자주 했는가?

2. 자동적으로 했는가?

3. 의식적으로 기억하지 않고 행동했는가?

4. 하지 않으면 이상한가?

5. 내 일상생활에 속해졌는가?

6. 하고 있는지도 몰랐는데 하고 있었나?

7. 해야 하는데 생각할 필요가 있는가?


습관 관련 블로그들

습관을 만드는 쉽고 효과적인 방법 

습관이 생성되는데 걸리는 시간 66일


습관 관련 도서

     습관 66일의 기적(서점, 리뷰)


관련 앱

     21일 습관들이기

     바른 생활

'일상' 카테고리의 다른 글

2013년 끝, 2014년 시작!  (0) 2014.01.06
2010년 내가 한일 정리  (0) 2010.12.30
제대로 공부해야하는데..  (0) 2010.06.02

유니티커스텀 에디터

커스터 에디터에 대한 자료 조사하여 나온 링크들..

에디터 커스터마이징 강좌(1) 

에디터 커스터마이징 강좌(2) 

에디터 확장(1) - 커스텀 인스펙터 

에디터 확장(2) - 메뉴 확장

에디터 확장(3) - 메뉴 확장 Context Menu와 Generic Menu

UnityEditor를 이용해 나만의 에디터 만들기 

커스텀 에디터 제작시 주의할점