개발
-
프로토버프 MergeFrom()에서 만난 오류(feat. 'System.Runtime.CompilerServices.Unsafe)개발/C# 2025. 2. 5. 22:29
서버와 클라이언트가 proto 파일을 컴파일한 결과물인 클래스 파일을 공유하는데 어떻게 역직렬화하는 과정에서 오류가 생길 수 있을까. 결론부터 말하자면 System.Runtime.CompilerServices.Unsafe의 버전 문제였다. 프로토버프를 서버와 연동하는 과정에서 System.Runtime.CompilerServices.Unsafe.dll을 csharp 환경에 있는 라이브러리에서 가져다 썼었다.C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.12 여기에 있던 dll 버전이 낮았나 보다. 전체 오류 메시지를 보면 버전이 언급되어 있었다.Could not resolve type with token 010000a6 from typeref (ex..
-
프로토버퍼 연동(feat. C# 프레임워크)개발/C# 2025. 1. 28. 13:01
C# 프레임워크는 하나가 아니다. C++를 주로 하다가 C#도 이참에 해두면 좋을 것 같아서 시작했는데 프레임워크 종류를 면밀히 살피지 않고 그러려니 했었다. "뭐 대충 다 호환되겠지!". 어떤 일이든 조금이라도 얕잡아 보는 순간 역으로 당하는 법이다.어디에는 있는 API가 저기에는 없어 프로젝트를 마이그레이션 해야 했고, dll을 복사 붙여넣기 하니까 에러 로그 하나 안 뜨고 제대로 동작하지 않았다. 대상 프레임워크가 다른 것이 이유였음을 알게 됐다. 프로토버프도 마찬가지로, 여기에서 간단하게 설명할 것은 닷넷8.0으로 만든 서버 프로젝트와 2022.3.55f 유니티를 프로토버프로 연동하는 방법이다. 추가적으로 서버 프로젝트의 서버 로직의 dll을 유니티 프로젝트에서도 동작할 수 있게 해볼 거다.서버 ..
-
빌드 이벤트를 통해 자동화를 완성하자개발/C# 2024. 12. 27. 14:17
PacketGenerator를 통해 패킷을 자동으로 만든다. 여기에서 관리하는 패킷의 변경사항이 있을 때 한 번의 빌드로, 이 패킷 파일을 사용하는 프로젝트에 자동으로 파일이 복사가 되면 편의성이 올라갈 것이다. 패킷을 수정하고 나서, 자동화 코드를 통해 패킷이 자동 생성되는데 이를 일일이 손으로 복사 붙여넣기를 하면 시간도 걸리고 휴먼 에러가 발생할 가능성이 높아진다. 이 부분에 대한 자동화다. 비주얼 스튜디오의 옵션 중에 빌드 이벤트가 존재하고 세부적으로는 빌드 전 이벤트, 빌드 후 이벤트가 있다. 우리는 빌드를 하고 나서 배치 파일을 실행해 패킷 파일을 각 프로젝트로 복사할 것이기 때문에 빌드 후 이벤트를 활용해보자. 1. 프로젝트 속성에 기입하는 방법이 있다. 2. 동일한 내용을 프로젝트 파일에도..
-
넷플릭스에서 2K 해상도로 시청하기(feat. 뭘 해도해도 안 될 때)개발/etc 2024. 12. 22. 17:46
검색하면 자세한 방법이 나와있다.안 되는 사람은 뭘 해도 안 됐는데 내가 그 경우에 해당했다.1. HDCP 2.2 / DP 1.4 / hdmi 2.02. 그래픽 카드 30703. QHD 동일 모니터 두 대4. HEVC 코덱 설치5. 싱글 모니터로 해보기6. 윈도우107. 수많은 넷플릭스 앱 재설치 이 조건에서도 넷플릭스에서 정보를 보면 FHD가 나오고 HEVC 코덱이 적용이 안 되어 있는 걸 확인했었다.조금 알아보니 윈도우11에는 향상된 HEVC가 있는 것 같았고 기분 전환겸 윈도우11로 새로 설치했다. 업그레이드가 아니라 포맷 후 재설치를 했다.윈도우11 설치 이후에 HEVC를 설치하려고 하니 이미 설치가 되어 있다는 안내가 떠서 재설치는 하지 않았다. 이미 큰 기대는 하지 않은 상태에서 넷플릭스 앱을..
-
유니티 편집기에서 띄운 프로젝트가 호환되지 않을 때개발/C# 2024. 12. 17. 18:58
동작하던 프로젝트가 안 될 때의 이유는 여러가지겠지만 해결하는 가장 간단한 방법은, sln, csproj 파일과 .vs 폴더를 지우고, 편집기에서 다시 여는 것이다. 현상 자체는 치명적이지만 해결법은 너무 간단한다. 만약 이렇게도 안 된다면 프로젝트를 새로 만들어서 옮기는 방법밖에 없을 것 같다.1. 처음부터 안 된다면 비주을 스튜디오 인스톨러를 통해 Game development with Unity 항목의 설치 여부를 확인할 것2. 프로젝트가 언로드 되었다면 리로드 해보자
-
닷넷 프레임워크 프로젝트를 닷넷 프로젝트로 변경하기개발/C# 2024. 12. 16. 12:55
일단 도우미 프로그램을 설치해야 한다. 쓰고 있는 vs 2022가 영문이라 영어로 뜨는 점을 양해 바란다. 일단 이 도우미 프로그램을 설치하기 위해서는 vs 2022 17.1 이상이어야 한다. (https://learn.microsoft.com/ko-kr/dotnet/core/porting/upgrade-assistant-install#install-the-visual-studio-extension) 0. 완료 이후에 프로젝트 변경 사항을 반영해줘야 하므로 git으로 관리되고 있던 프로젝트라면 별도 브랜치를 생성한다 1. vs2022 프로그램을 실행한다 2. 상단 탭에 Extensions - Manage Extensions를 선택한다 3. .NET Upgrade Assistant를 설치한다 4. vs20..
-
람다의 참조 캡처는 종종 불안하다개발/C·C++ 2024. 11. 22. 21:02
앞서, 콜백 함수의 인자는 C++17의 apply와 tuple을 이용해 처리할 수 있지만 예제를 최대한 간소화하기 위해 콜백 함수의 인자는 하나로 설정했다. 같은 이유로 요청을 처리할 함수는 멤버 함수가 아니라 전역 함수를 사용했다. 커맨드 패턴을 활용해 요청을 Job 객체로 만들어 큐에 넣고 공통 api-보통 커맨드 패턴에서는 Execute()를 애용하므로- Excute()를 호출해 Job(이하 일감)을 처리한다.일감을 실행하기 위한 callback 함수를 요청 객체에서 가지고 있다가 Execute()를 할 때 callback() 함수를 호출하는 구조를 단순홰해서 볼 건데 callback은 람다로 구현할 것이다. 이 때 람다 본문에서 필요한 변수들은 참조 객체를 해도 될까? 값 복사는 비용이 들고 참조..
-
[Protobuf 따라하기] 수신 데이터를 복사 없이 가공하기개발/C·C++ 2024. 11. 8. 17:28
고정 패킷 이후에 등장하는 가변 데이터는 많고 이를 vector로 관리하게 되면 어쩔 수 없이 복사 비용이 발생한다. 개발이 비교적 편한 건 장점이지만 성능 면에서는 단점이다. 이 단점을 개선하기 위해 포인터를 활용하면 유지보수성이나 가독성이 조금 떨어질 수 있지만 성능에서는 이점이 있으므로 트레이드-오프를 잘 생각해자. 고정 패킷을 읽는 건 쉽다. 그냥 형 변환을 하면 된다.// 패킷#pragma pack(push, 1)struct PacketTest{ struct BuffListItem { uint64 buff_id; float remain_time; }; uint16 packet_size; // 공용 헤더 uint16 packet_id; // 공용 헤더 uint64 id; uint32 hp; u..