[Servant X Service] 과소평가
'Thinking' 카테고리의 다른 글
[진격의 거인] 아무것도 버릴 수 없는 사람은.. (0) | 2013.09.29 |
---|---|
프로그래머 죽이기 (0) | 2013.09.26 |
에버노트 CEO 필리빈의 말. (0) | 2013.09.24 |
[은수저] 남자의 가치 (0) | 2013.08.30 |
[우주형제] 어느 쪽을 선택할 지 고민되면.. (0) | 2013.08.20 |
[진격의 거인] 아무것도 버릴 수 없는 사람은.. (0) | 2013.09.29 |
---|---|
프로그래머 죽이기 (0) | 2013.09.26 |
에버노트 CEO 필리빈의 말. (0) | 2013.09.24 |
[은수저] 남자의 가치 (0) | 2013.08.30 |
[우주형제] 어느 쪽을 선택할 지 고민되면.. (0) | 2013.08.20 |
내피세포의 줄어들 개연성이 높다 아주 위험한 수술
미국이나 유럽에서는 쉽게 하지 않는다.
위험을 감수하고 받는 수술
훌륭한 개발자는 당장이라도 회사를 그만둘 수 있어야 한다. (0) | 2013.09.13 |
---|---|
게임기획자는 프로그래밍을 알아야 할까? (0) | 2013.09.12 |
[펌] 게임뮤지엄의 유엔아이가 특허권을 침해했다고 하는군요. (2) | 2013.08.22 |
[iOS] 카카오톡 테마 (0) | 2013.07.12 |
게임 끝장내기 (0) | 2013.07.02 |
출처 : 애니메이션 '은수저' 중..
[진격의 거인] 아무것도 버릴 수 없는 사람은.. (0) | 2013.09.29 |
---|---|
프로그래머 죽이기 (0) | 2013.09.26 |
에버노트 CEO 필리빈의 말. (0) | 2013.09.24 |
[Servant X Service] 과소평가 (0) | 2013.09.06 |
[우주형제] 어느 쪽을 선택할 지 고민되면.. (0) | 2013.08.20 |
[추가]
아래 이미지 클릭이 안되는 것 같습니다. 파일로 올렸으니 파일을 받아주세요.
[주의] 이미지 클릭해서 원본 크기로 보이는 상태에서 저장하세요~
출처 : http://minus.com/mwp-animedual
[적용한 바탕화면]
링크 : http://www.booncotter.com/unity-prefactory-a-better-pool-manager/
참조 : http://forum.unity3d.com/threads/127997-Prefactory-Free-PoolManager-PoolObject-System
Mobile Movie Texture (0) | 2013.12.03 |
---|---|
원격 로그 플러그인 (0) | 2013.11.20 |
IronPython (0) | 2013.10.06 |
UniPython (0) | 2013.10.06 |
iOS 플러그인 제작 (0) | 2013.09.15 |
방금전에 한빛 소프트로부터 연락을 받았습니다.
두달전에 게임뮤지엄에서 출시한 유엔아이가 한빛 소프트에서 특허를 내 놓은 게임 플레이 방식을 침해하고 있기에 특허료를 내던지 게임 서비스를 내리던지 하라고 하더군요.
자신들의 특허는
1. 한대의 단말기로 2인 이상이, 화면 분할 방식등으로 플레이하는 방식이며 모든 플랫폼에 적용된다.
2. 단 이 특허는 국내에서만 적용된다.
황당해서,
그럼 특허 내 놓으신 방식으로 발매하신 게임이 있으십니까?
한대의 폰으로 두명 이상이서 즐기는 방식의 게임은 외국에는 이미 전부터 있는 방식입니다.
라고 물어보니,
"발매한 게임은 아직 없다."
"국내 특허이기에 국내에서만 적용된다." 라고 말을 하더군요.
다른 분야 쪽에서 특허 장사를 한다는 이야기는 많이 들어 봤습니다만..
표현력과 창작력이 생명인 게임 업계 쪽에서 이런 식으로 상용화 시키지도 않은 채로 자신들만의 아이디어인냥 특허만 따 놓고 기다리다가 누군가가 건드리면 너 잘걸려 들었다! 라고 특허권을 들이미는 것은..
대기업이 특허권이란 명목으로 중소 개발업체들의 손발과 같은 표현력을 묶어 버리는것과 같은 일이라고 생각됩니다.
법인지라, 끝까지 가 보고..
접어야 한다면 국내 서비스를 접고 해외 서비스만 하던지 할 계획입니다.
그들의 특허권을 명백히 침해 하였다면, 특허료를 내는 것도 방법의 하나이겠습니다만..
국내 개발자들의 표현의 자유를 구속시키는 장삿속에 첫타자로 나서서 굴복하고 싶지 않습니다.
마지막으로,
게임을 사랑하시는 여러분들께 한가지 부탁의 말씀이 있습니다.
이 포스팅 최대한 스크랩을 해 가시던지 퍼뜨려 주시면 감사하겠습니다.
이유는,
첫번째로, 둘이서 폰 하나로 하는 표현 방식으로 앞으로 국내에서 유엔아이보다 더 재미있고 훌륭한 게임들이 나올 수 있고 그것을 유저들이 즐길 수 있는 자유를 대기업이 침해하지 말아줬으면.. 하는 바램
두번째로는, 지금 저희와 같은 게임을 개발중인 회사가 있다면 이런 일이 있으니 이를 미리 준비 하고 있으셔야 할 것이라는 바램..
때문입니다.
세번째로는, 밖에 나가서 명함 내밀면서 저희는 게임 회사입니다. 라고 말하는 회사라면..
이런 일보다는 어떻게하면 재미있는 게임으로 유저들에게 행복을 줄 수 있을까? 라는 게임 개발자가 할 수 있는 가장 건설적인 생각에 몰두해 주시길 바라는 마음이 간절하기 때문입니다.
가능한한 스크랩 많이 해 주시면 감사하겠습니다.
2013년 8월 21일
게임 뮤지엄 대표
전 성구 올림
[출처] 게임뮤지엄의 유엔아이가 특허권을 침해했다고 하는군요.|작성자 게임기 컬렉터
게임기획자는 프로그래밍을 알아야 할까? (0) | 2013.09.12 |
---|---|
[펌] 안과의사가 솔직히 까놓고 말하는 라식 라섹 위험성 (0) | 2013.09.01 |
[iOS] 카카오톡 테마 (0) | 2013.07.12 |
게임 끝장내기 (0) | 2013.07.02 |
사진 100장으로 보는 격동의 한국 현대사 (0) | 2013.05.16 |
출처 : 애니메이션 [우주형제] 한 장면..
[진격의 거인] 아무것도 버릴 수 없는 사람은.. (0) | 2013.09.29 |
---|---|
프로그래머 죽이기 (0) | 2013.09.26 |
에버노트 CEO 필리빈의 말. (0) | 2013.09.24 |
[Servant X Service] 과소평가 (0) | 2013.09.06 |
[은수저] 남자의 가치 (0) | 2013.08.30 |
출처 - http://docs.unity3d.com/Documentation/Manual/iphone-playerSizeOptimization.html -
iOS 플레이어 빌드 사이즈 최적화 하기.
빌드 사이즈를 줄이는 방법은 크게 두 가지가 있습니다. Xcode에서 Active Build Configuration을 조절하는 방법과 Unity에서 Stripping Level을 조절하는 방법입니다.
Relese Mode로 빌드 하기.
Xcode에서 빌드 할 때Active Build Configuration 드롭다운 메뉴에서 Debug 와 Release 옵션을 선택할 수 있습니다. Debug Mode 대신 Release Mode로 빌드를 하면 게임에 따라서 2-3MB 정도의 빌드 크기가 줄어듭니다.
- The Active Build Configuration drop-down -
Release Mode로 빌드를 하게 되면 Debug 정보 없이 빌드를 하기 때문에, 게임이 크래쉬가 발생하거나 다른 문제가 생겼을 때 Stack Trace 등의 정보를Output으로 확인할 수가 없습니다.
제작이 완료돼서 배포를 하는 게임의 경우에는 문제가 되지 않겠지만, 개발 중에는 Debug Mode가 유용합니다.
iOS Stripping Level (Advanced License feature)
Stripping Level 을 조절해서 빌드 크기를 최적화 하는 방법은 아래와 같은 방법으로 진행이 됩니다.
1. Strip assemblies level: 스크립트의 Bytecode를 분석해서, 해당 클래스와 메소드가 참조가 되는지 여부를 확인하고, 참조되지 않는 부분은 DLL에서 제거되고, AOT 컴파일 단계에서 제외 됩니다. 이 최적화 방법은 Main binary의 크기와 수반되는 DLL을 줄이는 방법으로, 리플렉션을 사용하지 않는 한 안전한 방법입니다.
2. Strip ByteCode level: (Data 폴더에 저장되는)모든 .Net DLL은metadata로 strip되어 크기가 줄어듭니다. 모든 코드가 AOT 단계에서 미리 전처리(precompiled)가 되고, main binary에 링크가 되기 때문에 이 방법이 가능하게 됩니다.
3. Use micro mscorlib: 특별한 경우로, mscorlib의 smaller 버전을 사용하는 방법입니다.
이 라이브러리에서는 일부 컴포넌트가 제외된 버전입니다.
예를 들어, Security, Reflection.Emit, Remoting, non Gregorian calendars 등이 제외됩니다.
또한 내부 컴포넌트간의 상호의존성이 줄어들게 됩니다. 이 방법은 main binary와 mscorlib.dll의 크기를 줄이는 방법이지만 일부 System 및 System.Xml 어셈블리 클래스에서는 호환이 되지 않으니 주의를 해야 합니다.
이 Level들은 축적이 됩니다, 다시 말해서, Level 3 최적화 방법은 Level 2 와 Level 1을 내포하고, Level 2 최적화 방법은 Level 1을 포함합니다.
주의: Micro mscorlib 는 core 라이브러리의 크기를 많이 줄인 버전입니다. micro mscorlib 를 사용할 때 가장 좋은 방법은 제작중인 어플리케이션에서 사용하지 않는 .Net 클래스와 기능들을 사용하지 않는 것입니다. 제외할 예로 GUID가 가장 좋은 예시가 될 것 같습니다. GUID를 직접 만들어서 대체 사용이 쉽고, 직접 제작해서 사용하는 경우 성능 면에서 앱 사이즈를 줄이는 면에서도 모두 좋은 결과를 낼 수 있습니다.
Tips
리플렉션을 사용할 때 Stripping 조절하는 방법
Stripping은 static code analysis에 많이 의존하는 방법이기 때문에, 효율적으로 진행이 되지 않는 경우가 종종 발생합니다.
한 예로 리플렉션과 같은 dynamic 기능이 사용되는 경우입니다. 이런 경우, 사용하거나 참조해야 하지 않는 클래스 등을 명시 하는 것이 필수적입니다.
유니티는 프로젝트 별로 따로 custom stripping blacklist를 지원합니다. blacklist를 사용하면 link.xml 파일을 생성하고 Assets 폴더에 두어야 합니다. link.xml 파일의 예제를 아래에서 확인할 수 있습니다. 보존(preservation)되어야 한다고 명시된 클래스들은 stripping에 영향을 받지 않게 됩니다.
<linker> <assembly fullname="System.Web.Services"> <type fullname="System.Web.Services.Protocols.SoapTypeStubInfo" preserve="all"/> <type fullname="System.Web.Services.Configuration.WebServicesConfigurationSectionHandler" preserve="all"/> </assembly>
<assembly fullname="System"> <type fullname="System.Net.Configuration.WebRequestModuleHandler" preserve="all"/> <type fullname="System.Net.HttpRequestCreator" preserve="all"/> <type fullname="System.Net.FileWebRequestCreator" preserve="all"/> </assembly> </linker> |
주의: 하지만 어떤 클래스가stripping 되어야 하고 어떤 클래스가 사용이 되어야 하는지를 판별하는 방법이 어려울 수 있기 때문에, Xcode 콘솔의 에러 메시지를 확인하고, 시뮬레이터에서 앱을 실행시켜서 그런 정보들을 확인하는 것이 필요할 수 있습니다.
최적화된 크기의 앱 배포를 위한 체크리스트
1. 에셋 줄이기: 텍스처에 PVRTC 압축 옵션을 활성화 하고 가능한 범위 내에서 해상도를 줄입니다. 또한, 압축되지 않은 사운드 에셋의 수를 줄입니다. 이 방법에 대한 추가 팁을 아래 링크에서 확인할 수 있습니다. (링크 - http://docs.unity3d.com/Documentation/Manual/ReducingFilesize.html)
2. iOS Stripping Level을 Use Micro mscorlib로 설정합니다.
3. 스크립트 호출 최적화Level을 Fast but no exceptions로 설정합니다.
(Script call optimization level)
4. System.dll 과System.Xml.dll 에 있는 기능들은 사용하지 않습니다.
이 라이브러리들은 micro mscorlib에 호환되지 않는 것 들입니다.
5. 불필요한 code dependencies를 제거합니다.
6. API Compatibility Level을 .Net 2.0 subset으로 설정합니다.
하지만 .Net 2.0 subset은 다른 라이브러리들과의 호화성에 제한적인 부분이 있다는 점을 주의해야 합니다
7. Target platform을arm6로 설정합니다. (OpenGL ES 1.1)
8. JS Arrays를 사용하지 않습니다.
9. 구조체를 포함해서 Value 타입과 조합해서 generic container를 사용 하는 것을 자제합니다.
유니티가 당신에게 알려주지 않는 진실 (0) | 2013.11.03 |
---|---|
하이어라키(Hierarchy)에서 GameObject Active/InActive HotKey for NGUI (2) | 2013.10.28 |
디바이스에서 Debug.Log 메시지 출력하지 않도록 하기 (0) | 2013.08.19 |
유니티 안드로이드 플러그인 만들기 (0) | 2013.07.24 |
Unity3d Texture 레퍼런스정리 (0) | 2013.07.03 |
[추가] 2024-04-17
#define으로 Editor, Device등 원하는 곳에 띄울 수 있게 약간 변형함
#if UNITY_EDITOR
#define MY_DEBUG
#endif
using UnityEngine;
using System.Collections;
using System;
using UnityEngine.Internal;
///
/// It overrides UnityEngine.Debug to mute debug messages completely on a platform-specific basis.
///
/// Putting this inside of 'Plugins' foloder is ok.
///
/// Important:
/// Other preprocessor directives than 'UNITY_EDITOR' does not correctly work.
///
/// Note:
/// [Conditional] attribute indicates to compilers that a method call or attribute should be
/// ignored unless a specified conditional compilation symbol is defined.
///
/// See Also:
/// http://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspx
///
/// 2012.11. @kimsama
///
/// - Unity 5.x 대응(5.x에 추가된 Debug 함수 추가)
/// - isDebugBuild("Development Build") 시 return.
/// 2016-07-25 by blueasa
public static class Debug
{
public static bool developerConsoleVisible
{
get { return UnityEngine.Debug.developerConsoleVisible; }
}
public static bool isDebugBuild
{
//get { return UnityEngine.Debug.isDebugBuild; }
#if MY_DEBUG
get { return true; }
#else
get { return false; }
#endif
}
public static ILogger logger
{
get { return UnityEngine.Debug.unityLogger; }
}
public static void Assert(bool condition)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.Assert(condition);
}
public static void Assert(bool condition, string message)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.Assert(condition, message);
}
public static void Assert(bool condition, object message)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.Assert(condition, message);
}
public static void Assert(bool condition, UnityEngine.Object context)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.Assert(condition, context);
}
public static void Assert(bool condition, string message, UnityEngine.Object context)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.Assert(condition, message, context);
}
public static void Assert(bool condition, object message, UnityEngine.Object context)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.Assert(condition, message, context);
}
public static void AssertFormat(bool condition, string format, params object[] args)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.AssertFormat(condition, format, args);
}
public static void AssertFormat(bool condition, UnityEngine.Object context, string format, params object[] args)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.AssertFormat(condition, context, format, args);
}
public static void Break()
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.Break();
}
public static void ClearDeveloperConsole()
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.ClearDeveloperConsole();
}
public static void DebugBreak()
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.DebugBreak();
}
public static void DrawLine(Vector3 start, Vector3 end)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.DrawLine(start, end);
}
public static void DrawLine(Vector3 start, Vector3 end, Color color)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.DrawLine(start, end, color);
}
public static void DrawLine(Vector3 start, Vector3 end, Color color, float duration)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.DrawLine(start, end, color, duration);
}
public static void DrawLine(Vector3 start, Vector3 end, [DefaultValue("Color.white")] Color color, [DefaultValue("0.0f")] float duration, [DefaultValue("true")] bool depthTest)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.DrawLine(start, end, color, duration, depthTest);
}
public static void DrawRay(Vector3 start, Vector3 dir)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.DrawRay(start, dir);
}
public static void DrawRay(Vector3 start, Vector3 dir, Color color)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.DrawRay(start, dir, color);
}
public static void DrawRay(Vector3 start, Vector3 dir, Color color, float duration)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.DrawRay(start, dir, color, duration);
}
public static void DrawRay(Vector3 start, Vector3 dir, [DefaultValue("Color.white")] Color color, [DefaultValue("0.0f")] float duration, [DefaultValue("true")] bool depthTest)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.DrawRay(start, dir, color, duration, depthTest);
}
public static void Log(object message)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.Log(message);
}
public static void Log(object message, UnityEngine.Object context)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.Log(message, context);
}
public static void LogAssertion(object message)
{
//if (false == isDebugBuild)
// return;
UnityEngine.Debug.LogAssertion(message);
}
public static void LogAssertion(object message, UnityEngine.Object context)
{
//if (false == isDebugBuild)
// return;
UnityEngine.Debug.LogAssertion(message, context);
}
public static void LogAssertionFormat(string format, params object[] args)
{
//if (false == isDebugBuild)
// return;
UnityEngine.Debug.LogAssertionFormat(format, args);
}
public static void LogAssertionFormat(UnityEngine.Object context, string format, params object[] args)
{
//if (false == isDebugBuild)
// return;
UnityEngine.Debug.LogAssertionFormat(context, format, args);
}
public static void LogError(object message)
{
//if (false == isDebugBuild)
// return;
UnityEngine.Debug.LogError(message);
}
public static void LogError(object message, UnityEngine.Object context)
{
//if (false == isDebugBuild)
// return;
UnityEngine.Debug.LogError(message, context);
}
public static void LogErrorFormat(string format, params object[] args)
{
//if (false == isDebugBuild)
// return;
UnityEngine.Debug.LogErrorFormat(format, args);
}
public static void LogErrorFormat(UnityEngine.Object context, string format, params object[] args)
{
//if (false == isDebugBuild)
// return;
UnityEngine.Debug.LogErrorFormat(context, format, args);
}
public static void LogException(Exception exception)
{
//if (false == isDebugBuild)
// return;
UnityEngine.Debug.LogException(exception);
}
public static void LogException(string exception)
{
Exception ex = new Exception(exception);
UnityEngine.Debug.LogException(ex);
}
public static void LogException(Exception exception, UnityEngine.Object context)
{
//if (false == isDebugBuild)
// return;
UnityEngine.Debug.LogException(exception, context);
}
public static void LogFormat(string format, params object[] args)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.LogFormat(format, args);
}
public static void LogFormat(UnityEngine.Object context, string format, params object[] args)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.LogFormat(context, format, args);
}
public static void LogWarning(object message)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.LogWarning(message);
}
public static void LogWarning(object message, UnityEngine.Object context)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.LogWarning(message, context);
}
public static void LogWarningFormat(string format, params object[] args)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.LogWarningFormat(format, args);
}
public static void LogWarningFormat(UnityEngine.Object context, string format, params object[] args)
{
if (false == isDebugBuild)
return;
UnityEngine.Debug.LogWarningFormat(context, format, args);
}
}
----
[추가][Unity 5.3 이상]
It works. And, Unity 5.3 provides an easier solution: Debug.logger.logEnabled=false to disable it. [출처] https://gist.github.com/kimsama/4123043 |
하이어라키(Hierarchy)에서 GameObject Active/InActive HotKey for NGUI (2) | 2013.10.28 |
---|---|
iOS Player 빌드 사이즈 최적화 하기 (0) | 2013.08.19 |
유니티 안드로이드 플러그인 만들기 (0) | 2013.07.24 |
Unity3d Texture 레퍼런스정리 (0) | 2013.07.03 |
유니티 메모리 최적화 (0) | 2013.07.03 |
UnityVS가 드디어 Unity 콘솔창에서 더블클릭하면 라인 찾아가네요.
Visual Studio Tools for Unity 1.9(for Free) (2) | 2014.07.30 |
---|
zhangzhibin commented on 6 Nov 2016