게임을 개발하는 과정에서 콘솔 로그를 출력하는 것은 필수적입니다. 당연히 유니티에서도 로그를 출력하는 함수가 존재하고 Debug.Log()를 많이 사용하시죠.
Manual : https://docs.unity3d.com/ScriptReference/Debug.Log.html
근데 많이들 오해하시는게, 이 Debug.Log 함수는 Debug클래수 함수니까 Development Build일 때에만 작동하고 릴리즈 빌드때는 자동적으로 제거된 다고 오인하시는 것입니다. 콘솔 출력용으로 남발해서 사용되도 최종 릴리즈에는 영향 미치지 않는다고 오인하시는 경우가 많습니다, 하지만 아쉽게도 그렇지 않습니다. Debug.Log()는 릴리즈 빌드때고 고스란히 작동합니다. 따라서 쓸데 없는 성능을 쉽게 잡아먹는 녀석중 하나가 되버리죠.
예를 들어서 다음과 같이 콘솔 출력용 로그를 수없이 찍는 코드를 만들고
public class TestLog : MonoBehaviour {
public int logCount = 500;
public string testStr;
void Update () {
for( int i=0; i< logCount; i++) {
UnityEngine.Debug.Log("test log : " + testStr + "!" );
}
}
}
빈 프로젝트에서 위 코드만 돌린 프로젝트를빌드하여 홍미 폰에 띄우니 30FPS로 돌아갑니다. 디벨롭먼트 빌드가 아닌데도 불구하구요. 물론 실제로 매 프레임마다 500번의 출력을 하는 경우는 실존하지 않을 것입니다. 테스트를 보여주기 위하여 극악의 상황을 만들어본 것 뿐입니다. 다만, Debug.Log()가 쓸데 없이 작동하는 것을 증명하기에 충분한 코드겠지요.
이러한 쓸데없는 행위를 막기 위해서 #if 디파인문을 많이들 사용하십니다. 다음과 같이요
#if TRACE_ON
UnityEngine.Debug.Log("test log : " + testStr + "!" );
#endif
이렇게 두고 플레이어 셋팅의 Scripting Define Symbols이나 .rsp 파일에 TRACE_ON을 추가하한 경우에만 수행되고 아닌 경우에서는 Debug.Log()가 수행되지 않고 60FPS가 잘 나옵니다.
Manual : https://docs.unity3d.com/Manual/PlatformDependentCompilation.html
이제 문제가 전혀 없습니다. 없을까요?
있습니다. 귀찮은게 문제지요.
Debug.Log()를 출력하는 곳이 한두군데도 아니고 매번 작성할 때 마다 #if #endif로 묶으려면 매우 귀찮습니다. 게다가 실수로 잘못 묶으면 짜증이 짜증이 아휴~
대안으로는 Conditional를 사용하시면 편합니다. Debug.log()를 래핑하는 클래스를 만들고 함수에다가 Conditional를 선언하면 됩니다.
using UnityEngine;
using System.Collections;
using System.Diagnostics;
public class TestLog : MonoBehaviour {
public int logCount=500;
public string testStr;
[Conditional("TRACE_ON")]
void DebugLogWrap( string str) {
UnityEngine.Debug.Log(str);
}
void Update () {
for( int i=0; i< logCount; i++) {
DebugLogWrap("test log : " + testStr + "!" );
}
}
}
TRACE_ON 디파인이 켜져있지 않는 경우에는 DebugWrap을 호출하는 라인이 통채로 무시됩니다. 따라서 #if 디파인을 매번 사용하지 않고도 같은 효과를 볼 수 있습니다. 사실 저도 얼마 전에 알게 된 것인데 굉장히 편하네요 ㅋ C# 짱짱맨 :)
MSDN : https://msdn.microsoft.com/en-us/library/4xssyw96(v=vs.90).aspx
궁극적으로는 다음 링크처럼 사용하시면 됩니다 :
https://gist.github.com/kimsama/4123043
끗!
'Unity3D > Others' 카테고리의 다른 글
유니티 안드로이드 빌드 환경 설정 가이드 (5) | 2018.08.03 |
---|---|
유니티 최적화 관련 문서들 모음집 (Documents of optimization for Unity) (5) | 2018.07.10 |
Unity OVR Input (2) | 2017.09.30 |
나만 안써 진짜 사람들 메모리 프로파일러 다 쓰고 나만 안써 (0) | 2017.08.16 |
유니티 Best Practices - Resources 폴더 (0) | 2016.10.14 |
"게임은 어떻게 만드나요?" 라는 질문에 뭐라고 대답해야 할까요? (질문글 작성 가이드) (0) | 2015.08.18 |
유니티 배우려는데 무슨 언어로 배워야할까요? C#? 아니면 자바스크립트? (3) | 2015.06.12 |
Unity 4.6 프로젝트 Unity 5로의 마이그레이션 후기 (0) | 2015.05.27 |
덧글
cagetu 2010/12/29 11:05 # 삭제 답글
오즈라엘 2010/12/29 11:13 # 수정 삭제
냥냥양 2010/12/29 23:41 # 삭제 답글
직접적인 ( / 25535 ), ( * 255 ) 요런식으로 하는게 아니라. ceil(), floor(), 요런건로 써서 해보세요.
기억이 맞다면 될거같아요..ㅡ_ㅡ;;;
근데 frac() 요건 그래픽카드마다 결과값이 달라서..영...amd에 문의 해도 대답없고;;;
그리고...64 unsigned int 이거 느리지않던가요??
오즈라엘 2010/12/30 11:02 # 수정 삭제
올림, 내림이 무슨 연관이 있는 것인지 ㅠㅠ
ATi나 NVIDIA에 문의 메일은 의미가 없어요ㅋ 절대 대답 안해줌 ㅋ
개발 가이드 문서의 틀린 내용도 바로 바로 수정 안하는 녀석들인데요 뭐 ㅋ
uint 64bit은 아직 속도 체크는 아직 안해봤는데, RT를 낭비하지 않으려면 선택의 여지가 없어서요 ㅎㅎ
냥냥양 2010/12/30 17:33 # 삭제 답글
렌더타겟줄이실라고 그런거죠?
제가 방금 테스트해봤는데, amd계열은 속도가 훌륭하고, nvidia계열은 암울하네요...어흑
오즈라엘 2010/12/31 01:28 # 수정 삭제
" there is no native integer math on GPUs before SM4.0"
이 문장을 제대로 보질 못했었네요 ㅎ 이 문장 대로 제대로 처리를 못해서 7600에서는 결과가 이상하게 나오나봅니다.
아래에 링크된 글들을 보면 흐름과 컨셉은 알겠는데, 왜 frac()이 비트 쉬프트의 의미를 가지게 되는지 이해는 안가더라구요. 소수부의 숫자들이 어떻게 bitwise의 효과를 가지게 되는 건가요ㅜㅜ?
nvidia 계열은 어떤 모델로 테스트해보신건지요? 저는 PF64랑 UINT64랑 별 속도 차이는 없어보이던데''
아직 7600에서는 정상적으로 돌지 않아 비교를 안해봤고 8600이상에서 비교해봤습니다.
냥냥양 2011/01/01 13:55 # 삭제 답글
{
vecEncode = floor( float2( vecEncode.x * 255.0f, vecEncode.y * 255.0f ) );
float fResult = floor( floor( vecEncode.x * 255.0f ) + vecEncode.y ) / 65535.0f;
return fResult;
}
float2 Float2Decode( float fDecode )
{
fDecode = floor( fDecode * 65535.0f );
float2 vecResult;
vecResult.x = floor( fDecode / 255.0f );
vecResult.x /= 255.0f;
vecResult.y = frac( fDecode / 255.0f );
return vecResult;
}
이렇게 대충 코딩해 봤는데 문제는 Decal때문에 AlphaBlend를 하고있는 부분이 깨지네요..ㅠㅠ
오즈라엘 2011/01/03 13:59 # 수정 삭제
그나저나 7600에선 여전히 비정상이네요 ㅠㅠ
냥냥양 2011/01/04 01:04 # 삭제 답글
오즈라엘 2011/01/04 11:30 # 수정 삭제
6,7 시리즈는 좀 까리까리한게 있는데, 개발 가이드 문서(http://developer.download.nvidia.com/GPU_Programming_Guide/GPU_Programming_Guide_Korean.pdf)에서는 A16B16G16R16 텍스쳐가 지원 되지 않는다고 나와 있습니다. 하지만 실제로 caps를 뒤져보면 지원을 하더군요. 애초에 지원을 하지를 말던가.. 원..
오즈라엘 2011/01/07 00:48 # 수정 삭제
냥냥양 2011/01/11 10:15 # 삭제 답글
전 6&7은 버텍스단위에서 라이트계산하고 그림자도 빼고, 포워드로 렌더링하려구요.. 그런거 다 하기엔
넘힘드네요.. 것보다.. m330에서 돌려봤더니 좌절이라. 그쪽 최적화해야겠어요
오즈라엘 2011/01/12 23:13 # 수정 삭제
테라처럼 쌩 디퓨즈만 지원하는 옵을 추가해서 커버하려구요
해상도가 점점 커져가는데 6,7 이넘들은 이를 따라올 수가 없네요.
mx330 말씀하시는 것인가요? 그넘도 지원하시나요 +ㅈ+?
냥냥양 2011/01/15 09:39 # 삭제 답글
오즈라엘 2011/01/15 14:52 # 수정 삭제
노트북용 하면 인텔 GMA가 대박이죠 ㅎ
인텔칩도 스펙상으로는 허용 범위라 신경써야될 밴더가 더 많아졌습니다
OTL