최적화

1 개요

최적화(Optimization)란, 말 그대로 최적의 상황으로 맞춘다는 말이다. 소프트웨어를 자원을 적게 먹고 효율을 좋게 바꾸는 작업. 이것을 잘하면 물건을 잘 샀다는 느낌이 들 수 있지만, 이것을 잘못 할 경우 발적화[1]란 소리를 들을 수 있을 것이다.사실 일반인들은 최적화보다 발적화를 더 많이 사용한다 윈도우 임베디드 컴팩트를 연구하는 이들에게는 뼈저리게 다가오는 단어. 사용자 경험에 가장 크게 기여하는 개념.

흔히 전자제품에서만 사용되는 용어로써 단순히 좁게 생각해보면 기기의 성능을 단순히 업그레이드 시키는 펌웨어 업그레이드부터, 넓게는 업데이트(윈도우즈 시리즈의 서비스팩 급과 같은 대규모 업데이트)까지 넓다. 임베디드 프로그래밍에서는 속도와 용량 사이의 상반관계(Trade-off)를 감안해야 하기 때문에 어느쪽을 우선시 하느냐에 따라 최적화의 방향이 달라질 수 있다.

단, 어느쪽이든 하드웨어를 바꾸는 업그레이드는 예외. 한정된 성능에서 최적의 모습을 보여주어야 하기 때문에 별 의미가 없다. 몇몇 회사들은 최적화에 한계가 있는 부분을 하드웨어를 업그레이드하여 커버하기도 한다. 이를 하드웨어로 최적화한다고 표현하기도 하지만 그런 개념은 없다.

애플[2][3]외계인을 갈아만든 심비안 버프의 노키아는 최적화를 잘 하는 기업으로 유명하다. 국내에서는 코원이 유명하다면 유명하다. 닌텐도의 경우 최적화를 잘 하기는 하나 닌텐도가 최적화를 잘 한다기보다는 닌텐도 게임기로 타이틀을 발매하는 서드파티가 자사의 게임에 발적화를 해서 닌텐도가 최적화되어 보이는 것 뿐. 실질적으로 개발사인 닌텐도만 하드웨어의 특징을 잘 살린다고 볼수 있다.[4]

NASA가 이 분야에선 먼치킨이다, 자세한 것은 보이저호만 참고해도 된다. 사실 당연한거다. 외계인을 지속적으로 잡아와서 갈아넣는데 이정도가 안나오는게 오히려 이상하다. 덧붙여, NASA는 (적어도 우주선에 붙일 것으로는) 절대로 최신 CPU를 구입하지 않고 오래된 구식 CPU[5]만을 구입한다. 신형일수록 민감도가 심해져 극한의 환경을 버틸 수 없기 때문에[6] 질리도록오래도록 사용할 수 있는 둔감한안정적인 처리장치만을 요구한다고.[7]

게임계에선 밸브 코퍼레이션이 최적화로 유명한 편이고, 크라이텍도 2011년부터 최적화로 유명해졌다. 크라이시스 2가 전작과는 달리 높은 그래픽에 비해 최적화가 잘 되어있기 때문. EVE 온라인의 경우 한 때 서버의 발적화로 욕을 많이 먹었다가 발적화를 싹 해결한 프로그래머가 (플레이어 중에 IT 업계 종사자가 많은 덕분에) 슈퍼스타 취급을 받기도 했다. 그리고 락스타 게임즈GTA 4는 심각한 개적화였지만 후속작인 GTA 5는 엄청난 신적화로 환호를 받았다. 또한 프로스트바이트 엔진을 사용한 게임들(배틀필드 4, 등)도 최적화가 잘 되어있는 편이다.

또한, 소프트웨어 최적화 전문가로서 가장 유명하고 장수하는 인물로는 마이크로소프트에서 존 카맥의 ID소프트로 스카우트되어 퀘이크 엔진을 최적화했던 전적의 마이클 압래쉬(Michael Abrash)가 있다. 현재까지도 최적화 최고수로 인정받고 있으며, 코드 한줄 한줄, 어셈블리 하나 하나를 극한까지 쥐어짜내는 것으로 유명하다.

여담으로 사람의 뇌도 최적화 진행중이라는 연구결과가 있다. 뇌 크기는 점점 줄어들고 있는 데, 지능은 오히려 높아지는 기현상이 발생하고 있기 때문.#

1.1 주 최적화 기법

  • 알고리즘 개선
최적화의 기본 전제가 되는 것은 적합한 알고리즘이다. 알고리즘이 쓸데없는 낭비 없이 최적의 상태로 설계된 상태에서나 프로그램 코드 튜닝이 의미가 있지, 비효율적인 알고리즘을 쓰면서 온갖 최적화 기법을 동원해 봐야 전혀 의미가 없다. 극단적인 경우엔 0.1%의 성능을 높이기 위하여 99%의 시간을 쓰게 될 것이다.
대부분의 프로그램은 프로그램이 사용하는 모든 부분이 느리기 보다는, 조그마한 부분에서 50% 이상 느려지는 등의 병목이 발견되는 경우가 많다. 이러한 병목을 줄이는 것은 적은 노력으로 엄청난 성능 향상을 가져온다.

1.2 마이크로 튜닝

최적의 알고리즘을 사용하고 주요 병목을 제거했는데도 시원치 않을 경우 군데군데를 손봐서 성능을 튜닝한다. 이런 최적화는 코드의 가독성이나 유지보수성을 등가교환해야 하는 경우가 많다. 이 트레이드오프를 감수하는 것은 프로그래머의 몫. 일반적으로 병목을 제거하는 것만으로도 충분히 빨라졌다면 튜닝을 굳이 할 필요는 없다.[8] 반면 그래도 좀더 나은 속도가 필요하다면 다음과 같은 튜닝을 시도하기도 한다.

  • 구문을 인라인 어셈블리로 대체하여 컴파일러가 할 수 없는 수준의 최적화를 시행한다.
그러나 2014년 현재 일반적인 환경에서 이런 작업을 필요로 하는 경우는 거의 없다. 컴파일러 최적화 기술의 발전에 따라 프로그래머에 준할 정도로 똑똑해졌기 때문이다. 더구나 컴파일러가 할 수 없는 수준의 최적화를 할 수 있는 프로그래머는 얼마되지 않는다. 정말 쥐어짜내더라도 컴파일러가 지원하는 인트릭 식으로 컴파일러의 최적화를 도와주거나 SIMD를 이용하는 정도가 한계.
  • C언어를 작성할 때 변수 용량을 줄인다.
메모리 및 캐시 등의 자원이 매우 한정적일 때 사용하는 방법의 예. 예를 들어서 최대 10000이 들어갈 변수에 int형 대신 short int를 쓰는 식으로. 최근의 CPU는 사실상 속도 차이가 안나지만, 임베디드 환경처럼 제한된 자원만을 사용해서 최대한의 성능을 내야 하는 경우에는 사용될 수 있다.[9]

2 레벨 디자인에서 최적화

레벨 디자이너 커뮤니티 등지에서 종종 논의되고 있는 이슈 중 하나로 맵상에서 프레임이 너무 심각하게 떨어져 게임 진행에 지장을 주지 않기 위해 원인이나 정도를 파악하고 조치를 취하는 일을 디자이너 사이에선 통상적으로 '최적화' 라 칭한다. 프레임 하락의 원인으론 대개 다음과 같다.

  • 유저 PC 사양이 평균보다 낮다.[10]
  • 게임 엔진발적화 혹은 원인 모를 에러가 있다.
  • 맵 지형이나 모델[11] 등에 고화질의 텍스처가 심각하게 남용된다.
  • 각종 사물이나 NPC와 그것들의 시체, 그리고 여기에서 튄 파편들(Gibs)이 맵상에 너무 많이 존재한다.

그리고 문제 원인이 파악되면 다음과 같이 작업이 이루어진다.

  • 고화질 텍스처가 원인이라면 24비트 텍스처를 256컬러로 낮추는 식으로 다운그레이드 혹은 해당 텍스처가 사용되는 빈도를 낮춘다.[12]
  • 과도한 사물들이 많아 생긴거면 게임 상에서 자주 보거나 쓸 일이 없는 것들부터 삭감하나, 엔진이 눈 앞의 사물 위주로 연산하고 나머지는 대충 처리하는 경우라면 한 공간에 너무 많은 사물들이 위치하게 않게 해줘도 좋다. 또한 게임이나 연출 특성상 부득이하게 시체와 파편들이 많이 발생되어야 한다면 발생(혹은 생성)된 지 몇 초 뒤 형태가 흐려져 사라지게끔 하는 것도 좋다.[13]
  • 배경 오브젝트나 텍스처를 팔레트 스왑 혹은 여러 개로 분할된 상태로[14] 만들어 일부만 불러오거나 구조나 텍스처 일부를 바꿔 다른 모델로 재탕변형하는 방법도 존재한다. 비슷한 예로 사운드 파일도 여러개로 분할, Sentence(문장) 스크립트 파일에 짜여진 대로 소리가 순서대로 나게 만드는 경우도 있다. 이것처럼.

물론 유저의 사양이나 엔진상 문제면 레벨 디자이너가 할 수 있는 일은 당사자를 갈구는 일 빼면 별로 없다.최저사양이나 올려적어야지

여담이지만, 엔진에 따라 눈에 보이지 않는 불필요한 사물을 디자이너가 임의적으로 조절 혹은 생략시키는 기능도[15] 존재하기도 한다.

3 경제학에서의 최적화

경제학 중에서도 미시경제학에서 최적화를 다룬다. 인간의 합리성 등을 가정하고 소비자의 효용극대화, 기업의 이윤극대화의 를 구한다.

4 검색 엔진에서의 최적화

SEO(Search Engine Optimization)라고 한다. 자신의 웹 페이지가 검색 결과의 상위에 나올 수 있도록 하는 작업을 말한다. 검색엔진마다 검색 결과에 순위를 매기는 방식은 다르며 이는 공개되지 않아서 정확히 알 수 없으므로 검색 결과 상위에 나오게 하는 기술과 광고를 접목시켜 돈을 벌기도 한다. 예를 들어 네이버에 맛집을 검색하면 상위에 나오는 검색 결과는 대부분 검색 엔진 최적화를 한 광고글이다.

4.1 블로그 최적화

블로그에서의 검색 엔진 최적화를 말한다. 요약하자면, 블로그를 특정 검색 엔진에서 검색하면 비교적 상위에 노출되도록 우선 순위를 부여받는 것을 말한다. 주요 포털 검색 엔진에서 블로그 최적화가 되는 경우, 해당 블로그의 글들이 상위노출의 우선권을 부여받기 때문에 일반적으로 그 블로그의 방문자 수가 급증한다. 반대로 검색 엔진으로부터 특정 순위 이상에 노출되지 않는 일종의 제재를 받는 것은 블로그 저품질 참고.

4.1.1 네이버에서

네이버에서는 2015년까지 매월 12일, 27일에 특정한 조건[16]을 만족한 블로그들을 대상으로 블로그 최적화를 시켜 주었으나, 이렇게 하여 매월 12일, 27일마다 최적화 블로그가 대량으로 나온 것은 2015년 11월 12일이 마지막이었다. 2015년에 고3이었고 수능 끝나고 나서 블로그 시작한 사람들은 안습 2015년 11월 27일 이후 최근까지 블로그 최적화가 대량으로 발생하지 않고 있어, 각종 블로그 관련 커뮤니티에서 이에 관한 블로거들의 의견이 많다. 최근에는 블로그 최적화가 되려면 최소 8개월 이상 운영해야 한다는 추측이 있다. 현실은 8개월 후인 2016.07.12에도 안 나왔어요

2016년 7월 19일에서 네이버에 블로그 최적화와 저품질의 진실을 밝혔다. [1] 하지만 블로거들에게 그리 만족스럽지는 않은 포스팅이라고 할 수 있다. 왜냐하면 블로그 최적화와 저품질에 관한 명쾌한 해답 그런 것은 없기 때문이다. 결국 블로거들의 멘탈만 붕괴시킨 꼴. 망했어요

5 소울컴퍼니 출신의 2인조 힙합 듀오

화나와 칼날이 소울컴퍼니의 첫 번째 레이블 앨범인 The Bangerz에서 첫 선을 보인 힙합 듀오다. 화나의 말에 따르면 프로젝트 그룹에 가까웠다는 듯. 라임 몬스터 화나와 그에 못지 않았던 칼날의 날카로운 랩핑이 리스너들에게 깊은 인상을 심어줬지만, 칼날이 얼마 있지 않아 음악활동을 줄이면서 자연스럽게 화나 솔로로 나오는 일이 많아졌다. 현재는 주로 화나 혼자 활동을 하고 있으며, 칼날은 2009년 프로듀서 콤마의 앨범에 수록한 주변인이라는 곡을 마지막으로 음악 활동을 접었다.

6 비디오 게임에서의 최적화

많은 사람들이 최적화가 얼마나 잘 되어 있느냐에 신경을 쓰지만 최적화가 잘 되어있는 게임이라고 해서 더 재미있는 게임이라고 하기는 어렵다. 다만 최적화를 더 잘 한 만큼 타 게임보다 더 많은 요소를 플레이어에게 전달할 수 있고 그만큼 더 신경을 썼다는 점에서 높이 평가할 만 하다. 최적화를 하는 만큼 비용과 시간이 소모되므로 개발자들은 항상 딜레마에 빠진다. 최적화를 더 많이 하면 사양이 낮아지니 더 많은 유저들이 플레이 할 수 있을 것이고, 최적화를 적게 해서 더 이른 시일 내에 게임을 발표하면 비용을 더 적게 들이고 출시를 할 수 있다. 비용을 아끼려 후자를 선택한 회사들이 항상 욕을 먹는다 요즘에는 PC 사양이 점차 상향평준화 되어가고 있어서 최적화에 대해서 이전보다는 관대해진 편이긴 하나, FPS를 즐겨보는 유저들에게는 아직까지 상당히 중요한 요소다.

기본적으로 최적화와 자유도는 양립될 수 없는 것으로 평가받는다. 실제로 극악한 최적화로 욕을 먹었던 크라이시스, GTA 4[17] 등의 게임은 오픈월드 내지는 샌드박스 게임이고, 반대로 최적화가 상당히 잘 되어있다고 평가받는 하프라이프 2, 콜 오브 듀티 시리즈, 크라이시스 2의 경우는 일직선 진행을 따라가는 레일 슈터에 가까운 게임이다.
  1. 개적화라고 하기도한다.
  2. 이건 애플이 소프트웨어와 하드웨어를 동시에 디자인하기 때문이다. 그래서 최적화에는 엄청난 강점을 보이는 기업이고 눈으로 보면 그리 고스펙이 아닌 듯 한데 거의 최대한의 퍼포먼스를 뽑아낼 때가 많다.
  3. 단, 윈도우로 나오는 프로그램은 제외. 애플에서 내놓은 윈도우 프로그램은 발적화도 모자라서 악성코드급인 경우도 있다. 자세한 것은 아이튠즈퀵타임 플레이어 항목 참조.
  4. 닌텐도가 서드파티에게 개발시 필요한 최적화 기술을 알려주지 않아 그렇다는 말이 있다. 정확히 아는 분이 수정바람.
  5. 시중엔 도데카(12)코어까지 나왔는데도 펜티엄급 프로세서를 사용한다. 최신 CPU일수록 성능은 좋은 대신 수명과 내구는 떨어지는 경향이 있다.
  6. 회로 선폭이 좁아질수록 집적도와 속도가 향상되지만 물리적인 내구성은 당연히 취약해질 수 밖에 없다. 이런 이유로 선폭이 굵은 구식 회로 설계를 한 예전 CPU를 쓰는 것이다. 물론 상용 CPU를 그대로 쓰는 것이 아니라, 회로 구조를 유지한 채 웨이퍼의 재료로 실리콘 대신 튼튼한 사파이어(Silicon on Sapphire)를 사용하는 등 여러가지 방식으로 회로의 내구성을 향상시키는 마개조를 한다. 이런 처리를 거친(Radiation-Hardened) 녀석들은 속도를 일부 희생하는 대신 통상 실리콘 소자 쯤은 순식간에 망가뜨리는 우주 배경 방사선을 맞아도 정상 작동하는 괴물같은 내구성을 자랑한다.
  7. 다만 이는 컴퓨팅파워가 남아돌고 CPU수명이 극도로 짧아진 현대의 상황이며, 앞에서 예로 든 보이저호에는 적용되지 않는다. 보이저호가 발사된 것(1977년)은 인텔에서 8086을 발표(1978년)하기도 전의 일이라는 점을 고려하면 그 크기에 그 정도 스펙이면 당시로서는 상당히 훌륭한 수준이었다. 부족한 컴퓨팅 파워로 성능과 신뢰도를 얻어내기 위해 높은 수준의 최적화를 한 것은 맞지만.
  8. 충분히 빠르다면 튜닝하는게 오히려 해가 된다고 하는 조언이 있다.
  9. 단, 이는 양날의 검이 될 수 있는데 CPU는 데이터를 1Word 단위로 처리한다. 이 크기를 벗어나는 데이터를 처리하는 과정에서는 오버헤드가 발생하게 되는데, 이는 1Word 단위보다 작은 char, byte, short 등에도 적용된다. 즉, 메모리 효율성과 접근처리 시간 효율성 중에서 선택을 해야 하는 것이다. 예상되는 값의 크기가 낮다고 해서 무조건 작은 데이터형을 쓰는 것은 아니란 것.
  10. 이럴때 저사양 옵션 등을 따로 해주지 않으면 플레이 자체가 불가능하다.
  11. 맵상의 NPC나 배경 오브젝트.
  12. 하프라이프 텍스처 에디터중 하나인 Wally는 해당 게임의 텍스처 묶음에 24비트 텍스처를 넣으면 자동으로 256색으로 변환해 준다. 만약 그런게 없으면 포토샵에서 텍스처마다 일일이 index color를 해줘야 한다.
  13. 밸브 역시 하프라이프 제작 당시의 프레임 저하 노하우를 포탈2에서도 발휘했는데 구획별로 나눠 잦은 맵 로딩, 떨어진 건물 파편들이 특히 보스전처럼 연산이 많이 필요한 경우 몇 초 뒤에 소멸하게끔 처리한 것 등이 대표적. 현재 한국 게임 중 이 문제로 유명한 것은 클로저스. 그러나 이 쪽은 간담회에서도 수정이 쉽지 않은 부분이라는 소리를 하며 개선의 여지를 생각치 않아 비판이 크다.
  14. 예컨대 집 모델이 굴뚝과 지붕, 문 등으로 분할된 것. 방사능 작업실에선 분할화 등으로 칭한다.
  15. 해머(하프 라이프)의 경우엔 맵상에서 힌트나 스킵 브러쉬, 애리어 포털 등을 배치해 건너편 사물을 임의적으로 안 보이게 만들 수 있다.
  16. 일정 수준 이상의 품질을 가진 글 약 40개 이상, 블로그 운영 기간 약 35일 이상
  17. 물론 GTA 4의 경우는 애초에 PC 이식에서부터 문제가 있었다.