더블즈비의 기묘한 공방
-
로컬 LLM을 게임에 넣어보자 #1 : 준비
로컬 LLM을 게임에 넣어보자 #1 : 준비
2025.04.01바야흐로 대 AI 시대이다. 비용과 성능의 사이에서 몸을 비틀며 게임을 만들고 있는 사람들이 많을 거라 생각한다.나는 그 중에서 최적화 빌런답게 비용에 집중해보기로 했다. 돈 한푼 안 들이고 생성형 AI를 사용하는 프로젝트를 만드는 게 목표다. 한계뭘 시작하지도 않았는데 한계부터 제시한다.사실 Llama나 Deepseek 등 저사양 로컬 모델을 일정 기간 사용해봤는데, 완벽한 성능을 기대하는 것은 어려웠다. 한글이 깨지기도 하고, 할루시네이션도 많이 뱉고... 맥락을 제대로 읽지도 못하는 경우가 많았다. (허깅페이스에서 한국어 파인튜닝 모델을 사용했다)또한 로컬 모델은 컴퓨터 사양에 따라 생성 속도가 달라지는 결정적인 문제점을 가지고 있었다.일단 이번 프로젝트는 문제점이 해결될만한지 각을 보는 정도로만.. -
How We Die: 우리들이 죽는 방법 회고 (4) - 기타
How We Die: 우리들이 죽는 방법 회고 (4) - 기타
2024.10.10이제 마무리다. 다른 기타 일감들을 어떻게 처리했는지를 알아보고, 앞으로는 어떻게 해야 할지를 써 보자.사실 다른 글들은 작업방식에 관한 이야기였는데 이번 글은 홍보 등이 들어 있어서 오히려 가장 회고할 거리가 많은 글인듯. 마케팅 이슈우리 게임 해주세요~ 같은 글을 정말 못 쓰는 편이다. SNS에 아 오늘 일 끝났다 ^w^ 같은 글만 잔뜩 올리는데 홍보 글을 쓸 리가 만무하다. 스팀 성공 공식인 벤치마크에 따르면 출시 전까지 최소 위시리스트 7,000개는 모아야 중박은 칠 수 있다고 한다.이 정보를 출시 3개월 전까지 모르고 있었기에, 우리 게임은 아쉽지만 위시리스트가 1000개인 상태로 출시하게 되었다.작은 갯수지만 이 위시리스트를 어떻게 모았는지 효과가 있었던 것과 없었던 것으로 구분해서 정리해.. -
How We Die: 우리들이 죽는 방법 회고 (3) - 그래픽
How We Die: 우리들이 죽는 방법 회고 (3) - 그래픽
2024.10.10결국 그래픽 회고를 쓸 때가 와버렸다. 나는... 나는 아트를 못한다! 아니, 못하기도 못하는데 못하겠다!어떻게 이 감각으로 몸을 비틀며 아트를 만들어냈는지 그 작업방법을 소개한다. 미드저니 사용우선 짚고 넘어가자. 이 게임은 아트에 AI를 사용한 게임이다. 3D인데 어떻게 AI를 썼다는거임? 하는 사람들이 종종 있다. 화면에서 AI가 만든 부분들만 표시해보면 다음과 같다. 1. 맵 배경 이미지이건 아주 정직하게, 보드 뒷편에 깔리는 맵 배경 이미지이다.게임에는 20장 정도 들어갔는데 해당 이미지 위에 오브젝트가 올라가기 때문에 어차피 가려지고 마는 비운의 리소스다 (...) 2. 선택지 상황 배경 이미지해당 캐릭터들이 처한 상황을 더 쉽게 알아볼 수 있도록 1:1 사이즈로 나타낸 스토리 배경 이미지.. -
How We Die: 우리들이 죽는 방법 회고 (2) - 개발
How We Die: 우리들이 죽는 방법 회고 (2) - 개발
2024.10.10How We Die 회고, 개발편이다. 프로젝트 내내 다른 부분에서 고통받다가 유일하게 힐링할 수 있었던 구간이 개발이다.그 말은 시스템을 개발했던 6월까지만 행복했고 콘텐츠 개발을 해야 했던 7월부터는 지옥에 있었다는 소리다. (...)프로젝트 마무리즈음에 잘하는 것만 하고 살고 싶은 욕구가 늘었다가... 출시 후에 유저분들이 플레이하는 걸 보고 어쨌든 행복해짐 :P작업 방식을 먼저 쓰고, 전체적인 개발 구조는 더 아래에 쓰는 방식으로 서술하겠다. 아래로 내려갈 수록 읽고 싶지 않은 글이 되겠구만. Sentry를 사용하여 에러 로그 수집재직 중에 파이어베이스 크래시리틱스를 사용했더니 안정성이 대폭 올라간 경험을 이미 해봤기 때문에, 이번 프로젝트도 적용은 필수라고 생각했다. 그런데 파이어베이스는 데스..
-
[C#] 구조체의 get/set을 조심하자
[C#] 구조체의 get/set을 조심하자
2024.06.04잠깐 생각해보면 당연하고 별 거 아닌데, 아무 생각 없이 쓰다가 디버깅때문에 고통받았다. 보통 외부에서 참조는 할 수 있지만 내부에서만 변경하고 싶은 객체를 만들 때, get/set을 쓰는 게 일반적이다. 예시로 단순히 int 변수를 가진 somethingClass 객체를 만든다고 해 보자.public static somethingClass A { get; private set; } public static void Main(string[] args) { A = new somethingClass(0); A.count++; Console.WriteLine(A.count); //Output is 1 } public class somethingClass { public int count; public some.. -
왜 partial Enum은 없는 걸까?
왜 partial Enum은 없는 걸까?
2024.03.21왜 partial Enum을 쓰려고 했는가 최근 개인 프로젝트에서 partial class를 자주 활용하는 방식으로 개발하고 있다. 파일 하나에 클래스의 모든 멤버나 메서드를 정의하지 않고, 다른 파일에 나눠서 적을 수 있어서 확장성이 높은 방법이라고 생각한다. 이런 방식을 자주 쓰다 보니 아래와 같은 경우가 생겼다. public static partial class ModifierUtil { public const int StatMaxPenaltyId = 3; public static void AddStatPenalty(this ModifierStorage storage, int value) { storage.Add(new ModifierSomething(StatMaxPenaltyId, value));.. -
[알쓸유잡 : 모바일 최적화] 영상 정리하기
[알쓸유잡 : 모바일 최적화] 영상 정리하기
2024.01.20이번 포스팅은 유니티 공부를 할 때 항상 신세를 지고 있는 알쓸유잡 콘텐츠를 공부하고 기록해보는 글이 되겠다. 특히나 이번 영상은 최적화였기 때문에, 프로파일러 안의 숫자를 하나라도 더 줄이면 쾌감을 느끼는 편인 나는 어쩔 수 없이 글을 쓸 수밖에 없었다. 음... 변태같은 소리는 뒤로 하고 본론으로 들어가자. 소개 https://www.youtube.com/live/-IrpQzZi_p8?si=tz7lyopfIHhbdPyX https://blog.unity.com/engine-platform/updated-2022-lts-best-practice-guides Updated 2022 LTS Best Practice Guides for optimizing games | Unity Blog Each guide.. -
URP는 Built-In과 뭐가 다른가? (1) : SRP Batcher
URP는 Built-In과 뭐가 다른가? (1) : SRP Batcher
2023.12.17최근 Unity 2022 LTS 버전을 사용해보면서 URP도 겸사겸사 사용해보게 되었다. 대체 Built-In과 뭐가 다른가 싶어서 유니티 공식 문서를 받아 공부해보고 있는데, 정리가 필요하다고 느꼈다. 다만 이론적인 것 말고, 실무에서 무엇이 달랐는지 하나씩 정리해보려 한다. SRP Batcher가 뭔지 요약해서 알려달라 간단하게 말하면, 같은 쉐이더를 쓰는 오브젝트를 그릴 때 렌더링 성능을 개선해주는 녀석이다. '같은 머티리얼을 쓰면 Draw Call이 하나'라는 게 '같은 쉐이더를 쓰면 SetPass Call이 하나'가 된 것이다. 즉, 같은 쉐이더를 쓰는 것만 신경쓰면 성능 개선을 이뤄낼 수 있는 개꿀 기능이라는 것이다. 다만, 파티클 시스템과 UI에는 적용되지 않는다. 뭘 어떻게 성능 개선을 한.. -
3매치 구조 회고 (4) : 효율적으로 힌트 찾기
3매치 구조 회고 (4) : 효율적으로 힌트 찾기
2023.09.25현재 회사에서 설계하고 유지보수한 3매치 코드는 이미 검증되었지만, 과거의 자신을 돌아보는 것이 늘 그렇듯 다시 읽어보면 구데기인 부분이 너무 많다. 그래서 이 시리즈는 과거의 설계를 돌아보며 더 확장성있는 코드를 고민해보는 글이 되겠다. 조건 1. 일정 시간동안 유저가 조작을 하지 않을 경우, 힌트를 보여 줄 것. 2. 이 때, 우선순위가 높은 힌트를 먼저 보여주어야 함. 3. 유저가 조작을 하기 전까지 랜덤한 힌트를 돌아가면서 보여주어야 함. 3-1) 3x1 이상의 우선순위 매치가 있을 경우, 그 매치들만 돌아가면서 보여 준다. 3-2) 일반 매치만 힌트 대상일 경우, 일반 매치만 돌아가면서 보여 준다. 과거의 나 1. 왼쪽 아래에서부터 위/오른쪽 방향으로 스왑한 결과의 매치를 조사한다. 1-1) 같..