본문 바로가기

C#

WWW로 렉없이 텍스쳐 로드하기 var www = UnityWebRequestTexture.GetTexture("https://static.pexels.com/photos/236047/pexels-photo-236047.jpeg"); yield return www.SendWebRequest(); var texture = DownloadHandlerTexture.GetContent(www); 더보기
[IL2CPP] Avoid Boxing Avoid BoxingIL2CPP OPTIMIZATION : Avoid Boxing Boxing은 코스트가 높은 연산이다. 이 글에서는 기존 C# 컴파일러는 특정한 상황에서 불필요한 Boxing이 수행되고, IL2CPP가 이를 어떻게 회피하는지를 보여준다.기존 C# 컴파일러의 방식interface HasSize { int CalculateSize(); } struct Tree : HasSize { private int years; public Tree(int age) { years = age; } public int CalculateSize() { return years*3; } }public static int TotalSize(params T[] things) where T : HasSize { va.. 더보기
[C#] Linq.Expression Snippets 원본 : https://github.com/pjc0247/LinqExpressionSnippets LinqExpressionSnippetsSystem.Linq.Expression 네임스페이스 아래의 기능들에 대한 복붙용 코드 조각들. Lambda를 Expression으로 전달받기람다의 타입 판별public static void Foo(Expression f) { // Foo(() => Math.Abs(1)); if (f.Body is MethodCallExpression) Console.WriteLine("MethodCallExpression"); // Foo(() => pos.x); if (f.Body is MemberExpression) Console.WriteLine("MemberExpression.. 더보기
[MSIL] 람다식의 캡쳐 구현하기 쓰다말음 void Foo(int a, int b, int c) { return a + b + c; } var Foo2 = (int c) => { return Foo(10, 20, c); }; 위의 경우처럼 함수의 인자를 줄이기 위해서 람다식을 사용하는 경우가 있다.c++의 std::bind 같은 메소드가 제공되면 편하겠지만, C#은 그러한 메소드를 제공하지는 않는다. 정상적인 코드라면 그러한 메소드를 사용하는것보다 람다함수의 캡쳐를 쓰는게 훨씬 낫기 때문에. 하지만 런타임에 위 코드처럼 어떤 메소드의 인자를 줄이고 싶은 상황에서는 상당히 불편하다. 따라하기 위해서는 먼저 C# 컴파일러가 람다와 캡처를 어떻게 처리하는지를 알아야 할 필요가 있다. (보고 배끼기 위해서) string message = "He.. 더보기
[C#] Async,Await의 내부 원본 https://github.com/pjc0247/behind_async_await behind_async_awaitC#은 stackless한 코루틴을 지원합니다. 어케 가능한지 아라보자static async void Foo() { Console.WriteLine("A"); await Task.Delay(1000); Console.WriteLine("B"); await Task.Delay(1000); Console.WriteLine("C"); }아래의 코드는 Foo 함수를 디컴파일 한 결과물을 기반으로 다시 작성되었습니다. 대충 필요한것만 남기고 생략함class MyAsync : System.Runtime.CompilerServices.IAsyncStateMachine { internal AsyncV.. 더보기
[C#] async void / Task async void AsyncVoid() { /* .... */ throw new Exception(); } async Task AsyncTask() { /* .... */ throw new Exception(); } 공통점* 둘다 메소드 본문이 다 실행되기도 전에 리턴한다. 정확히는 첫번째 await 를 만나기 전까지는 계속 실행되고, 첫번째 await를 만나면 리턴한다. void 의 경우* 익셉션이 발생하면 UnhandledException으로 간주되고 프로그램이 종료된다. (.NET 런타임이 이 메소드가 익셉션을 내는지 안내는지를 감시한다) Task 의 경우* .NET 런타임이 감시하지 않는다. 유저가 예외처리를 해야 함* 발생한 익셉션은 리턴값 Task의 Exception에 채워진다 * 또는 aw.. 더보기
[HTTP] 웹소켓 핸드쉐이킹 먼저 클라이언트에서 웹소켓 오픈 시, 서버로 아래와 같은 요청이 온다.(일반적인 HTTP 요청의 형태에 몇몇 추가적인 헤더를 담아서 보내는 방식이다.) HTTP/1.1 / GET Connection:Upgrade Sec-WebSocket-Key:alyAT1R7MR+KBq8VjSX0ug== Sec-WebSocket-Version:13 Upgrade:websocket 여기서 살펴보야아 할 값은 Sec-WebSocket-Key인데, 이 값은 서버가 웹소켓 프로토콜을 제대로 이해하고 있는지를 구별하는 역할을 한다. 이제 서버에서는 프로토콜 업그레이드에 대한 응답을 보내주어야 한다.상태 코드는 101번이고, 반드시 Sec-WebSocket-Accept 헤더에 알맞은 값을 채워서 보내야한다. 클라이언트로부터 받은 .. 더보기
[Unity] 왜 만들었는지 모를 IL2CPP IL2CPP는 유니티에서 발표한 AOT 컴파일러이다. 특이한점이 있다면, 인풋은 이미 빌드된 IL 코드 (DLL)이며, 아웃풋은 C++ 코드이다.그러니까 이미 빌드된 바이너리를 다시 뜯어서 컴파일 가능한 C++ 소스코드로 만들어낸다는건데, 어떻게보면 AOT가이나리 디컴파일로 생각할수도 있겠다. 유니티가 주장하는 IL2CPP의 장점- 퍼포먼스 : c++로 변환되서 네이티브 어셈블리로 실행되기 때문에 퍼포먼스 향상이 있다고 한다. 근데 처음부터 c++로 짜여진 코드도 아니고, IL을 c++ 코드로 변환한것이기때문에 최종 결과물인 c++ 코드에 .Net VM 호환성을 위한 코드들이 상당히 많이 들어간다. 어차피 Mono도 JIT이니, AOT니 전부 지원하는데 큰 효과가 있느지는 잘 모르겠다. 유니티측 벤치는 .. 더보기
[C#] Mono 환경인지 구분하기 bool isMonoEnv = Type.GetType("Mono.Runtime") != null; 가끔 모노에서만 오작동하는 코드를 분기처리하기 위해 더보기
[NUnit] Callback 방식의 API 테스트하기 [Test] public async void Login() { var t = new TaskCompletionSource(); Auth.Login( (result) => { t.TrySetResult(result); }); var loginResult = await t.Task; Assert.Equals(loginResult, true); } Setup 등의 메소드에서는 async 키워드를 사용할 수 없다. t.Task.Wait() 메소드를 호출해서 강제로 대기해야 한다. 더보기