mir.pe (일반/어두운 화면)
최근 수정 시각 : 2024-03-09 01:37:17

캔낫 현상


이 문서는
이 문단은
토론을 통해 r79 버전을 기준으로 서술하기로 합의되었습니다. 합의된 부분을 토론 없이 수정할 시 편집권 남용으로 간주되어 제재될 수 있습니다.
아래 토론들로 합의된 편집방침이 적용됩니다. 합의된 부분을 토론 없이 수정할 시 편집권 남용으로 간주되어 제재될 수 있습니다.
[ 내용 펼치기 · 접기 ]
||<table width=100%><table bordercolor=#ffffff,#1f2023><bgcolor=#ffffff,#1f2023><(> 토론 - r79 버전을 기준으로 서술하기
토론 - 합의사항2
토론 - 합의사항3
토론 - 합의사항4
토론 - 합의사항5
토론 - 합의사항6
토론 - 합의사항7
토론 - 합의사항8
토론 - 합의사항9
토론 - 합의사항10
토론 - 합의사항11
토론 - 합의사항12
토론 - 합의사항13
토론 - 합의사항14
토론 - 합의사항15
토론 - 합의사항16
토론 - 합의사항17
토론 - 합의사항18
토론 - 합의사항19
토론 - 합의사항20
토론 - 합의사항21
토론 - 합의사항22
토론 - 합의사항23
토론 - 합의사항24
토론 - 합의사항25
토론 - 합의사항26
토론 - 합의사항27
토론 - 합의사항28
토론 - 합의사항29
토론 - 합의사항30
토론 - 합의사항31
토론 - 합의사항32
토론 - 합의사항33
토론 - 합의사항34
토론 - 합의사항35
토론 - 합의사항36
토론 - 합의사항37
토론 - 합의사항38
토론 - 합의사항39
토론 - 합의사항40
토론 - 합의사항41
토론 - 합의사항42
토론 - 합의사항43
토론 - 합의사항44
토론 - 합의사항45
토론 - 합의사항46
토론 - 합의사항47
토론 - 합의사항48
토론 - 합의사항49
토론 - 합의사항50
||


1. 개요2. 원인3. 발생하는 문제들
3.1. 게임플레이의 지장3.2. 유즈맵 제작에의 제한
4. 장점 아닌 장점5. 해결법6. 패치 히스토리7. 스타크래프트 2

1. 개요

스타크래프트에서 엔진의 오브젝트의 최대 개수 제한으로 발생하는 문제를 의미한다.

스타크래프트는 맵에 있을 수 있는 오브젝트[1]의 수[2] 1.20 버전까지 1700개로 제한되어 왔다.[3] 만일, 이 이상으로 유닛을 생산하려 하거나 트리거를 이용해 생성을 시도하면 "Cannot create more units"[4]라는 메시지와 함께 유닛 생성이 강제로 취소 되어 버린다.

유닛 개체수 자체에 제한이 걸리지 않은 전략 게임도 많지만, 그런 게임들의 경우 일정 이상으로 유닛이 많아지면 게임의 속도가 급속도로 느려지기 때문에 게임 대부분은 최대 유닛의 개수를 어떤 형태로든지 제한하는 시스템을 넣는다. 따라서 스타크래프트의 유닛 제한 역시 별 문제는 없었어야 했다.

2. 원인

오브젝트 개수 제한은 하드웨어의 처리능력 한계 때문으로, 오브젝트의 수가 지나치게 많아지면 이를 계산하는 하드웨어에 부담을 주기 때문이다. 당장 최신 게임만 하더라도 게임 내 오브젝트가 지나치게 많아질 경우 랙을 유발하는 경우가 많은데, 더군다나 스타크래프트 1은 1998년 출시된 매우 오래된 게임으로 당연히 당시의 하드웨어 기준에 맞게 제작되었다. 스타크래프트 1의 메모리 최소 사양은 16, 권장 사양은 32MB로, GB급 메모리가 보편화된 현재 시점에서는 코딱지만한 수준의 작은 메모리였고, 이런 작은 메모리를 기준으로 제작된 게임이기 때문에 개수 제한 역시 굉장히 낮게 설정되었던 것이다.

과거에는 하드웨어가 비싸고[5][6] 성능은 떨어졌기 때문에 사양에 한계가 있었고 이는 게임에도 직간접적으로 영향을 미쳤다. 본 문서와는 별 관계는 없지만 과거 라인버퍼 시절 게임기에는 한 번에 화면에 표시할 수 있는 스프라이트의 양과 한 줄에 동시에 표시할 수 있는 스프라이트의 개수가 정해져 있었기 때문에 여러가지 문제가 발생했다.[7]

스타크래프트와 직접적으로 관계가 있는 것이라면 역시 메모리 문제일텐데 게임 안에서 오브젝트를 계속 생성하게 되면 언젠가 메모리가 다 차게되어 글리치가 생기는 경우도 있다.[8] 비단 옛날 게임 뿐만 아니라 젤다의 전설 브레스 오브 더 와일드에서는 게임을 플레이하다보면 일정 주기마다 붉은 달이 뜨며 그동안 죽였던 몬스터들이 부활하는데, 이는 내부적으로 메모리가 다 찰때마다 초기화를 시켜주는 작용을 게임적으로 풀어나가는 장치이다.

전략 게임 대부분에 흔한 '인구수' 같은 제한은 겉으로는 게임플레이가 늘어지지 않기 위한 설정이겠지만 간접적으로 오브젝트 최대 개수를 줄이기 위해 설정된 시스템이었다. 컴퓨터가 처리할 수 있는 한도 이상으로 유닛이 많아지면 랙을 유발하기 때문에 이를 막는 일종의 안전장치로 걸려 있는 제한이었던 것.

상술했지만 스타크래프트 1의 최소 사양은 펜티엄 90 MHz, 16 MB의 메모리이다. 제작 당시에는 당시의 최저사양에 맞게 최적화하여[9] 개발하였으니 거기서부터 결정된 최종 사양이 '오브젝트 1700개' 였던 것이다.

현재 시점에서 캔낫 현상을 분석하며 스타크래프트의 메모리 할당을 두고 '고작 65메가가 할당되는'이라는 표현을 쓰는 유튜브 영상이 있었는데, 1998년 당시 새 컴퓨터를 맞출때나 32메가 램을 사용했다. 당시 PC 부품들의 가격은 지금보다도 비쌌다. 물가를 감안하면 두 달 월급을 모아야 PC 한대 맞추는 거였다. 1999년에도 64MB의 메모리는 나름 큰맘 먹은 사람들이나 선택했다. 극단적으로 말해서, 이 게임은 1998년 3월에 오리지널이 출시됐고, 그 해 11월에 브루드 워가, 그리고 1년 뒤인 1999년에 온게임넷 스타리그 대회가 처음으로 이루어졌으며, 무려 14년이 지난 2013년까지 TV 방송으로써 게임이 중계되었다. 그 동안에 윈도우가 6번이나 버전 업된 신제품( Windows 98~ 8)이 나왔고, FIFA 월드컵이 4번 열렸으며, 출시 당시에 초등학교에 입학한 아이들은 수능을 치고 대학교에 입학한 시간 지날 동안에 한 프로그램을 써온 것이다. 일반적인 PC 프로그램의 수명을 생각하면 사람으로 200살을 넘긴 수준의 장수만세 게임. 물론 그만큼 게임의 버전도 올랐다.

물론 시대가 흐르고(스타크래프트가 이렇게 히트할 줄도 몰랐고) 요구에 따라 클라이언트를 손봐서 한계 메모리 허용을 더욱 높이는 방법도 쓸 수 있었을지도 모른다. 그러나 일단 만들어진 것을 바꾸기는 대단히 어려운 것이 컴퓨터 프로그래밍이다. 그렇게 간단한 문제이면 패치되었어도 진작에 되었겠으나, 오랜 시간 패치가 되고 리마스터 버전이 나올때까지도 손을 대지 못했던 것을 보면 쉬운 문제가 아니라는 것을 알 수 있다. 단순한 오브젝트 하나라도 좌표값이나 대미지 계산 판정 메모리 할당과 해제 등등 온갖 정보와 연산이 필요하기 때문에 그저 메모리가 늘어났다고 코드 좀 고쳐서 해결되는 문제가 아니다.

제작진은 이걸 고치면 생겨날 여러 문제 때문에 당장은 손보지 못했으나 앞으로 어떻게든 해보겠다고 알렸다. # 이후 소식이 없다가 1.21.0 패치에서 CCMU 숫자를 올렸으며, 1.21.3 버전에서는 투사체의 제한을 두 배인 400으로 올렸다고 밝혔다. 이것도 여전히 낮다고 불평하는 사람들도 있으나 2021년에는 개발팀도 해체되었다고 하니 더 이상 오를 일은 없을 것 같다.[10]

그래서 오브젝트 수 1700개로는 인구수 200 제한 조건 하에서는 제대로 된 8인 멀티플레이가 될 수 없는데 블리자드가 무리하게 8인 멀티플레이 기능을 제공하려다가 게임 디자인을 망쳤다고 하는 주장도 있다

3. 발생하는 문제들

3.1. 게임플레이의 지장

유닛 수 1700개는 얼핏 생각해보면 그렇게 부족한 숫자는 아니지만 인구수 1만 먹는 유닛을 200개씩 뽑는다치면 벌써 1600개에 유닛 이외에도 건물이나 투사체(마법)까지 오브젝트로 치기 때문에 8인 멀티플레이 환경에서 게임을 한계까지 플레이한다면 제법 빠르게 맞이할 수 있는 벽이다. 게임을 잘 몰랐던 시절이었다면 괜찮았겠지만 게임이 연구되면서 물량전이 개발된 이후에는 시간을 조금만 끌면 어렵지 않게 볼 수 있다.

해처리 한 개마다 세 개씩 나오는 라바. 유닛은 두 개이지만 인구수는 1만 먹는 저글링과 스커지는 말할 것도 없고, 몸통과 포탑이 별개의 유닛으로 구성된 시즈 탱크와 골리앗은 겉보기에는 한 유닛이지만 실상 게임 내부적으로는 두 유닛이며[11], 리버의 스캐럽과 캐리어의 인터셉터는 생산만 하고 맵에 없더라도 내부적으로 유닛 카운트에 합산된다. 그 탓에 프로토스 5~6명이 캐리어만 주야장천 뽑아서 인터셉터를 풀로 채우면 제한을 빨리 넘겨 버린다. 저그 4인이 저글링만 200기씩 뽑아도 이 제한을 넘기는 셈. 맵에 배치된 미네랄과 베스핀 가스도 유닛이라는 것은 덤이다.

특히 리밋에 도달하면 유닛을 생산해도 유닛은 안나오는데 자원은 그대로 꿀꺽한다. 디파일러의 다크 스웜이나 커세어의 디스럽션 웹은 실제로 유닛이라[12] 만약에 캔낫이 발생한 상황에서 스킬을 쓴다면 캔낫 때문에 안 써지고 에너지만 먹는 일이 발생한다.

참고로 핵미사일도 유닛으로 취급되기 때문에 캔낫 현상에 걸릴 수 있다.

3.2. 유즈맵 제작에의 제한

그러나 아무래도 1:1 대전이 더 많은 일반 게임보다는 유즈맵[13]에서 더 큰 문제가 되었는데, 대체로 대량의 유닛들을 사용하는 유즈맵들이 많이 등장했기 때문이다. 특히 디펜스, 블러드, 디플로메시, 문명, 소환술사 계열 유즈맵처럼 대단히 많은 몹이 등장하거나 플레이어간 대규모 전투가 일어나기 쉬운 맵에서 조금만 장기전 들어가면 거의 단골 손님 수준이다. 이 제한 때문에 나와야 하는 몹이 안 나오거나 보너스 유닛이 등장하지 않는 오류를 불러일으키는 경우가 자주 나타난다. 위와 같은 유즈맵들은 심하면 1명이 300~400기씩 유닛을 모으기도 하고 저런 경우가 아니더라도 이렇게 많은 유닛을 사용하는 유즈맵은 흔하다.

또한 ' 스타크래프트'라는 게임이 워낙에 오래된 게임이기 때문에 맵 에디터로 할 수 있는 기능도 상당히 제한적이어서 에디터로 구현이 어려운 기능은 유닛을 추가로 활용하여 해결하는 경우가 많다. 예를 들어, 게임 통제를 위해 많은 제어용 유닛이 소비되거나[14] 콘텐츠 기능 구현을 위해 쓰는 유닛[15]들은 맵 만들다가 좀 방심하면, 심하면 수백 개씩 쓰게 되기도 하는데, 이것들이 유닛 카운트를 잡아먹고 캔낫 현상의 영향을 받아 트리거 오동작을 일으키기도 한다. 때문에 유즈맵 제작자들은 캔낫 현상을 대비해서 유즈맵을 만들 필요가 있다.[16]

또한 밀리맵도 악령의 숲[17]처럼 맵이 이상하게 나오는 경우가 있다.

4. 장점 아닌 장점

단점만 있는 것은 아니다. 강제로 맵 전체에 있는 유닛 수를 제한하기 때문에 플레이어들이 유닛을 모으기만 하고 몸을 사리는 것도 예방할 수 있고[18], 유닛을 너무 많이 쌓지 못하게 하여 랙을 유발하는 일을 줄이기도 한다. 하지만 현세대 컴퓨터의 성능은 훨씬 높아서 이 정도로는 랙이 발생하지 않고, 실제로는 인구수 200을 먼저 찍은 쪽이 공격에 나서기 때문에 그렇게 의미있는 수준의 장점이 아니다(...).[19]

5. 해결법

간단하다. 장점 문단에도 있다시피 플레이어들이 서로 치고박고 싸우면서 유닛을 소비하면 된다. 몸을 사리던 플레이어들이 자신의 유닛들을 던지거나, 많은 유닛을 보유한 플레이어에게 유닛을 죽게 하든지 하라고 아비규환이 되는 모습을 볼 수 있다.

제한을 푸는 방법은 있지만, 엔진 자체의 한계이기 때문에 맵 제작자가 이 제한을 푸는 방법은 현재로서는 마땅히 없다. 게다가 뭐든 할 수 있을 것 같은 EUD로써도 해결하기에는 너무나 복잡하여 불가능에 가깝다. EUD의 일종으로서 투사체의 제한치를 늘리는 Unlimiter로써도 유닛 제한치는 늘릴 수 없다. 이는 아마 유닛 배열이 여러가지로 엮여있거나 정적으로 코드에 박혀 있는 게 원인인 듯하다. 별도의 프로그램이나 플러그인을 통해 코드패치를 하는 식으로 늘린 사례는 있으나 어찌됐든 일반적으로 맵 제작자가 이 제한을 풀어낼 만한 마땅한 방법은 없고, 블리자드의 패치를 바라는 수밖에 없었다.

6. 패치 히스토리

스타크래프트: 리마스터 소식이 뜨면서 이러한 제한이 완화되기를 기대하였으나 1.18 패치의 출시날에도 블리자드에서는 패치에 관해 아무런 언급도 없다시피 하였다. 스프라이트에 대한 내용은 미리 공지를 하였지만 현재 캔낫 현상에 관해선 아무런 언급도 없었다. 스타크래프트: 리마스터 제작 시, 블리자드 측은 주로 프로게이머들 위주로 피드백을 받았다. 프로 게임을 진행하는 1:1 매치에서는 캔낫을 걱정할 일이 없기 때문이다. 다만, 스타크래프트가 공식적으로 8인전을 지원하는 게임인 만큼, 일반적인 8인전에서는 전혀 문제가 생기지 않을 정도로 제한을 높이는 것은 반드시 해야 한다. 게다가 이 제한 자체가 과거의 컴퓨터 사양 문제로 비롯된 만큼, 사양이 대폭 높아진 현재 기준으로 이 제한을 유지할 이유는 사실상 없는 셈이다.

1.19 패치로도 수정되지 않았다. 미국 배틀넷 포럼의 한 유저가 다수의 유닛이 운용될 때 스프라이트가 렌더링되지 않고 공격이 먹히지 않는 현상이 고쳐지냐고 물어본 글에 수정된다는 개발자의 답변은 있다. # 이는 스프라이트 수 제한으로 말미암아 발생하는 문제이고, 캔낫 현상도 같은 원인으로 말미암아 발생하는 문제라 긍정적으로 관측할 수 있다.

블리자드 측에서 이에 대해 답변을 달았는데, 내용은 아래와 같다. #
Howdy Friends,

We're days away from release, but we know Cannot Create More Units is a topic of
great importance to the community.

There are massive implications for the engine and gameplay with this change. We
haven't ruled it out, but we also haven't had time to land on the correct solution;
"Don't break StarCraft."

We will delve deeper into the problem after release. See you soon.

Cheers,
Classic Games
안녕 친구들,

출시를 얼마 남기지 않은 요새, CCMU가 커뮤니티의 가장 큰 논제라는 걸 알아요.

이를 바꾸는 건 게임 엔진이나 플레이에 크나큰 영향을 끼칠 수 있답니다.
고치기로 한 부분이긴 하지만 우리의 철칙인 '스타크래프트를 부수지 않는다'를
지키면서 수정할 시간이 부족했어요.

출시 후에 이 문제에 대해 더 깊숙이 살펴 볼테니, 나중에 봐요.

고마워요, 클래식 게임.
요약하면, 캔낫 현상을 고치려면 엔진 전체를 들어엎어야 하는 만큼 커다란 수정을 해야 해서 당장은 해결이 어렵지만 이 문제를 계속 지켜본다고 했다. 특히 리마스터 버전은 클래식 버전과의 호환성도 고려해야 하기 때문에, 수정이 쉽지는 않아 보였다.

2017년 12월 8일, 1.21 패치로 일부 EUD 맵 실행 지원과 함께, 유닛 개수 제한이 1700개에서 2배인 3400개로 늘어났고, 방을 만들 때 유닛 제한량을 설정하는 옵션이 추가되었으며, 확장에 체크할 시 유닛과 스프라이트 제한량이 함께 증가한다.[20] 투사체 개수 제한은 100개에서 2배인 200개로 늘었다. 다만, 대규모 교전 시의 버벅거림은 아직 있는 것으로 보이고 #, EUD 맵 실행 시에 유닛 제한량은 오프셋 문제인지 1700개로 고정된다.

이와는 별개로, 투사체 개수 제한은 1.21.3 패치로써 200개에서 2배인 400개로 또 늘었다. 현재는 스프라이트 개수 제한도 오리지널은 499개, 확장은 999개까지 늘어난 상태다.

1.22.2 패치로 Unlimiter 플러그인이 공식적으로 지원되어 투사체 개수, 스프라이트 개수, 이미지 개수의 제한을 65,536개까지 늘릴 수 있게 되었다.

여담이지만 유닛제한이 풀려도 2배가 한계인건 둘째치고 확장유닛수라도 유닛이 일정 규모 이상 생성되면 컴퓨터 유닛을 아직도 트리거로 움직일 수 없는데 이게 EUD맵이랑 다를게 없다는 거다. 플레이어가 유닛에 내리는 명령도 선택 유닛들 가운데 극히 일부에만 제대로 먹히거나 아예 씹힌다.

간단히 말해 캔낫 해결도 잊을 만하면 의미를 상실한다는 얘기다.

7. 스타크래프트 2

후속작인 스타 2에도 있다. 스타 2에서 발생하는 현상의 이름은 'Ability Limit'이라고 하며, 섬멸전 기준으로 대략 모든 플레이어들의 인구수가 총합 6000 정도에 도달하면 발생한다고 한다.

다만 스타 1와 다르게 유닛이 생성되지 않는게 아니고 해당 유닛의 능력들이 할당되어 않아 이동도 공격도 못 하는 일명 깡통으로 생성되며, 생산 건물은 건설 시작하지마자 자동으로 취소된다. 일반적으로 오류 메시지가 나오지 않다보니 바로 알아채기가 어렵지만 유닛들이 건물에 달라붙어 아무것도 안 하고 명령도 아예 먹히지 않게 된다.

맵 에디터로 테스트를 해보면 디버그 로그에 오류 메시지가 출력되는데, "user: 능력의 한계에 도달했습니다."가 표시되는 걸 볼 수 있다.
[1] 건물, 몇몇 스펠을 포함한 스프라이트 객체의 통칭 [2] 스타트 로케이션은 합산되지 않는다. [3] 여담이지만 Scmdraft 2, 세디터 등의 편집기에서 플레이어 설정 기능을 보면 1~12플레이어까지 나오는데, 이를 토대로 초기에는 최대 인구수 100에 12인 플레이를 생각하고 만들다가 나중에 최대 인구수 200에 8인 플레이로 방향을 바꾼 것이 아니냐는 추측이 있다. [4] "유닛을 더 이상 생성할 수 없습니다." 이 이유로 영어로는 이 현상을 이 메시지의 앞글자만 따온 'CCMU'라는 이름으로 부른다. [5] 특히 메모리가 가장 비쌌으며 컴퓨터 값의 50%가 메모리 값이라고 봐도 될 정도였다. [6] 또한 초창기~ MS-DOS 시절까지의 PC는 게이밍, 하드웨어 성능 모두 가정용 게임기보다 퍼포먼스가 좋지않던 시절이였다. [7] 록맨 2 문서에 있는 부빔트랩 공략 영상을 보면 알 수 있는데, MSX판 알레스터, 엑시드 엑시스, 이카리 마이크로닉스가 NES로 저질 이식한 아케이드 게임 등 깜빡임 현상 해결은 기술력에 따라 천지차이였다. 이를 해소하고자 NES로 게임을 만들 때 갖은 꼼수와 묘수를 통해 어떻게든 적은 처리량으로 많은 내용을 화면에 보여주려고 노력했다. 파판3 같은 게임조차도 전투 배경을 화면 일부에만 표시하거나, 록맨 시리즈는 아예 초대형보스전이나 와일리와의 최종결전땐 시커먼 배경으로만 나오든가 하는 식으로 말이다. [8] 이를 이용한 대표적 꼼수가 파이널 파이트의 최종보스 벨가전의 하메. [9] 이 때문에 스타크래프트는 CPU 활용도가 매우 높아서, 오버클럭한 CPU 테스트용 게임으로도 종종 활용됐을 정도다. [10] 다만 이것도 PvP에 좀 지장이 있으니까 패치가 이뤄진 것이지 PvE 관련 문제들(AI가 미완성 건물을 방치하는 문제, 밀리 AI 스크립트 오류 등등)은 리마스터에 와서도 전혀 고쳐지지 않은 점을 생각하면 PvP에 별 문제가 없다면 개발팀이 해체되지 않았어도 추가적인 패치가 이뤄졌을 가능성은 별로 없다. 특히 AI가 미완성 건물을 방치하는 문제는 1.00 버전 이후 블리자드 실수로 발생한 꽤 오래된 문제인데도 리마스터에서도 방치된 상태다. [11] 시즈 탱크와 골리앗은 이동과 공격이 별개의 유닛으로 구성되어 있어서 무빙샷을 할 수 있다. 다만 밸런스 문제로 무빙샷이 불가능하도록 패치된 상태다. [12] Scmdraft 2 같은 특수 에디터로 배치할 수 있다. [13] 다른 게임에서 흔히 말하는 커스텀 맵을 의미한다. [14] 특정 지점을 계속 돌게 해서 타이머 역할을 하게 하거나 리콜 같은 특수 효과를 위해 배치하는 경우. [15] 문명의 식민지처럼 이정표 역할을 하거나 NPC처럼 배치해두고 가만히 있는 오브젝트 역할을 하는 경우. [16] 대량의 유닛을 신속하게 학살하는 스킬이나 아이템을 추가하거나 유닛 수가 많을수록 페널티를 부과하는 등... [17] 박카스 스타리그 2008 당시 쓰던 맵으로, 캔낫 현상 때문에 나무 두뎃이 밑동만 나왔다. 게다가 끼임 현상, 가까운 러쉬 거리 등 여러가지 문제가 있어서 지난 시즌에 쓰던 몽환 2로 교체되고 퇴출. [18] 다만, 일부 트롤러들은 최대한 유닛을 많이 모은 다음 사리는 방법으로 일부러 캔낫을 유도하여 남들이 유닛을 생산하지 못하게 한다. [19] 다만 트리거로 엄청난 양의 유닛이 생성되는 컴까기류 맵은 정공법으로는 답이 없어서 캔낫이 발생할 때까지 죽어라 수비하다가 캔낫이 발생하면 그때 쌓인 유닛으로 공격을 가는 방법 외에는 승리할 방도가 없는 터라 유닛 제한을 확장으로 선택하고 방을 만들면 끝없는 소모전만 벌이다가 패배를 맞이할 뿐이라 유닛 제한을 오리지널로 선택하고 방을 만들어야 한다. [20] 보통은 유닛 제한량을 확장으로 체크를 해 놓으며, 오리지널로 체크된 방은 캔낫방이라고 불리며 배척받는다.