Unity 엔진을 제대로 다뤄본지 9개월이 넘었다. 매 번 뭐라도 해야 실력이 늘지라고 생각하면서 프로젝트를 생성하고 나서 이것저것 시도해보지만, 구체적으로 뭔가를 만들겠단 생각을 한 게 아니라서 결국 "근데 이제 뭐하지?" 상태에 빠지게 된다.

기획은 한 순간에 완성되는 것이 아니다보니 생각해봐도 곧바로 뭔가 만들만한 그림이 그려지진 않는다. 결국 프로젝트를 종료하고 뭘 만들어야 하나 고민을 한다.

사실 고민은 늘 해오던 것이다. 게임에 관한 괜찮은 아이디어가 있어도 늘 막힌다. 구체적으로 계획을 짜다 보면, 늘 막히는 부분이 온다. 주로 그래픽적인 문제다. 캐릭터들의 움직임에 있어서 3D는 고사하고 2D, 도트조차도 그려낼 수 없는 나로써는 극복하기가 상당히 어려운 문제다. 대부분 게임은 시각적 요소가 중요하기 때문에 이런 부분에서 한계를 크게 느낀다.

 

결국 코딩테스트나 CS 면접 관련 지식을 찾아보는 정도만 하게 된다. 이것도 좋긴 하지만 결국 Unity 클라이언트 개발자로써 Unity 개발 능력을 유지하고 발전시켜야 한다고 늘 생각해왔다. 응시했던 JLPT 시험의 결과도 약 2~3주 뒤면 나오기에 슬슬 취업 전선에 뛰어들 예정인 나는 사실 발등에 불이 떨어진 상태였다.

그러던 도중 드디어 만들만한 게임이 떠올랐다. 이 글은 그 계기에 관한 글이며, 앞으로는 만들어가는 과정에 대한 개발일지를 적어보려고 한다. 사실 어제부터 개발하기 시작했는데, 문득 개발일지를 쓰면 좋겠다고 생각한게 밤 12시 즈음이라 자고 일어나서 쓰기 시작한 내용이다.

약 한 달 전에 블루 아카이브라는 게임을 시작했다. 12월 8일에 월간 청휘석 패키지와 StartDash 3성 확정 모집 티켓 구입 기록이 있으니 아마 그 무렵부터 시작한 것 같다. 이전에도 종종 접하긴 했었는데, 당시에는 우마무스메를 플레이하고 있었던 터라 시작할 생각을 하지 못했다. 그러던 도중 친구가 권해서 시작하게 되었다. 소위 말하는 리세마라를 하다가 아코, 이로하는 무조건 가져가야 한다고 하는데 잘 나오지 않아서 그냥 포기했었다. 어차피 할 게임이 있었기 때문에 별로 시간을 많이 쓰고 싶진 않았다.

그런데 나에게 블루 아카이브를 권했던 친구가 리세를 며칠간 계속 해서 무려 아코, 이로하, 히비키, 이오리, 정월 세리카가 있는 계정을 나에게 주었다. 히비키, 이오리는 "이거 없으면 인권이 없는 것이나 마찬가지"에 해당하는 인권 캐릭터였고, 아코, 이로하는 "이거 없으면 숨도 못쉰다"에 해당하는 호흡권 캐릭터였다. 최근에 나도 친구에게 블루 아카이브를 권하게 되었는데, 50연챠 기준 아코, 이로하만 뽑는다고 치고 계산해봐도 3일 내내 리세를 돌려야 했던 것으로 기억하는데, 어떻게 이렇게 좋은 계정이 나오게 되었는지 모르겠다.

지금은 블루 아카이브라는 게임을 굉장히 좋아하게 되어서 그 친구에게 대단히 감사함을 느끼고 있다. 아, 위에서 언급한 우마무스메는 접었다. 나중에 다뤄보고 싶은 내용인데, 게임이 너무 하드하다. 어제 챔피언스 미팅이 시작해서 접속은 했는데, 아마 머지않아 완전히 접을 수도 있을 것 같다.

사실 나는 게임을 할 때 스토리를 잘 안 읽는 편이다. 스토리 볼 시간에 빨리 게임을 더 즐기고 싶은 마음이 커서 그런데, 블루 아카이브는 원할 때 스토리를 읽을 수 있어서 느긋하게 읽어볼 수 있었다.

블루 아카이브의 스토리는 총 4장으로 나뉘어져 있는데, 그 중 2장에 해당하는 '태엽감는 꽃의 파반느 편'은 밀레니엄 스쿨의 동아리 중 하나인 게임개발부에서 일어나는 일을 다룬다. 나도 게임 개발을 하는 사람이다보니 관심이 더 갔다. 게임개발부의 학생들은 고전 게임을 좋아하는데, 실제 있는 게임들의 이름을 살짝 비틀어서 언급되는 게임들이 있다.

언급되는 게임들 중 파이널 판타지나, 젤다의 전설 외엔 무슨 게임인지 잘 모르겠어서 검색해보았다. 그 중에 관심을 가지게 된 게임이 있었는데, 바로 "영웅전설"이다. 한 글에 따르면, 영웅전설 시리즈의 3-4-5편인 가가브 트릴로지를 말하는 것으로 추측된다고 하는데, 가가브 트릴로지의 각 타이틀인 하얀마녀, 주홍물방울, 바다의 함가 각각의 타이틀이 멋있어보여서 관심이 갔다. 내가 태어나기도 이전, 혹은 5편의 경우 그 무렵에 발매되었던 게임들인데, 이런저런 게임들을 많이 해봤지만, 고전 게임들에는 관심을 가진 적이 없었던 것 같다고 생각하여 한 번 해봐야겠다고 마음을 먹었다. 구매 관련해서 찾아보기도 했으나 아쉽게도 현재로써는 정식 루트로 구매할 수 있는 방법은 없었고, 기껏해야 중고로 사는 것 정도인데 이 방법은 게임사에 이익이 돌아가는 방법이 아니다보니 같은 회사인 니혼 팔콤의 최신작인 영웅전설 궤적 시리즈를 구매하는 것으로 간접적으로나마 대가를 지불하기로 했다.

신영웅전설3 : 하얀 마녀 클리어 후기 (tistory.com)

https://youtu.be/9qNY4mt2oeU

https://youtu.be/Vyw8jwZrDIc

게임 자체는 요즘 흔히 볼 수 있는 쯔꾸르 게임과 비슷했다. 딱히 귀엽고 예쁜 캐릭터들의 일러스트가 있는 것도 아니었다. 그러나 내 마음을 사로잡은 것이 있었는데, 바로 음악이었다. 이 게임을 하면서 가장 좋은 것이 무엇이냐고 묻는다면 바로 음악이라고 답할 것이다. 어쩌면 게임에 있어서 디자인적인 요소보다도 음악이 더 중요할지도 모르겠다고 생각할 정도였다. 다른 음악들도 훌륭하지만, 가장 마음에 들었던 음악의 링크 2개를 첨부한다. 스토리도 훌륭했다. 마을 사람들에게 한 명씩 말을 걸어서 진행하는 방식은 플레이하기 조금 불편하긴 했지만 스토리에 몰입하게 만들어주었다. 기획과 시나리오, 시각적인 요소와 음악, 그리고 이런 것들을 엮어내는 프로그래머. 가히 게임을 종합예술이라고 부를만하다.

 

내가 했던 리메이크 작인 신영웅전설3는 무려 지금으로부터 24년 전에 출시되었는데 지루한 부분 없이 꽤나 몰입하면서 약 2일만에 깼다. 어떻게 이 시절에 이런 게임을 만들었을까 놀라웠다. 약간은 감동했다. 이럴 때면 늘 생각하는 것이 있다. 나도 누군가를 즐겁게 하고 감동을, 행복을 줄 수 있는 게임을 만들고 싶다는 것이다. 이후 또다시 많은 생각을 했다.

 

그러던 도중 떠오른 생각이, 블루 아카이브의 게임개발부 스토리에서 게임개발부가 개발한 "테일즈 사가 크로니클" 이라는 게임을 만들어보면 어떨까? 라는 생각이었다. 그 생각을 토대로 여러모로 생각해보았으나, 쉽지 않았다. 팬 게임을 만드는 이상 타겟 유저층은 블루 아카이브의 플레이어들이 될 수 밖에 없었고, 이 사람들을 대상으로 하는 이상 주인공들은 블루 아카이브에 등장하는 캐릭터들이어야 했다. 테일즈 사가 크로니클 1은 설정상 똥겜이기 때문에, 어머니가 히로인이고 전생의 아내이며 아내는 어렸을 때 헤어진 이복 친구가 타임리프를 해온 것이라 도저히 이 캐릭터들로는 녹여낼 수 없는 내용이었다. 결국 새로운 캐릭터들을 만들고 이 캐릭터들을 주연으로 만들어야 할텐데, 그러면 블루 아카이브 팬 게임과는 거리가 멀어지게 되는 것이 문제였다.

출처: shi0n♨️ 님의 트위터: "予約していたテイルズ・クロニクル・サーガ2が届きました…!! GWも始まったしブルアカもメンテだし、今日は遊ぶぞおおおおおおおおおお!!!!!!!!!!!!!!!!!!! #ゲーム開発部からのお願い #ブルアカ https://t.co/YiHrQB4z5o" / 트위터 (twitter.com)

그래서 작중에서 괜찮은 게임으로 평가받는 "테일즈 사가 크로니클 2"를 만들어보면 어떨까 라는 생각으로 이동하게 되었다. 테일즈 사가 크로니클 2의 내용에 관한 묘사는 레트로 게임이고, 상식에 얽매이지 않는 전개와 세계관을 가지고 있으며, 새로운 세계를 여행하고 또 다른 인연을 쌓아가며 마왕을 물리치는 RPG 게임이라는 정도였다. 그래서 내용은 직접 생각할 수밖에 없었다. 게임개발부의 캐릭터들을 주연으로 사용하면서 용사 vs 마왕의 구도를 만들기에 적절한 것은 모모이와 미도리였다. 둘은 어렸을 적 사이가 안좋았다는 설정이 있고, 자매이기 때문에 싸울 일도 많은데다가 대비되는 점들이 많아 그 점들을 부각시키기 좋다고 생각했기 때문이다. 2장의 시작에서 모모이가 '여신 모모리아'로 등장하기 때문에 처음에는 모모이를 용사 편으로 두었는데, 생각해보면 보통 동생이 손윗사람에게 괴롭힘을 당하는 경우가 많으니 미도리를 용사 편으로 두기로 생각했다. 미도리는 모모이로부터 빼앗긴 영토를 되찾으면서 모험을 하고, 끝에 가서는 결국 자매의 소중함을 깨닫게 되는, 약간은 진부한 내용이었다.

영토를 빼앗는 방법은 어떻게 할까 생각을 했는데, 둘 다 게임을 좋아하니까 게임 랭킹으로 뺏는 것은 어떨까? 라는 아이디어가 떠올랐다. 그런데 게임이 존재하고, 게임으로 싸운다는 것은 용사가 나오는 레트로 게임에 어울리지 않는 설정이었다. 하지만 배경이 게임개발부이고, 둘은 게임에 대한 열정으로 의기투합하였다는 설정이 있기 때문에 게임이라는 요소를 빼놓을 수는 없었다. 이런 생각을 가지고 게임개발부 스토리나, 게임개발부의 각 캐릭터들의 설정 등을 찾아보던 도중 떠오른 생각이 있었다. "둘의 성장 과정을 보여주면 어떨까?" 라는 생각이었다. 나도 어렸을 적 형과 많이 싸웠었지만, 지금은 사이가 괜찮은 편이며 같이 게임을 하곤 했었고, 또한 게임을 좋아하고 게임을 만들기도 하는 미도리의 모습과 내 모습이 겹쳐보이기도 했다. 또한, 스토리를 보며 "왜지?" 라며 고개를 갸우뚱하게 하는 장면들도 몇 있었다. 그 장면들을 보며 "이래서 이런 것은 아닐까?" 하는 생각이 들었는데, 이런 의문점들을 해소하고 캐릭터들이 가지고 있는 개성을 더 부각시킬 수 있을 것 같다고 생각했다.

 

조금 생략한 부분도 있지만, 결과적으로 짜인 시나리오의 큰 틀은 이렇다.

게임개발부에서 테일즈 사가 크로니클을 플레이하던 선생은 갑작스러운 폭발로 의식을 잃고, 다른 세계에서 깨어나게 된다. 이 세계에서 모모이가 랭킹 1위를 차지한 게임을 미도리가 갱신할 수 있게끔 돕는다. 여정 중간에 아리스, 유즈, 모모이와도 합류하며, 이 과정에서 교훈을 얻으며 자매의 소중함과 게임의 즐거움 등을 깨달으며 성장하는 내용이다.

타이틀은 플레이하던 테일즈 사가 크로니클이 폭발하여 겪게 되는 일들을 주제로 하고 있으니, Tales Saga Chronicle Blast로 정했다. 다른 단어도 가능했지만, blast의 경우 "신나는 경험"이라는 의미로 사용되기도 하는 것 같아 blast로 결정하게 되었다.

스토리 부분은 블루 아카이브에서처럼 진행하고, 중간에 등장하는 게임은 약 3개 정도. 1번째는 갤러그 풍의 슈팅게임, 2번째는 리듬게임, 3번째는 쯔꾸르 풍의 RPG게임을 계획하고 있다.

1, 2번의 경우 리소스만 있으면 어렵지 않게 만들 수 있을 것 같은데 3번의 경우는 조금 어려울 수도 있을 것 같다.

여기까지 생각하고 대략적인 시나리오를 짜는데 어제까지 약 1~2주일 정도 소요되었다.

 

2차 창작 관련에 관한 내용도 알아보았다.

 

https://member.nexon.com/policy/gameipguide.aspx

 

게임IP사용가이드 < 넥슨

 

member.nexon.com

 

최근에는 2차 창작을 공식에서 적극적으로 권하는 추세이다. 2차 창작물을 통해 게임에 유입되거나, 유저들이 해당 IP가 사용된 콘텐츠를 즐기며 게임에 더 애정을 가지기도 하기 때문이라고 생각한다. 영리적인 목적이 아니라면, 넥슨도 마찬가지로 창작자들의 2차 창작을 적극 권장하고 있다. 단, 게임에 관해서는 이렇게 나와있다.

게임IP를 활용하여 게임을 제작하고 배포 및 서비스하는 것은 원칙적으로 허용되지 않습니다.
⑤ 단, 아래 경우는 예외적으로 허용됩니다
2. 게임IP를 활용하여 비영리 목적의 디지털 콘텐츠(게임, 어플리케이션 등) 제작을 희망할 경우 고객센터(http://help.nexon.com) 개별 문의주시길 바랍니다.

그런데 찾아보면 넥슨 게임을 바탕으로 한 팬 게임을 어렵지 않게 찾아볼 수 있다. 예로 던전앤파이터의 팬 게임은 던전앤파이터 공식 커뮤니티에서 관리자가 선정하는 "오늘의 던파"에 올라가기도 했다.

하기야 게임은 제작자가 의도하면 얼마든지 이용자에게 피해를 줄 수도 있으니, 기본적으로 금지를 해놓고 허가를 받아야 하는 방식인 것 같다. 아마 확인해보고 문제가 없으면 허가를 해주는 것 같다.

 

ブルーアーカイブ -Blue Archive-(ブルアカ)

 

ブルーアーカイブ

Yostarが新たに贈る、スマートフォン向けアプリゲーム 学園×青春×物語RPG『ブルーアーカイブ -Blue Archive-』の公式サイトです。

bluearchive.jp

국내에는 없지만, 일본 블루 아카이브 사이트의 약관에 있는 내용은 이렇다.

★二次創作を行う者について★
個人または法人格のない団体は、後述するような当社が定義する「非営利目的」の場合に限り、「ブルーアーカイブ」を題材とした二次創作物(同人誌・同人グッズ・デジタル作品など…)の制作・配布・頒布を自由に行っていただいて問題ありません。
法人格のある企業・団体による二次創作活動を行いたい方、または本ガイドラインの判断基準を超える二次創作活動を行いたい方は、事前に当社にお問合せを頂くようお願いいたします。
★非営利/営利目的とみなす判断基準★
個人または法人格のない団体は、非営利目的かつ日本国内での発表・流通の場合に限り、自由に二次創作物を制作していただいて問題ありません。
また、趣味の範囲で利用し、継続的な創作活動のための、原材料費や光熱費諸経費、ツール類など制作にかかった費用程度の対価・利益を得る場合においても非営利目的の範囲内とします。

(Papago 번역)

★ 2 차 창작을 하는 자에 대하여 ★
개인 또는 법인격이 없는 단체는 후술하는 바와 같은 당사가 정의하는 「비영리 목적」의 경우에 한하여, 「블루 아카이브」를 소재로 한 2차 창작물(동인지·동인 굿즈·디지털 작품 등…)의 제작·배포·반포를 자유롭게 실시해도 문제 없습니다.
법인격이 있는 기업·단체에 의한 2차 창작활동을 하고자 하거나 본 가이드라인의 판단기준을 초과하는 2차 창작활동을 하고자 하는 분은 사전에 당사에 문의하시기 바랍니다.

★비영리/영리목적으로 간주하는 판단기준 ★
개인 또는 법인격이 없는 단체는, 비영리 목적이면서 일본내에서의 발표·유통의 경우에 한해, 자유롭게 2차 창작물을 제작해도 문제 없습니다.
또, 취미의 범위에서 이용해, 계속적인 창작 활동을 위한, 원재료비나 광열비 제경비, 툴류 등 제작에 들어간 비용 정도의 대가·이익을 얻는 경우에 있어서도 비영리 목적의 범위내로 합니다.

일본내에서의 발표, 유통의 경우에 한해 디지털 작품도 가능하다고 되어있다. 즉 블루 아카이브 측에서 2차 창작으로 게임을 만드는 것은 허가하고 있는 것 같다. 다만, 국내 유통의 경우에는 문제가 소지가 될 수 있을 수 있으니 허가를 받는 것이 좋을 것 같다. 아마 다른 게임의 사례나 일본 블루 아카이브 서비스를 봤을 때는 큰 문제가 없으면 허가가 날 것 같다. 혹시라도 안되면 일본어로 수정해서 일본 내 유통을 노려보거나, 이것마저도 문제가 된다면 유튜브에 영상을 업로드하는 건 문제가 되지 않으니 아마 그렇게 하면 될 것 같다. 확실한건 미리 허가를 받는 것이겠지만, 제대로 끝까지 완성할지 어떨지 모르는 상황에서 번거로움을 드릴까 싶어서 그만두기로 했다. 어쨌든 나의 목표는 Unity 엔진의 사용 연습이기도 하고, 허가가 안나면 의욕이 떨어지기도 할테니 말이다.

 

아무튼, 드디어 긴 글의 마침표다. 다음 글부터는 실제로 개발한 내용을 쓸 예정이다. 먼저 어제 했던 내용을 적어야겠다.

https://youtu.be/W-7LocKSXaM

君に何かを伝えたい
키미니 나니카오 츠타에타이
너에게 무언가를 전하고 싶어

でもその何かが言葉にならない
데모 소노 나니카가 코토바니 나라나이
하지만 그 무언가를 말로 표현할 수 없어

なんだそんなもんか?
난다 손나 몬카? 
뭐야, 고작 이정도인가?

僕の想いは 君が大切だとか言ってみても
보쿠노 오모이와 키미가 다이세츠다토카 잇테미테모
내 마음은 네가 소중하다고 말해도

君に何かを伝えたい
키미니 나니카오 츠타에타이
너에게 무언가를 전하고 싶어

でもその何かが言葉にならない
데모 소노 나니카가 코토바니 나라나이
하지만 그 무언가를 어떻게 표현해야 좋을 지 모르겠어

なんだそんなもんか?
난다 손나 몬카?
뭐야, 고작 이 정도인가?

僕の想いは 君が大切だとか言ってみても
보쿠노 오모이와 키미가 다이세츠다토카 잇테미테모
내 마음은 네가 소중하다고 말해도

君に何かを伝えたい
키미니 나니카오 츠타에타이
너에게 무언가를 전하고 싶어

でもその何かが言葉にならない
데모 소노 나니카가 코토바니 나라나이
하지만 그 무언가를 어떻게 표현해야 좋을 지 모르겠어

あれこれ考えて 足りないなって
아레코레 캉가에테 타리나이낫테
이것저것 생각해봐도 부족한 것 같고

嘘っぽいから言えない
우솟포이카라 이에나이
꾸며낸 말 같아서 말할 수 없어

「君のため」というその全てが
키미노타메토이우 소노스베테가
「너를 위해서」라는 모든 것들이

僕のためのような気がして
보쿠노 타메노 요-나 키가시테
나를 위한 것 같은 기분이 들어서

「君の気持ちになろう」っていう
키미노 키모치니 나롯-테이우
「너의 입장이 되어보자」라는

それがまずもう僕の主観で
소레가 마즈모- 보쿠노 슈칸데
그 생각이 이미 내 주관이라서

捻くれているつもりはない だけど
히네쿠레테이루 츠모리와나이 다케도
변명할 생각은 아니야, 그치만

全てに矛盾を感じてしまう
스베테니 무쥰오 칸지테시마우
모든 것에 모순을 느끼게 돼

ああ 君に何を言おうか
아아 키미니 나니오 이오-카
아, 너에게 어떤 말을 하면 좋을까

さんざん考えたって
산잔 캉가에탓테
한껏 생각해봐도

結局君に会ってしまえば
켓쿄쿠 키미니 앗테시마에바
결국 너와 만나게 되면

何かどうでもよくなってしまう
난카 도-데모 요쿠낫테시마우
뭔가 어찌 되든 좋아져버려

僕の思考なんて
보쿠노 시코난테
나의 사고방식은 말야

そんな気持ちを僕は
손나 키모치오 보쿠와
나는 그런 마음을

ずっと言葉にしたいなって
즛토 코토바니 시타이낫테
줄곧 표현하고 싶다고

君に伝えたいなって
키미니 츠타에타이낫테
너에게 전하고 싶다고

ああ 思ってんだ
아아 오못텐다
아, 생각하고 있어

君に何かを歌いたい
키미니 나니카오 우타이타이
너에게 무언가를 노래하고 싶어

でもその何かがよくわからない
데모 소노 나니카가 요쿠와카라나이
하지만 그 무언가가 뭔지 잘 모르겠어

なんだそんなもんか 
난다 손나 몬카
뭐야, 고작 이 정도인가

僕にとって 君の存在なんてそんなもんか
보쿠니 톳테 키미노 손자이난테 손나몬카
내게 있어서 너의 존재란 고작 이 정도인가

君に何かを歌いたい
키미니 나니카오 우타이타이
너에게 무언가를 노래하고 싶어

でもその何かが歌にならない
데모 소노 나니카가 우타니 나라나이
하지만 그 무언가를 노래로 표현할 수 없어

頭ひねって並べた言葉って 嘘っぽくて歌えない
아타마 히넷테 나라베타 코토밧테 우솟폿쿠테 이에나이
머리를 쥐어짜서 늘어놓은 말은 꾸며낸 말 같아서 말할 수 없어

ああ
아아
아아

「愛してる」
아이시테루
「사랑해」

違う そうなんだけど何かが違う
치가우 소-난다케도 나니카가 치가우
아니야, 맞긴 하지만 뭔가 달라

「ありがとう」
아리가토-
「고마워」

違う 思ってるけどそれだけじゃない
치가우 오못테루케도 소레다케쟈나이
아니야, 고맙다고 생각하지만 그것뿐만이 아니야

「ごめん」 違う 「バイバイ」 違う 違う
고멘 치가우 바이바이 치가우 치가우
「미안해」 아니야, 「바이바이」 아니야, 아니야

君に何を言おう
키미니 나니오 이오-
너에게 무슨 말을 하면 좋을까

さんざん考えたって
산잔 캉가에탓테
한껏 생각해봐도

結局君に会ってしまえば
켓쿄쿠 키미니 앗테시마에바
결국 너와 만나게 되면

何かどうでもよくなってしまう
난카 도-데모 요쿠낫테시마우
뭔가 어찌 되든 좋아져버리는

僕の思考
보쿠노 시코
나의 사고방식

だけどさ ねぇ伝えたい 何かさ ねぇ歌いたい
다케도사 네- 츠타에타이 난카사 네- 우타이타이
그치만 말야, 전하고 싶어 뭔가를 말야, 노래하고 싶어

君が僕に こんな気持ちをくれたように
키미가 보쿠니 콘나 키모치오 쿠레타요-니
네가 나에게 이런 마음을 준 것처럼

さんざん考えたって
산잔 캉가에탓테
한껏 생각해봐도

結局こんな歌になるんだ
켓쿄쿠 콘나 우타니 나룬다
결국 이런 노래가 되어버려

答えなんて出ないし
코타에 난테 데나이시
답은 나오지 않고

感動的なメッセージもないし
칸도-테키나 멧세지모 나이시
감동적인 메세지도 없지만

でもきっと伝わりきらないから
데모 킷토 츠타와리키라나이카라
하지만 분명 전해지지 않았을 테니까

僕は歌を歌い続けるんだ
보쿠와 우타오 우타이 츠즈케룬다
나는 계속 노래할 거야

いつの日か全部 全部 君に届くその日まで
이츠노히카 젠부 젠부 키미니 토도쿠 소노히마데
언젠가 전부, 전부 너에게 전해질 그 날까지

 

==========================================

 

노래도 좋지만, 가사가 상당히 마음에 드는 노래입니다. 뭔가 말로 못다 할 감정을 느끼는 경우가 종종 있는데요, 그럴 때는 어떤 말도 모자란 것처럼 느껴져 답답함을 느끼기도 합니다. 말로 전달하는 것에는 한계가 있다보니 결국 진심이라는 건 평소 꾸준히 말이나 행동 등을 통해 전할 수밖에 없죠. 이런 감정을 잘 담아낸 노래가 아닌가 싶습니다.

 

추가로, 이 노래는 구글에 검색해보니 가사가 이미 1건 번역되어 있던데 P마루사마 말고 다른 노래를 번역해보고 싶어서 번역해보았습니다. 확실히 가사를 번역하면서 여러 번 곱씹게 되니 머리 속에 훨씬 잘 들어오는 느낌이네요. 덕분에 노래를 더 깊게 음미할 수 있어서 좋은 것 같습니다.

CS 면접 관련 질문들을 공부하면서 스마트 포인터에 대해 찾아보게 되었다. 이와 관련해서 안에 쓰여져 있는 내용들 중 잘 모르는 것이나 궁금한 것들을 찾아 꼬리에 꼬리를 물다보니 꽤나 오랜 시간 동안 찾아보게 되었다. 그 과정에서 알게 된 내용이나 생각한 내용을 정리해보고자 한다.

 

출처 : 코딩의 시작, TCP School

메모리 관리에 대해서 가장 먼저 알아야 할 내용은 메모리 구조이다.

메모리 구조는 위에 보이는 것처럼 되어있는데 이 중 프로그래머가 신경써야 할 부분은 힙 영역이다.

나머지 영역은 프로그램이 알아서 관리를 하지만, 힙 영역은 프로그래머가 동적으로 메모리를 할당할 수 있는 부분이기에 실수가 발생할 수 있기 때문이다.

 

예를 들면 이런 것이다. 게임을 하면서 던전에 들어갈 때 동적인 메모리를 할당받아 10MB만큼 사용했다고 치자. 그런데 던전이 끝날 때 할당받은 메모리를 반납하지 않으면 어떻게 될까? 이 메모리 공간이 다시 사용될 일이 없다고 할지라도 프로그램을 이를 사용 중인 공간으로 인식한다. 이것이 메모리 누수이다. 램 누수라고도 한다.

새로운 메모리를 할당받고 반납하지 않는 일을 반복하게 되면, 사용하지도 않으면서 공간을 차지하는, 소위 쓰레기 메모리들이 늘어나게 된다. 그러면서 프로그램은 점차 느려지게 된다.

힙 영역에 쓰레기 메모리들이 쌓이면서 힙 영역이 부족해지면 프로그램은 힙 영역을 확장한다. 이를 반복하다보면 메모리에 한계가 오게 되고, 결국 더 이상 확장할 수 없게 되면 프로그램을 강제 종료한다. 우리가 램누수 게임이라고 부르는 게임들이 자주 튕기는 이유이다.

 

다행스럽게도, 유니티에서 사용하는 언어인 C#에서는 가비지 컬렉션이라는 기능을 제공한다. 접근할 수 없는 객체들을 주기적으로 정리하여 메모리 누수를 방지해준다. 단, 가비지 컬렉션은 코스트가 높은 작업이기 때문에 자주 실행되면 프로그램의 성능이 저하될 수 있으므로 쓰레기는 최대한 적게 만드는 것이 좋다.

 

C와 C++의 경우는 가비지 컬렉션 기능이 없다. 아마 포인터를 사용하기 때문인 것 같다. 가비지 컬렉션을 수행하면서 메모리의 주소를 자주 바꾸기 때문에, 포인터를 사용하는 C나 C++과는 상성이 좋지 않은 것 같다. 실제로 C#에서는 포인터를 사용할 수 있지만 사용하려면 안전하지 않다는 의미의 unsafe를 동반하는 코드를 작성해야 하며, 변수의 주소를 고정하는 fixed 기능을 제공하거나, 일반적인 포인터 사용을 대체하는 ref, out, in을 제공하는 것을 봐서는 어느정도 맞는 추측일 것 같다.

 

때문에 C의 경우, malloc() 혹은 calloc()으로 할당받은 메모리를 free()로 해제해주어야 하고, C++의 경우 new로 할당받은 메모리를 delete()로 해제해주어야 한다. 다만 C++은 다행히도 가비지 컬렉터처럼 메모리 누수를 방지해주는 스마트 포인터라는 개념이 도입된 모양이다. 가비지 컬렉터와 비교하면 사용은 조금 불편한 것 같지만 효율은 좋은 것 같다.

 

추가로, 언리얼은 C++ 기반인데, 그러면 가비지 컬렉터가 없나? 싶어 찾아보니 오브젝트의 베이직 클래스인 UObject에는 가비지 컬렉터를 사용하고, 코드 내에서는 스마트 포인터도 사용한다는 것 같다.

 

왜 이런 메모리 누수가 발생하는 것일까? 예전에는 개발 능력이 부족해서 그런걸까? 싶었지만, 지금은 생각이 바뀌었다. 아마 빠듯한 개발 일정 때문일 것이다. 이것저것 바쁘게 기능을 구현하다보면 코드를 되돌아볼 시간 따위는 없다. 구현하고 나서 "이렇게 하면 더 좋을 것 같은데" 싶은 생각이 들어도 남은 일을 쳐내기 바쁘다. 다 그런 것은 아니겠지만 나는 그랬다.

회사 입장에서도 하루라도 빨리 개발 일정을 앞당겨서 빠르게 자금을 회수하길 바랄 것이다. 특히 게임 업계는 망하면 손해가 이만저만이 아닌데, 고작 성능 개선을 위해 붙잡고 끙끙 싸매기보다는 빠르게 개발해주길 바라지 않을까? 그렇게 생각하면 램누수로 인한 팅김이 잦은 게임을 하며 짜증보다는 안타까운 마음이 앞선다. 그들은 아마 주어진 시간 내에서 최선을 다했을 것이다. 그래도 게임이 궤도에 오르면 보통 최적화 패치를 해주니 다행이다. 지금 생각해보면 어쩔 수 없는 수순인 것 같기도 하다.

https://youtu.be/fgZ4lIRKrjA

 

くるりんぱっぱっぱ

쿠루링 팟팟파

빙글빙글 착착착


ツノ団子プンプンプン

츠노당고 품품품

뿔머리 뿜뿜뿜


ポニテ・ウィンク

포니테・윙크

포니테일 윙크


どんな私がお好み?

돈나 와타시가 오코노미?

어떤 내가 취향이야?

政略結婚

세-랴쿠 켓콘

정략결혼을


回避したい私

카이히시타이 와타시

피하고 싶은 나


メイクを決めて

메이쿠오 키메테

화장을 마치고


アイツを落とさなきゃなの

아이츠오 오토사나캬나노

그 녀석을 꼬셔야만 해

オシャレ偏差値

오샤레 헨사치

꾸미기 등급


42な私

욘쥬-니나 와타시

7등급인 나


髪型決めて

카미카타 키메테

헤어스타일링을 마치고


アイツを落とさなきゃなの

아이츠오 오토사나캬나노

그 녀석을 꼬셔야만해

お金じゃ変えない幸せを

오카네쟈 카에나이 시아와세오

돈으로는 바꿀 수 없는 행복을


手に入れるために磨きます

테니 이레루 타메니 미가키마스

손에 넣기 위해 꾸밀 거예요


叶わぬ恋じゃ終われないです

카나와누 코이쟈 오와레나이데스

이룰 수 없는 사랑으로 끝낼 순 없어요


恋愛偏差値上昇中!

렌아이 헨사치 죠-쇼-츄-!

연애 등급 상승 중!


ハイブランドでも

하이부란도데모

명품 브랜드든


プチプラでもなんでもいいから

푸치푸라데모 난데모 이이카라

가성비 브랜드든 뭐든 좋으니까


教えて神様

오시에테 카미사마

알려줘, 하느님


私に合うアイテム

와타시니 아우 아이테무

나에게 어울리는 아이템을


可愛くなったら

카와이쿠 낫타라

귀여워지면


隣を歩きたい

토나리오 아루키타이

옆에서 걷고 싶어


妄想少女は

모-소-쇼-죠와

망상 소녀는


お風呂上がりのアイスに蓋をして

오후로 아가리노 아이스니 후타오시테

목욕 후에 먹으려던 아이스크림의 뚜껑을 덮고


鈍感アイツを射止める

돈칸아이츠오 이토메루

둔감한 그 녀석을 사로잡아

敷かれたレール

시카레타 레-루

정해진 레일 위를


歩いてきた私

아루이테키타 와타시

걸어온 나


好きな人くらい

스키나 히토쿠라이

좋아하는 사람 정도는


自分で決めていいでしょ

지분데 키메테 이이데쇼

내가 정해도 괜찮잖아

最新ファッション

사이신 홧숀

최신 패션


インスタでリサーチ

인스타데 리사-치

인스타에서 검색


韓国コスメ

칸코쿠 코스메

한국 화장품을


大人買いで勝負でしょ

오토나가이데 쇼-부데쇼

잔뜩 질러서 승부하는 거야

初めて好きになった人

하지메테 스키니 낫타 히토

처음으로 좋아하게 된 사람을


振り向かせるために磨きます

후리무카세루 타메니 미가키마스

돌아보게 하기 위해 꾸밀 거예요


叶わぬ恋じゃ終われないです

카나와누 코이쟈 오와레나이데스

이룰 수 없는 사랑으로 끝낼 순 없어요


恋愛偏差値上昇中!

렌아이 헨사치 죠-쇼-츄-!

연애 등급 상승 중!

おしゃれなカフェとか

오샤라나 카훼토카

화려한 카페라든가


映画館とか水族館とか

에이가칸토카 스이조쿠칸토카

영화관이라든가 수족관이라든가


叶えて神様

카나에테 카미사마

이루어줘, 하느님


アイツと行きたいです

아이츠토 이키타이데스

그 녀석과 가고 싶어요


可愛くなったら

카와이쿠 낫타라

귀여워지면


誘ってもいいかな

사솟테모 이이카나

권해봐도 괜찮을까


妄想少女は

모-소-쇼-죠와

망상 소녀는


今日も食後のスイーツ我慢して

쿄-모 쇼쿠고노 스이-츠 가만시테

오늘도 식후의 디저트를 참고


鈍感アイツを射止める

돈칸 아이츠오 이토메루

둔감한 그 녀석을 사로잡아

気づかないフリをして

키즈카나이 후리오시테

눈치채지 못 한 척을 해서


私を困らせてる?

와타시오 코마라세테루?

나를 당황하게 하는 건가?


一日中考えちゃって

이치니치츄- 캉가에챳테

하루종일 생각해버려서


頭がパンクしそう

아타마가 팡쿠시소-

머리가 터질 것만 같아


好きなの私だけなのかな

스키나노 와타시다케 나노카나

좋아하는 건 나 뿐인 걸까

恋も仕事も

코이모 시고토모

사랑도 일도


全力です!

젠료쿠데스!

전력으로 하는 거예요!


ちゃんと伝えなくちゃ

챤토 츠타에나쿠챠

제대로 전해야만 해


君が好き

키미가 스키

네가 좋아

ハイブランドでも

하이부란도데모

명품 브랜드든


プチプラでもなんでもいいから

푸치푸라데모 난데모 이이카라

가성비 브랜드든 뭐든 좋으니까


教えて神様

오시에테 카미사마

알려줘, 하느님


私に合うアイテム

와타시니 아우 아이테무

나에게 어울리는 아이템을


可愛くなったら

카와이쿠 낫타라

귀여워지면


隣を歩きたい

토나리오 아루키타이

옆에서 걷고 싶어


妄想少女は

모-소-쇼-죠와

망상 소녀는


お風呂上がりのアイスに蓋をして

오후로 아가리노 아이스니 후타오시테

목욕 후에 먹으려던 아이스크림의 뚜껑을 덮고


鈍感アイツを射止める

돈칸 아이츠오 이토메루

둔감한 그 녀석을 사로잡아

 

==============================================

 

공교롭게도 이번에도 P마루사마의 곡을 번역하게 되었네요.

사실 어지간한 노래들은 구글에 검색하면 다른 분들이 번역을 이미 해 놓으신 상태라, 검색해도 나오지 않는 노래들을 위주로 번역하게 되다보니 어쩔 수 없는 것 같습니다.

 

일본에서는 편차치라는 단위를 많이 쓰지만, 우리나라에서는 N등급 이런 식으로 표현을 많이 하기 때문에 제목도 편차치가 아니라 등급, 가사 내용도 편차치 42에 해당하는 7등급이라고 표현해봤습니다.

이러다보니 다른 가사들도 조금씩 원문 그대로의 느낌보다는 우리나라에서 자주 쓰이는 단어로 의역한 부분들이 많네요.

그래서 그런지 개인적인 생각으로는 이전에 번역한 가사보다 훨씬 깔끔한 느낌입니다.

나중에 마음이 내키면 이전에 쓴 가사도 수정해봐야겠습니다.

'번역' 카테고리의 다른 글

キリカ(希織歌) / HIMEHINA 가사  (1) 2023.10.22
your song · SUPER BEAVER 가사  (0) 2023.01.03
スーパーレア/P丸様。(슈퍼 레어) 가사  (2) 2022.12.19

오늘은 이전에 유명세를 탔던 AI그림에 관한 글을 써보려고 합니다.

 

이전부터 AI그림 기술은 발전해오고 있었겠지만, 약 2~3달 전 쯤에 AI가 그린 그림이 미술대회에서 콜로라도 주립 박람회 미술대회에서 우승한 사건을 계기로 유명세를 타게 되었었죠.

 

 

당시 우승했던 그림은 이러한데요, 이외에도 서브컬처, 소위 오타쿠라고 부르는 미소녀 그림들도 많이 올라오면서 AI그림에 대한 관심이 커졌었습니다. 그림을 그릴 줄 모르는 사람들도 텍스트만 넣으면 얼마든지 고퀄 그림을 뽑을 수 있다! 라는 느낌이었었죠.

 

그림을 잘 그리고 싶어서 한때 연습까지 했지만 전혀 잘 그리지 못하는 저로써는 도전해볼 수밖에 없었습니다.

그래서 당시 여기저기 검색해보며 간단하게 할 수 있는 인터넷 사이트에서 그림을 그렸습니다. 이때가 10월 11일이네요.

 

 

흰색 머리의 강아지 귀를 가진 캐릭터를 그려보고 싶어서 anime, girl, dog ear, white hair 라는 태그를 넣었는데요, 이 태그들(프롬프트)을 기반으로 AI가 그려준 첫 번째 그림입니다.

 

당시에는 우와! 하고 놀랐습니다. 제가 그린 것은 아니지만, 몇 초만에 제가 원하는 그림이 이렇게 쉽지 나올 줄은 몰랐으니까요.

 

 

그 다음에도 몇 번 돌려보았는데 원하는 그림이 잘 안나왔습니다. dog ears 태그 때문인지 사람이 아닌 강아지 그림이 계속 나오기도 하고, 귀의 위치가 이상한 경우가 많아서 dog ears 태그를 떼고, 헤어스타일을 정해주는 태그인 two side up 태그를 넣어서 two side up, anime, 1 girl, white_hair 라는 태그로 그림을 그린 결과입니다.

 

퀄리티가 높은 그림이 나와서 이때도 탄성이 절로 나왔습니다. 사실 이상한 그림들이 나오는 경우가 많고 제대로 된 그림이 나오지 않는 경우가 많았거든요. 하지만 이 역시 자세히 보니 눈의 색깔과 크기가 서로 약간 다른 모습이었습니다. 

 

 

역시 강아지 귀가 달린 캐릭터를 그려주길 바라서 다시 dog ears를 추가하고, off shoulder 태그와 full body 태그를 추가해서 그려보았는데요, 전부 나쁘진 않지만 눈이 늘 이상하게 그려졌고, 배경이 너무 단순하게 느껴지기도 했습니다. 눈이야 제가 수정할 수 있는 부분이 아니다보니 배경만이라도 없애기 위해 이후에는 white background 라는 태그를 추가해서 그려보았습니다. 머리색도 brown hair로 바꾸어 그려보았고요.

 

 

 

배경을 없애니 신경쓸 부분이 적어져서 그런지 그림의 완성도가 비약적으로 올라갔습니다. 눈도 대칭으로 그려주는 경우가 많아졌고요. 다만 손은 그림에 아예 안나오거나 나왔다하면 걸핏 외계인같은 손이 되기 십상이었습니다. 아마 제 기억에 이 그림들을 생성하기 위해서 설정을 조절하며 100번 이상 그림을 돌렸던 것 같습니다. 나름 만족스러운 결과였지만, 뭔가 전반적인 느낌이 사람과 그린 것과는 차이가 있다는 느낌이 들었습니다.

다른 사람들이 생성한 AI그림들도 비슷한 느낌이었습니다. AI그림은 결국 AI가 그린 티가 날 수 밖에 없나보다, 하고 AI그림에 대한 흥미를 접게 되었던 것 같습니다.

 

얼마 전까지도 AI그림들을 볼 때마다 역시 AI그림들은 늘 비슷해.. 이 생각을 하고 있었는데, 약 1주일 전, 어떤 그림을 보고 잘 그렸다고 생각하던 찰나, 그 그림이 AI가 그린 그림이라는 사실을 알게 되었습니다.

 

 

그 그림이 이 그림인데요, 당시에는 아무래도 캐릭터에 눈이 많이 갔는데, 지금 보니 비행기 좌석이나 바깥 풍경이 일그러져 있네요. 아무튼, 이 그림을 본 이후로 AI그림에 대해서 다시 찾아보게 되었습니다. 그랬더니 이게 정말 AI가 그린 그림이야? 라고 생각할 정도로 수준 높은 그림들을 아주 많이 찾을 수 있었습니다.

 

Lunia님의 그림
Lunia님의 그림
Kernika님의 그림
슬라크님의 그림

이 그림들은 후술할 Prompt Search 사이트의 Weekly Best Articles에서 가져온 그림들인데요, 눈이야 말할 것도 없고, 손의 묘사도 상당히 수준이 올라왔으며, 배경에 있는 주변 사물들의 퀄리티도 많이 올라간 모습입니다.

이렇게까지 AI그림의 수준이 올라왔다는 것에 감탄을 금치 못할 수 없는데요, AI그림 연구를 계속해서 하시고 이런 연구의 결정체라고 할 수 있는 프롬프트를 공유해주시는 것이 감사할 따름입니다.

 

이런 그림들을 보며 "나도 할 수 있지 않을까?" 하는 생각으로 다시 AI그림에 도전을 하게 되었는데요, 인터넷에 검색을 해서 WebUI를 컴퓨터에 설치해서 사용해봤습니다.

 

 

기본적으로 포함되어있는 masterpiece, best quality 외에 shef_hat, shef_uniform, bakery 같은 태그를 넣어서 그린 그림인데요, 퀄리티 자체는 나쁘지 않지만 그림체가 딱 AI그림이라는 느낌이 강하게 들었습니다.

 

그래서 이래저래 찾아보니 당연한 얘기지만 그림을 생성할 때 넣는 태그가 굉장히 중요하다고 해서 여러 태그들을 넣어가며 그림을 생성해보았지만, 제가 원하던 만큼 크게 바뀌지는 않았습니다.

 

그러던 도중 Prompt Search라는 사이트에 대해 알게 되었습니다.

 

Prompt Search

 

Prompt Search

favorite 11 article 2

www.ptsearch.info

 

 

바로 이 사이트인데요, 사람들이 AI를 이용해 그린 그림과, 그 그림을 그릴 때 사용한 프롬프트를 공유하는 사이트입니다.

 

 

들어가면 이런식으로 그림들이 있는데요, Weekly Best에서 기간별 인기가 많았던 그림들을 확인할 수 있습니다.

 

 

마음에 드는 그림을 클릭하면, 그림의 제작자와 그림을 그릴 때 사용했던 프롬프트, 옵션 등을 확인할 수 있습니다.

 

 

Generate 버튼을 클릭하면, 성능이 다소 제약된 상태이지만 WebUI를 이용하여 웹사이트에서 편리하게 그림을 생성할 수 있습니다.

 

저도 이 사이트에서 찾은, 다른 분들이 사용하신 프롬프트를 활용하여 제가 원하는 태그를 넣고 그림을 생성해보았습니다.

 

 

대단하지 않은가요? 제가 아직 태그 사용이 미숙하다보니 몇몇 그림에서 손이나 디테일적인 부분이 떨어지긴 하지만, 굉장히 뛰어난 그림들이라고 생각합니다. 이전에 저의 사용이 미숙했던 것도 사실이지만, 다른 분들이 투고하신 그림들을 보아도 2달 전과 비교하면 비약적으로 수준이 높아졌습니다.

 

아마 연구가 계속 이루어지면서 앞으로도 AI그림 기술은 계속적으로 발전할 것으로 보입니다. AI그림에 관한 문제점이 제기되기도 하는 등 사람들의 구설수에 오르긴 하였지만 잘 활용한다면 사람들에게 크게 도움을 줄 수 있는 기술이라고 생각합니다. 이전에 친구들과 게임을 개발할 때 이런 그림과 같은 리소스들을 구하는 것이 대단히 큰 문제였는데요, 창작물을 만드시는 분들 모두가 그림을 잘 그리는 것은 아니기 때문에 AI그림을 적극 활용한다면 이런 부분에 대한 부담이 상당 부분 줄어들 것으로 보입니다. 저도 그림을 잘 못그리는 편이기 때문에 앞으로 AI그림을 적극 활용하게 될 것 같습니다.

 

 

 

이건 여담인데요, 아직까진 AI그림이 취미수준에 머물러 있지만 만약 AI그림 시장이 확대되고 이걸 업으로 삼는 사람들이 생긴다면 발전 속도가 과연 얼마나 늘어날까요? 아직까진 저작권과 같은 여러 문제들이 제기되고 있는 상황이지만, 과연 이런 것들이 해결되고 AI그림이 주류에 오를 수 있을까요? 혹은 앞으로도 계속 취미 수준에서 머무르게 될까요?

 

앞일은 모르는 것이지만, 저는 AI그림이 주류에 오를 것이라고 봅니다. 아직까진 아쉬운 부분들이 있는 AI그림이지만, 많은 분들이 AI를 활용해 그림을 생성하고 리터칭을 하는 식으로도 활용하고 계십니다. 제가 생성해낸 그림들은 기껏해봐야 10~30초 정도의 시간이 걸렸는데요, 만약 아티스트분들이 이런 그림을 그리려면 얼마의 시간이 필요할까요? 잘은 모르지만 구도를 잡고, 밑그림을 그리고, 선을 따고, 디테일을 더하고, 채색을 하고 이런 작업들을 거치는데 최소 며칠은 걸리지 않을까 싶습니다. 도중에 해당 그림이 요구사항에 맞는지 컨펌을 받고 수정해야 할 수도 있을테니 시간이 더 걸릴 수도 있겠죠. 하지만 그래픽카드의 성능이 더욱 발전하여 성능 좋은 컴퓨터로 이런 이미지를 초단위로 몇 장씩 뽑아내서 수십, 수백 장의 그림을 놓고 어떤 그림을 사용할 지 의사 결정을 하고, 고른 그림을 토대로 리터칭을 하거나, 처음부터 작업을 하게 된다면 어떨까요. 작업에 소요되는 시간이 상당량 줄어들 것으로 보입니다. 만약 이렇게 된다면 원하는 구도나 키워드를 듣고 원하는 그림을 생성해낼 수 있는, AI그림에 대한 지식이 해박한 전문가를 고용하게 될 수도 있을 것이고, AI그림을 적극적으로 활용할 수 있는 아티스트의 시장 가치가 상당히 높아질 것 같습니다.

 

이렇게 아트쪽을 담당하시는 분들의 작업 속도가 비약적으로 상승하게 되면 사실 개발쪽이 아트쪽의 속도를 못 따라가게 될 수도 있을 것 같습니다. 이전에 AI코딩 기술도 한 번 이슈가 된 적이 있었죠. 이 기술도 AI그림과 마찬가지로 프로그래머가 AI에게 코딩을 시키고, 그 코딩을 수정하는 식으로 프로그래밍을 하는 식으로 도움이 될 수 있지 않을까요? 다만 이 경우는 성능이나 최적화 관련 문제도 있을 것으로 생각됩니다. AI코딩의 수준은 어디까지 발전했는지 궁금해지네요. 한 번 찾아봐야겠습니다.

 

사실 지금도 게임들이 상당히 많이 나와서 어떤 게임을 하면 좋을지 고민하게 되는 경우가 많습니다. 역대급으로 평가받는 게임들 중에서도 아직 플레이해보지 못한 게임들도 상당히 많고요. 만약 위에서 얘기한대로 업무 속도가 빨라지고 게임이 나오는 속도가 빨라진다면 여태까지보다 훨씬 많은 게임들이 시장에 등장할텐데, 이런 수많은 게임들 사이에서 경쟁력을 갖추기 위해서는 어떤 것이 필요할지도 벌써부터 걱정되는 부분입니다.

비단 게임뿐만 아니라 소설, 작곡 등에도 이미 AI가 등장한 것으로 알고 있는데요, 어쩌면 넘쳐나는 퀄리티 좋은 작품 속에서 "100% 인간 작업" 을 내세운, 인간 특유의 부족함이 녹아있는 B급 감성의 작품들이 유행하는 세상이 올지도 모르겠습니다. 이것조차도 AI가 카피하려나요? 큭큭. 예상하기가 참 어렵습니다.

 

잡설이 너무 길었네요. 글을 쓰다보면, 생각을 하다보면 이렇게 늘 꼬리에 꼬리를 무는 질문들이 계속 생각나게 되네요. 이런 생각들을 적는 곳이 또 블로그이기도 하니까 괜찮겠지요. 아무튼, 현재로썬 알 수 없는 일이고 정답은 없지만, 앞으로 각종 분야의 AI기술들이 발전하면서 어떻게 활용될지 기대가 됩니다.

'잡담' 카테고리의 다른 글

남을 돕는 일과 행복  (0) 2023.04.05
근황과 2023년 목표  (0) 2023.03.10
친구가 MBTI검사를 해 준 경험  (0) 2023.01.26
JLPT N1 합격 후기  (6) 2023.01.24
블로그 시작합니다.  (1) 2022.12.19

많은 개발자분들이 블로그를 시작하면 좋다고 하시는 이유를 알 것 같습니다.

어제 막 시작한 참이지만 개발탭을 만들어놓고 글이 하나도 없으니 뭐라도 써야될 것 같은 기분이 드네요.

게임을 할 때도 이런 일이 있지요. 소위 길드나 서클과 같은 곳에 가입하게 되면, 누가 시킨 것도 아닌데 다른 사람들의 시선이 신경쓰여서라도 더 열심히 해야만 할 것 같은 기분이 들잖아요? 친구랑 같은 게임을 하게 되었을 때도 그렇고요.

덕분에 아침부터 공부를 할 수 있게 되어 다행입니다. 공부는 시작해서 집중하다보면 재밌지만, 시작하기가 어려운 일이니까요. 앞으로 열심히 블로그를 써야겠습니다.

 

개발탭에는, 아직 부족한 부분이 많아 다른 분들처럼 수준 높은 정보글같은 것은 쓰기 어려울테니 코드를 구현하면서 스스로 고민한 부분이나, 이에 관한 생각 등을 적게될 것 같습니다.

 

코딩테스트 연습 - 괄호 회전하기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

이번에 적을 글은, 프로그래머스 Lv.2 괄호 회전하기를 풀면서 들었던 생각에 관한 탐구입니다. 문제는 다음과 같습니다.

 

괄호를 왼쪽으로 회전하면서 올바른 괄호 문자열이 되게 하는 x의 개수를 구하는 문제입니다.

올바른 괄호인지 확인하는 방법은 vector를 stack처럼 사용해서 구현했는데, 왼쪽으로 괄호를 회전하는 방법이 고민되는 부분이었습니다.

 

s += s[0];
s.erase(s.begin());

처음에는 단순히 첫 번째 글자를 마지막에 추가하고, 첫 번째 원소를 삭제하는 방식을 활용했습니다.

 

그런데, 첫 번째 원소를 삭제하면 뒤에 있는 모든 원소를 앞으로 한 칸씩 땡겨와야 하기 때문에, s의 길이가 만약 1000이라면 999개의 원소를 이동하는 작업을 999번이나 반복해야할테니, 약간 비효율적이라고 느꼈습니다.

그래서 어떻게하면 더 효율적으로 구현할 수 있을까? 생각을 해봤는데, 어차피 원형으로 순회하는 것이기 때문에 배열을 변환하는 것이 아니라 for문을 활용하여 특정 지점부터 끝까지 순회를 하고, 처음부터 특정 지점까지 순회를 하는 방식으로 구현을 해보았습니다.

그림판을 활용해서 그려봤습니다.

그림으로 표현하면 이렇게 되겠네요.

실제로 이렇게 바꿔서 제출을 해보니, 소요시간이 미미하지만 단축된 것을 확인할 수 있었습니다.

하지만 누를 때마다 결과가 들쭉날쭉이어서 실제로 어느정도의 차이가 있는지 궁금하여 Dev-C++을 활용하여 확인해봤습니다.

 

 

1번(erase를 활용한 방법)

#include <string>
#include <vector>
#include <iostream>
#include <chrono>

using namespace std;
using namespace chrono;

// 괄호가 옳게 되어있는지 체크 
bool checkBracket(string s) {
    vector<char> bracket; // STACK으로 사용 
    
    for(int i=0; i<s.size(); i++) {
        if(s[i] == '(' || s[i] == '{' || s[i] == '[') bracket.push_back(s[i]); // 괄호가 열리면 push
        else if(bracket.size() == 0) return false; // 괄호가 닫히는 경우 pop을 해야하므로, pop할 원소가 없으면 return 
        else if(s[i] == ')') { // 괄호가 닫히면 pop
            if(bracket.back() == '(') bracket.pop_back();
            else return false;
        }
        else if(s[i] == '}') {
            if(bracket.back() == '{') bracket.pop_back();
            else return false;
        }
        else if(s[i] == ']') {
            if(bracket.back() == '[') bracket.pop_back();
            else return false;
        }
    }
//     for(int i=0; i<rotate; i++) {
//         if(s[i] == '(' || s[i] == '{' || s[i] == '[') bracket.push_back(s[i]); // 괄호가 열리면 push
//         else if(bracket.size() == 0) return false; // 괄호가 닫히는 경우 pop을 해야하므로, pop할 원소가 없으면 return 
//         else if(s[i] == ')') {  // 괄호가 닫히면 pop
//             if(bracket.back() == '(') bracket.pop_back();
//             else return false;
//         }
//         else if(s[i] == '}') {
//             if(bracket.back() == '{') bracket.pop_back();
//             else return false;
//         }
//         else if(s[i] == ']') {
//             if(bracket.back() == '[') bracket.pop_back();
//             else return false;
//         }
//     }
    if(bracket.size() == 0) return true;
    else return false;
}

int solution(string s) {
    int answer = 0;
    
    system_clock::time_point startTime = system_clock::now(); // 시작 시간 
    
    int repeat = 100000;
    
    for(int i=0; i<repeat; i++) {
		for(int i=0; i<s.size(); i++) {
        if(checkBracket(s)) answer++;
        
        s += s[0];
        s.erase(s.begin());

    	}
	}
	
	system_clock::time_point endTime = system_clock::now(); // 종료 시간 
    
	nanoseconds spend = endTime - startTime; // 소요 시간 
	nanoseconds averSpend = spend / repeat; // 평균 소요 시간 
	    
	cout << averSpend.count() << endl;
    
    return answer;
}

int main() {
	string s ="";
	for(int i=0; i<2000; i++) s+='}';
	solution(s);
	return 0;
}

2번(for문을 활용한 방법)

#include <string>
#include <vector>
#include <iostream>
#include <chrono>

using namespace std;
using namespace chrono;

// 괄호가 옳게 되어있는지 체크 
bool checkBracket(string s, int rotate) {
    vector<char> bracket; // STACK으로 사용 
    
    for(int i=0; i<s.size(); i++) {
        if(s[i] == '(' || s[i] == '{' || s[i] == '[') bracket.push_back(s[i]); // 괄호가 열리면 push
        else if(bracket.size() == 0) return false; // 괄호가 닫히는 경우 pop을 해야하므로, pop할 원소가 없으면 return 
        else if(s[i] == ')') { // 괄호가 닫히면 pop
            if(bracket.back() == '(') bracket.pop_back();
            else return false;
        }
        else if(s[i] == '}') {
            if(bracket.back() == '{') bracket.pop_back();
            else return false;
        }
        else if(s[i] == ']') {
            if(bracket.back() == '[') bracket.pop_back();
            else return false;
        }
    }
     for(int i=0; i<rotate; i++) {
         if(s[i] == '(' || s[i] == '{' || s[i] == '[') bracket.push_back(s[i]); // 괄호가 열리면 push
         else if(bracket.size() == 0) return false; // 괄호가 닫히는 경우 pop을 해야하므로, pop할 원소가 없으면 return 
         else if(s[i] == ')') {  // 괄호가 닫히면 pop
             if(bracket.back() == '(') bracket.pop_back();
             else return false;
         }
         else if(s[i] == '}') {
             if(bracket.back() == '{') bracket.pop_back();
             else return false;
         }
         else if(s[i] == ']') {
             if(bracket.back() == '[') bracket.pop_back();
             else return false;
         }
     }
    if(bracket.size() == 0) return true;
    else return false;
}

int solution(string s) {
    int answer = 0;
    
    system_clock::time_point startTime = system_clock::now(); // 시작 시간 
    
    int repeat = 100000;
    
    for(int i=0; i<repeat; i++) {
        for(int i=0; i<s.size(); i++) {
        if(checkBracket(s, i)) answer++;

//        s += s[0];		
//        s.erase(s.begin());

        }
	}
	
	system_clock::time_point endTime = system_clock::now(); // 종료 시간 
    
	nanoseconds spend = endTime - startTime; // 소요 시간 
	nanoseconds averSpend = spend / repeat; // 평균 소요 시간 
	    
	cout << averSpend.count() << endl;
    
    return answer;
}

int main() {
	string s ="";
	for(int i=0; i<2000; i++) s+='}';
	solution(s);
	return 0;
}

s의 길이는 2000이라고 가정하여 닫히는 괄호( } )를 넣어 10만 회 반복하여 1회당 평균 소요 시간을 5번씩 구해본 결과는 다음과 같았습니다.

 

erase 활용(단위 : ms)

210984

211956

211002

219648

210093

 

for문 활용(단위 : ms)

164263

164159

163900

163354

163827

 

총 5회 시행 결과 최소 21.8%, 최대 25.6% 까지 소요 시간이 감소했습니다.

 

열리는 괄호( { )를 넣었을 때는 시간 소요가 500배가량 커서 1000번만 반복하도록 했습니다.

 

erase 활용(단위 : ms)

99133066

100115358

100007476

99407056

100030480

 

for문 활용(단위 : ms)

93395129

94328784

93144627

94805494

95105520

 

총 5회 시행 결과 최소 4.1%, 최대 6.7% 까지 소요 시간이 감소했습니다.

 

닫히는 괄호의 경우, 반복문을 도는 시간보다 한 시행 내에서 소요되는 시간의 비중이 커서 소요 시간 감소의 폭이 적은 것으로 보입니다. 반대로, 열리는 괄호의 경우는 반복문을 도는 시간의 비중이 상대적으로 커져서 방법의 변화가 큰 영향을 준 것 같네요.

열리는 괄호와 닫히는 괄호의 짝이 맞는다면, 단순히 계산했을 때 평균적으로 14.55%정도 소요 시간을 감소시킬 수 있을 것으로 보입니다.

 

둘 다 테스트에서 충분히 통과하는 코드이고, 얼핏 보기에는 큰 차이 없어보이지만 직접 얼마나 차이가 나는지 확인해보니 아주 큰 차이인 것 같습니다. 모든 부분에서 이만큼의 효율을 증가시킬 수는 없겠지만 만약 가능하다면 꼬박 하루의 시간이 걸리는 계산을 한다고 가정하면 3.6시간 가량을 단축시킬 수 있고, 게임의 경우 시스템 권장 사항 등이 15%정도 낮아지고 그만큼 로딩시간이 감소하거나 프레임이 향상되고 게임을 쾌적하게 즐길 수 있을테니까요.

 

참 별 것 아닌 것처럼도 보이지만, 이런 것들이 모여 큰 차이를 만들어낼 테니 늘 고민하는 자세가 필요할 것 같습니다.

https://youtu.be/Y7jTBqK7ok4

お馴染みのタイトル画面に
오나지미노 타이토루 가멘니
친숙한 타이틀 화면에

おはようを言って出かけるときにはいつも
오하요-오 잇테 데카케루 토키니와 이츠모
아침인사를 하며 외출할 때는 항상

忘れ物した気がしてるの
와스레모노시타 키가시테루노
뭔가 놓고 나가는 것 같은 기분이 들어

ログインボーナス集めても
로그인 보-나스 아츠메테모
로그인 보너스를 모아도

最強の武器はいつまでも揃わないし
사이쿄-노 부키와 이츠마데모 소로와나이시
최강의 무기는 언제까지고 갖추어지지 않고

ろくなアイテムも呪文も無いけれど
로쿠나 아이테무모 쥬몬모 나이케레도
쓸만한 아이템도 주문도 없지만

スーパーレアが出ない日常を
스-파-레아가 데나이 니치죠-오
슈퍼 레어가 나오지 않는 일상을

いま褒めてほしいのよ
이마 호메테 호시이노요
지금 칭찬해주었으면 해

言い訳も聞かないボスキャラに
이이와케모 키카나이 보스캬라니
변명도 듣지 않는 보스몹에게

いま立ち向かってくこと
이마 타치무캇테쿠코토
지금 맞서고 있는 걸

前を向いてるあなたとは
마에오 무이테루 아나타토와
앞을 보고 있는 당신과는

ふとしたとき目が合っちゃうね
후토시타토키 메가앗챠우네
우연한 순간에 눈이 마주쳐버리네

歩きすぎて疲れたら
아루키스기테 츠카레타라
많이 걸어서 지치면

少しだけ休もう
스코시다케 야스모-
잠깐만 쉬자

お馴染みのタイトル画面に
오나지미노 타이토루 가멘니
친숙한 타이틀 화면에

おはようを言って出かけるときにはいつも
오하요-오 잇테 데카케루 토키니와 이츠모
아침인사를 하며 외출할 때는 항상

忘れ物した気がしてるの
와스레모노시타 키가시테루노
뭔가 놓고 나가는 것 같은 기분이 들어

長い昼寝から醒めたら
나가이 히루네카라 사메타라
긴 낮잠에서 눈을 뜨면

目を見張っちゃうよなアイデア
메오 미핫챠우요나 아이데아
눈을 번쩍 뜨게하는 아이디어가

頭の何処かにあって
아타마노 도코카니 앗테
머리 어디선가 떠올라서

妄想 暴走 何も手にはつかないままで
모-소 보-소 나니모 테니와 츠카나이마마데
망상 폭주 아무것도 손에 잡히지 않은 채로

持て余す
모테 아마스
주체할 수 없어

ヒューマンエラーはドンマイね
휴-만 에라-와 돈마이네
실수는 신경쓰지마

誰でもなんだかんだポカやってる
다레데모 난다칸다포카얏테루
누구나 이런저런 실수를 해

言い訳も言わない雑魚キャラに
이이와케모 이와나이 자코캬라니
변명도 하지 않는 잡몹에게

剣を振り下ろすこと
츠루기오 후리오로스코토
검을 내려찍는 것

世界の丸ごと半分より
세카이노 마루고토 한분요리
세계의 절반보다는

終わらぬ日曜日が欲しい
오와라누 니치요-비가 호시-
끝나지 않는 일요일을 원해

歩きすぎて疲れたら
아루키스기테 츠카레타라
많이 걸어서 지치면

少しだけ休もうよ
스코시다케 야스모-요
잠깐만 쉬자구

カーテン手繰って飛び込んだ朝日に
카-텐 타굿테 토비콘다 아사히니
커튼을 걷어 비쳐오는 아침 햇살에게

ほほえみを返せたらカッコいいかもね
호호에미오 카에세타라 캇코이-카모네
미소를 보내줄 수 있다면 근사할 지도

ずっとそばで人知れず
즛토 소바데 히토시레즈
줄곧 곁에서 남몰래

そっと進化した私の特別が
솟토 신카시타 와타시노 토쿠베츠가
살며시 커져온 나의 특별한 사람이

気付いたらバレちゃうくらいが良いかもね
키즈이타라 바레챠우쿠라이가 이이카모네
눈치 채면 들킬 정도가 좋을 지도

くだらないことこそ途方もない
쿠다라나이코토코소 토호-모나이
시시한 일이야말로 어떻게 해야할 지 모르겠어

ただ 愛してたいこと
타다 아이시테타이코토
그냥 사랑하고 싶은 걸

言い訳は言わない
이이와케와 이와나이
변명은 하지 않아

憧れに向かって歩いてくの
아코가레니 무캇테 아루이테쿠노
동경을 향해 걸어가는거야

スーパーレアにSをもう一つ
스-파-레아니 S오 모-히토츠
슈퍼 레어에 S를 하나 더

書き出してやんのよ
카키다시테 얀노요
써주는거야

大切なかけがえない経験値
다이세츠나 카케가에나이 케-켄치
중요한 둘도 없는 경험치

レベルが上がっていくこと
레베루가 아갓테 이쿠코토
레벨이 올라가는 것

前を向いてるあなたとは
마에오 무이테루 아나타토와
앞을 보고 있는 당신과는

いつかお話出来るかもね
이츠카 오하나시 데키루카모네
언젠가 이야기를 할 수 있을 지도 모르겠네

歩きすぎた足のまま
아루키스기타 아시노마마
많이 걸은 다리로

少しだけスキップした
스코시다케 스킷푸시타
살짝 껑충껑충 뛰었어

 

===============================================

 

처음 들었을 땐 목소리도 독특하고 노래도 정신없는 느낌이라 듣다가 만 노래인데요, 요즘은 매일 듣고 있습니다.

ヒューマンエラーはドンマイね

誰でもなんだかんだポカやってる

저는 이 부분이 가장 마음에 드네요. 가사도 좋고 멜로디랑 일러스트도 시원시원해서 마음에 듭니다.

 

 

가사가 약간 난해한데, 문장의 위아래 순서가 바뀐 부분이 많아 그 부분을 참조하시면 될 것 같습니다.

번역을 여러 번 고쳤지만 여전히 어색한 부분이 있을 수 있으니 댓글로 알려주시면 수정하도록 하겠습니다.

결승을 보면서 메시가 우승하면 블로그를 시작할 것이라고 다짐했는데, 진짜 우승해서 시작합니다.

계기가 좀 이상하지만, 미뤄오던 일을 시작하게 됐으니 다행이라고 생각합니다.

 

늘 컴퓨터 메모장에 메모를 해왔는데, 이제는 블로그를 활용해야겠습니다.

 

일본 노래를 듣다보면, 가사의 전체적인 내용이 머리 속에 정확히 들어오지 않아 가사를 찾아보는 경우가 많습니다.

그럴 때면 번역된 가사를 찾아보곤 하는데, 좋아하는 노래 중에 가사가 번역되지 않은 노래들을 번역해봐야겠습니다.

 

소프트웨어공학과를 졸업하여 유니티 클라이언트 프로그래머로써 일했습니다.

향후에도 동일 직군에 종사할 예정이므로, 개발 관련 내용을 공부하고 써봐야겠습니다.

 

 

닉네임인 메피카타츠는, 블로그 개설 계기가 된 리오넬 메시 선수의 '메', 최근에 자주 보는 유튜버인 P丸様。의 'P', 서브컬쳐 게임인 블루 아카이브에 등장하는 오니카타 카요코의 '카', 우마무스메 프리티 더비에 등장하는 아그네스 타키온의 '타', 아이돌마스터 밀리언 라이브 시어터 데이즈에 등장하는 시라이시 츠무기의 '츠'를 따와 지었습니다.

 

리오넬 메시 선수의 월드컵 우승을 축하합니다.

+ Recent posts