멀티스레드로 굳이 만들지 않아도 조금조금씩(1프레임 내에 처리 가능한 만큼) 로딩하면 가능할 것 같다.

하지만 당분간은 하고 싶은 다른 프로젝트가 생겨서... 보류!

Posted by RPG만들기XP
,



당연히 안된다.


혹시나 하고 기대했지만.. 역시나...


스레드로 돌려달라고 친절하게 요청했지만 cocos2d-x가 보여주는 결과물은 이전 포스트의 결과물과 똑같다... 리소스 로딩할때 프레임 스탑...ㅜㅜ

(참고로 MapManager::reload() 내부에서 cocos2d::TMXTiledMap::create()를 호출한다.)


앞이 모두 막힌 현 상황에서 너무 힘들다. 모두 내 공부가 부족한 탓이겠지만...


원래의 목적이었던 2d seamless를 포기하고 평범한 rpg를 만드느냐, 계속 하느냐 고민이다.


정확히 뭘 공부해서 어느 부분을 어떻게 바꿔야지 계획이라도 보인다면 힘들어도 그대로 할텐데,

어떻게 짜야할 지 아예 감이 안온다.

보류해놓고 책 읽고 공부나 해야되나...


Posted by RPG만들기XP
,

https://github.com/seokmin/2d_map/tree/v0.1_refactoring


더러운 줄줄이 반복 코드가 너무 많아서 "아 이게 바로 고수님들이 말씀하시던 리팩토링을 해야 하는 순간인가" 하고는 리팩토링을 시도하였다.


안 된다.


분명 깔끔하게 해결할 수 있을 것 같은 부분이 엄청 많은데 안된다.


ㅠㅠ

Posted by RPG만들기XP
,


깃허브 링크 - https://github.com/seokmin/2d_map/tree/v0.1

*사실 아무도 안봤으면 좋겠다. 더럽고 더럽고 더럽고 더럽고 더럽고 더러운 코드들... 더러운 코드들... 더티 코드 베리베리 더티 코드즈...



맵을 n*m칸으로 쪼개어 저장해놓으면, 바둑판 모양으로 그래프를 쭈욱 그려서 메모리상에는 항상 캐릭터가 위치한 zone을 중심으로 한 9개의 맵만 띄워놓는다.

일단은 캐릭터가 속해있는 맵의 경계선을 지날 때 가려는 방향의 맵을 새로 메모리에 올리고, 지나온 방향의 맵을 메모리에서 내린다.

만약에 전체 맵(n*m개의 zone을 전부 붙여놓은)의 경계선을 지난다면, 전체 맵을 순환하게 해놓았다.(지구는 둥그니까)

아직 타일 이미지만 화면에 띄우는 것이라 엄청 간단한 일이고, 맵에 딸린 이벤트, NPC, 각종 오브젝트들까지 이 방법으로 구현하려면 멀고도 험한 길이 될 것 같다.

하지만 일단 목표로 했던 "타일 이미지라도 오픈월드로 돌아다닐 수 있게 만들자!"는 달성했다.


그런데... 만들다보니 엄청난 벽에 느닷없이 부딪혀 버렸는데..

영상에서 보다시피 로딩할 때 걸리는 시간때문에 zone을 넘어다닐 때 게임이 멈춰버린다.

이러면 눈으로 보기에만 seamless이지 사실은 게임에 전혀 써먹을 수도 없고, 일랜시아, 바람의나라같은 흔한 맵 시스템과 다를 것이 없다.

따라서 맵을 메모리에 올리고 내리는 과정을 백그라운드에서 진행해야 매끄럽게 돌아갈텐데, cocos2d-x가 백그라운드 리소스 로딩을 지원하지 않는 것으로 알고 있어서 엄청난 멘붕에 빠져버렸다.

어찌어찌 해서 MapManager 로직을 따로 빼서 멀티스레드로 돌린다고 하더라도, 로직을 분리해봤자 리소스를 로드하고 그려주는 cocos2d-x가 싱글스레드로 동작하는 이상 해결 방도가 없다는 것..

방법은

1. cocos2d-x를 뜯는다.

2. 엔진을 만든다.

3. 포기한다.


3번은 절대 싫다.

1번은 내 실력이 미천해서 어렵고 힘들고 엄청난 시간과 노력을 요하는 과정일 것 같다.

2번은 내 실력이 미천해서 어렵고 힘들고 어렵고 힘들고 어렵고 힘들고 불가능한 과정일 것 같다.


일단 구글링(...)을 비롯해 여러 곳에서 해결 가능한 방법이 있는지를 알아보고, 정 해결 방법이 없다고 한다면 고민을 많이 해봐야 할 것 같다.

Posted by RPG만들기XP
,

동적으로 TMXTiledMap::create()를 하면 화면에 리소스를 띄우는 데 까지 수십초 이상 소요되는 문제가 있었다.

디버그모드에서만 발생하는 문제라서 한참을 고민하고 불편해했었는데, '혹시?!'하는 생각에 코드 한 줄 수정했더니 아주 빠르게 잘 돌아간다.

문제는 VLD(Visual Leak Detector)때문이었다.

VLD가 new, delete할 때마다 개입해서 하는 짓이 많다보니, 잦은 new(100*100칸의 tileset이라면 1만번~최대 수만번의 new가 발생할 것)때문에 그렇지 않았나 싶다.

결국 TMXTiledMap을 이용하는 프로젝트에서는 게임이 돌아가는 화면을 제대로 보려면 디버그시 VLD를 꺼야만 한다.

그러면 내 미천한 실력으로 인해 줄줄 새어나가는 메모리는 누가 봐주지..

Posted by RPG만들기XP
,

맵 스크롤시 티어링이 심한 문제가 발생했다.

vsync문제에 따른 티어링 발생은 아니고,

타일과 타일 간 유격이나 밀림이 발생해서 가로, 세로를 막론하고 타일 경계선에 티어링이 발생하는 문제가 있었다.


해결 방법 : ccConfig.h의 #define CC+FIX_ARTIFACTS_BY_STRECHING_TEXEL 0을 1로 바꿔준다.

원리는 사실 잘 모르겠으나, 어떻게든 해결하긴 했다.

Posted by RPG만들기XP
,



맵 9칸 띄워놓고 돌아다니기. 이제 센터를 제외한 나머지는 계속 갈아치워주면서 로딩하면 될 듯 싶다.

근데 데스크톱으로 하는데도 이만한 맵 띄우는데 1분씩이나 걸리는데 이유가 뭘까..

Posted by RPG만들기XP
,



https://github.com/seokmin/2d_map

목표는 한반도만한 2D 맵을 로딩 없이 돌아다니는 시스템 만들기.

cocos2d-x로 구현할 계획이다.

(사실 cocos2d-x고 뭐고 아예 분리하여서 cocos2d-x 말고 다른 곳에도 갖다 붙일 수 있게 만들 수 있다면 좋겠지만.. 무리..무리무리..)

일단 맵 띄우고 스프라이트 띄우고 이동시스템 만들고 하면 시간이 다 갈 것 같다.

돌아다니는 것만 구현하면 생각보다 어렵진 않을 것 같지만,

이벤트, 오브젝트들 전부 오픈월드(?)로 구현하려면 내 수준에서는 쉽지 않은 작업일 것 같다.


오늘 저녁에는 네임스페이스를 붙여주지 않아서 빌드가 되지 않는 문제를 해결못해서 두시간동안 삽질했다.

도대체 왜 전혀 상관없는 이상한 에러메시지를 띄워주는 것일까.. 나쁜 비주얼스튜디오..

Posted by RPG만들기XP
,