블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2738)
Unity3D (817)
Programming (475)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (58)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
05-02 00:00

'2016/10/26'에 해당되는 글 2건

  1. 2016.10.26 [펌] 유니티 최적화 Tips
  2. 2016.10.26 [펌] 유니티 SendMessage 사용의 장점

최적화 Tips

GameObject를 비활성화

필요한 경우가 아니면 GameObject를 비활성화 해라. 개체수를 감소시켜라.

Scripts를 비활성화

필요한 경우가 아니면 Scripts를 비활성화 해라.

콜백(Update, OnEnable등) 함수의 사용을 자제하자

  • 새로운 스크립트를 생성시에 Update가 생성되는데 불필요한 경우 삭제하자. 그리고 Update에서 꼭 처리해야 하는 경우가 아니면 다른 방법으로 해결하라.
  • Coroutine을 적극 활용해라. Update함수 대신에 Coroutine을 사용할 수 있는 경우는 적극 활용하자. FadeIn/Out 같은 경우 단기간 필요한 기능이므로 코루틴으로 만들 경우 일시적으로 부하가 발생하므로 Update처럼 지속적으로 부하를 일으키지 않는다.

Find류 GetComponent류 함수의 호출 횟수를 줄이자

Find, FindByTag, GetComponent류의 사용을 자제해야 한다. 특히 Update, FixedUpdate같은 곳에서 지속적으로 사용하는 것은 퍼포먼스에 악영향이 있다. Awake, OnEnable에서 미리 찾아서 가지고 있는 것이 좋다.

유니티 엔진에서 제공하는 속성에 접근시 부하 발생

Transform.position, gameObject.transform, gameObject.camera 등 유니티 엔진에서 C# 프로퍼티로 랩핑하여 제공하는 변수 타입에 접근시에 부하와 임시 객체가 생성된다. 캐싱하여 사용하는 것이 좋다.

태그 비교시에 if ( go.tag == “myBot” ) 구문 대신에 go.compareTag(“myBot”)을 사용하는 것이 임시 객체 생성을 회피하는 방법이다.

LINQ 명령어 사용 자제

LINQ 명령어를 사용하는 경우 중간 버퍼가 할당된다. 이는 가비지로 남게 된다.

박싱 언박싱 회피

꼭 필요한 경우가 아니면 SendMessage를 사용하지 말라

SendMessage류의 사용을 자제해야 한다. 직접 함수를 호출하는 경우보다 SendMessage류를 사용하는 경우 100배 느리다. 그리고 호출시에 함수 이름을 넣게 되는데 코드 난독화가 필요한 경우 장애요소가 된다.

foreach() 사용을 자제하자

foreach()를 사용할 경우 enumerator를 생성하기 위해서 힙 메모리를 할당한다. for(;;)문을 활용하는 것이 좋다. 한번 돌 때마다 24bit의 가비지를 남긴다.

문자열

  1. string을 그대로 사용해서 조합 하는 것 보다 StringBuilder를 사용하는 것이 좀더 메모리 친화적이고 퍼포먼스 업에 도움이 된다.
  2. 혹은 String.Format을 사용하자.
  3. 상수 타입 문자열은 const, readonly를 지정하여 가비지 컬렉션에서 제외시키자.



[출처] http://www.antegg.com/wiki/doku.php?id=note:unity_3d:%EC%B5%9C%EC%A0%81%ED%99%94_tips

반응형
Posted by blueasa
, |

다른 오브젝트의 함수를 써야할 때 메시지 호출방법을 쓰는 것이 좋다고 합니다.


이득우 님의 발표자료에 따르면, (아래 화면 참조)

  • 메시지 호출은 클래스 간 의존성을 줄일 수 있고,
  • 이는 코드를 간단하게 만들 수 있는데,
  • 성능의 저하가 있다고 생각하지만 그렇게 느리지 않고 장점이 더 크니 적극적으로 쓰자.
는 결론입니다.

<컴포넌트>.SendMessage 또는 <게임오브젝트>.SendMessage 와 같은 방식으로 쓸 수 있습니다.

구문 형식:
void SendMessage(string methodName, object value = null, SendMessageOptions options = SendMessageOptions.RequireReceiver); 


유니티 레퍼런스 홈페이지 예제를 보면,


using UnityEngine;

using System.Collections;


public class Example : MonoBehaviour {

    void ApplyDamage(float damage) {

        print(damage);

    }

    void Example() {

        SendMessage("ApplyDamage", 5.0F);

    }

}


위와 같은 방식으로 사용하고 있습니다. 파라미터 중 마지막 SendMessageOptions 은 말 그대로 옵션인데, SendMessageOptions.DontRequireReceiver 라고 쓸 경우에는 호출한 함수가 제대로 호출되었는지 여부는 신경쓰지 않고 호출한 것으로 역할이 끝납니다.


C# 에서는 콜백의 기능을 위해 delegate 를 사용할 수도 있습니다. 이와 관련해서 아래의 링크를 참고하세요.


http://unityindepth.tistory.com/entry/유니티-개발자로써-내가-배웠던-최고의-5가지





[출처] http://unitygame.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-SendMessage-%EC%82%AC%EC%9A%A9





[첨부]


  
빕스

덧붙이자면 
SendMessage 도 생각보다 느리지 않다고 알고있습니다.

실시간으로 리플랙션을 통해 함수를 호출하는것이 아니라
엔진에서 맵형태로 관리하기때문에
스트링 비교하는 부하정도만 있는걸로 알고있습니다.


[출처] http://www.gamecodi.com/board/zboard.php?id=GAMECODI_Talkdev&no=2070

반응형
Posted by blueasa
, |