게임제작/개발일기

[게임센터 운영하기]게임개발 다이어리 #2

게임코드프리 2018. 11. 12. 16:32
반응형

#게임개발 일기 #일지 #게임개발 다이어리


[게임센터 운영하기]게임 개발 다이어리 #2편



지난 이야기에서 다뤘듯 다시 구조를 잡아 만드는 중입니다.

Isometric 뷰를 구현하고 그 이후 각 타일들에 대한 좌표값을 얻어야만 배치가 가능하기에 좌표값을 얻어내는 것에 성공.

하지만 그 이후 각 타일들을 인벤토리 구조처럼 데이터 구조로 만들고 값을 넣어야만 가능하기에

그 부분에 대해 고전중입니다.



  • 데이터 구조가 문제가 아니다.

일단 인벤토리를 만드는것은 그리 어려운게 아니기에(프로그래밍을 할줄 안다면) 문제가 되지 않지만

여기서 문제는 바로 배열을 효과적이고 체계적으로 사용하지 못할시 발생하는 메모리 누수 문제가 더 큽니다.



예를들면, 상점의 종류가 많고 각각의 인벤토리를 따로 만들경우에는 메모리가 기하급수적으로 늘어나기에

각 상점의 인벤토리 구조를 하나로 합친후 공용으로 사용하며, 호출시 리스트를 초기화하여 

다시 구조에 덮어쓰기 하는 형식으로 만들었습니다. (이게 아닌가?)

어쨋든 거기까지는 나름 최적화를 시킨것같은데 문제는 여기서 발생했습니다.


각 상점의 배열들이 존재하고 어떤 배열을 유저가 클릭하여 그 배열값을 유저의 인벤토리 배열에 넣어야 하므로

상점의 배열안에 어떤 상품을 클릭했는지 찾는 상황에서 메모리가 늘어납니다. (아....)




사실 PC게임이라면 큰 수치는 아니지만, 모바일의 스펙상 메모리 상승하는 구조가 있다면 핸드폰이 뻣거나

에러를 발생하거나 프로그램이 강제로 종료되는 상황이 벌어지기에 큰 이슈라 할 수 있습니다.

각 상점이 같은 구조로 제작되어있다보니 큰 문제이고 이것을 해결하는데 꽤나 어려움이 있어보입니다.



게임메이커 스튜디어의 문제점?


게임메이커에는 유니티에서 흔히 말하는 씬 을 룸이라는 용어로 사용하고 있고, 

룸을 이동시 누적 메모리가 상승하는 이슈가 있다고 들었습니다. (어째서?)

새로운 씬을 만들고 로딩하는 과정에서 들어가는 메모리에 대해서는 그렇다 치고 오픈과 클로즈를

반복할때마다 늘어난다면...절대로 상점같은 경우에는 씬으로 구성하면 안되겠구나 생각했지만

이 많은 구성요소들을 다시 스크립트로 바꾸고 하나의 방에서 열고 닫기를 해야 할지에 대해 큰 고민에 빠졌습니다.

(또 고쳐야하나...)



게임메이커 공식 커뮤니티에 들어가보면, 룸이 바뀌거나 룸을 다시 시작하게 되면 3.0정도의 메모리가 늘어나는것이

정상적인 일인지에 대해 문의를 한 사람이 있었고,

룸 재시작이나 게임을 다시 시작하는 기능은 애초에 게임에 넣는 기능이 아닌, 게임개발자가 테스트용으로 사용하는 함수이므로

되도록 실제 게임에는 넣지 않는 것을 권장합니다. (처음 알았음)


그래서 룸을 바꾸지 않고 게임의 구조를 어떻게 체계적으로 만들어야 하는지에 대해서 고민이 생겼습니다.


실제로 테스트 해봄

  • 테스트 케이스1 룸체인지


- 테스트의 구조 - 

오브젝트 2개로 룸1과 룸2로 1초에 한번씩 번갈아가며 체인지 하는 형식. 

게임메이커 스튜디오2 버젼 2.2.0.343


처음 12.38MB에서 시작하여 최대 12.45MB까지 메모리가 변화가 보였지만 계속 반복되는 룸임에도

초기 사용된 메모리 이외에 추가로 발생하는 메모리는 없어보입니다.


  • 테스트 케이스2 스크립트 호출


- 테스트의 구조 - 

스크립트를 호출하고 스크립트가 한번 돌때마다 변수로 카운트 되는 것을 체크.

게임메이커 스튜디오2 버젼 2.2.0.343


애초에 만들어놓은 변수값들을 제외하고 스크립트의 크기에 따라 초기 메모리값이 상승하는 정도는 느꼈지만

이후 계속 반복적으로 호출과 파괴를 반복해도 추가로 늘어나는 메모리는 없었습니다.


인터넷의 정보를 너무 신용하지 말자


언제적 데이터인지 언제의 게시물인지에 따라서 각자의 상황과 다를 수 있기에

너무 100% 신용하는것은 역시 금물이라는 생각이 듭니다.


결국 개인적인 테스트 결과에서 얻어진 내용으로 볼때 룸 이동이나 스크립트 호출에서 메모리 누수는

없는것으로 판단됩니다.

메모리는 결국 리소스와 사용된 것들(변수,스크립트,이미지,씬들)

그리고 데이터구조(배열들), 서페이스, 파티클이 메모리에 추가되며 이것만 주의하면 메모리 누수가 없다는 것을

깨닫는데...귀중한 시간을 소비했습니다.


역시 배열을 최적화 하자



인벤토리에 초기 값이 없을 경우에도 슬롯들을 모두 보여주는 바보같은 행위를 하여 , 코드를 수정하였고

인벤토리에 새로운 값이 들어왔을시에만 표시되도록 구현해놓았습니다.

이후에 맵에 배치되는 좌표값을 미리 저장하고 있어야 하는지...저장하지 않고 있다면 배열의 값으로만 직접 넣어주는게 

효율적인지에 대해 고민하면서 작업에 대한 꽤나 긴 시간이 필요해보입니다.

(이제 다른일을 해야해서 또 언제 제작을 할수 있을지 의문...)

반응형
facebook twitter kakaoTalk kakaostory naver band shareLink
人気ブログランキングでフォロー