클라이언트 개선 작업: 2021년 현황 및 향후 계획

크로미엄 임베디드 프레임워크 업데이트를 준비하는 동시에 다른 기회도 살펴보고 있습니다.

앞서 리그 오브 레전드 클라이언트의 성능과 안정성을 개선하는 작업에 대해 꾸준히 소식을 전해드리기로 약속한 바 있습니다.

오늘 글은 이 시리즈의 7번째 블로그 글입니다. (1번째, 2번째, 3번째, 4번째, 5번째, 6번째 글은 각각의 링크에서 확인할 수 있습니다.)

요약: 2021년 1분기 동안 크로미엄 임베디드 프레임워크 업데이트를 위한 초석을 다지는 작업을 진행해왔습니다. 아직 완료되지 않은 작업이 남아있기는 하지만, 2분기 말까지 크로미엄 임베디드 프레임워크를 새로운 버전으로 업데이트할 계획이며 업데이트가 완료되면 플레이어 경험이 다방면에서 개선됩니다.

크로미엄 임베디드 프레임워크 업데이트

지난번에 말씀드린 대로 현재 진행 중인 주요 작업으로는 클라이언트에서 사용하는 크로미엄 임베디드 프레임워크(Chromium Embedded Framework, 이하 CEF)의 업데이트가 있습니다. CEF는 리그 오브 레전드 클라이언트 아키텍처의 기반이 되는 웹 브라우저입니다. 저번에는 CEF의 중요성을 충분히 강조하지 않았습니다. 더 직설적으로 말씀드리자면, 클라이언트 개선을 위한 단일 변경사항 중 CEF 업데이트가 가장 효과적입니다. 직접적인 이점을 안겨줄 뿐만 아니라 다른 개선사항을 가능하게 해준다는 점에서 가장 우수합니다.

CEF를 마지막으로 업데이트한 때는 2019년 11월입니다(버전 74). 이번 글을 작성한 시점 기준으로 최신 버전은 CEF 90입니다. CEF를 업데이트하면 아래와 같은 이점이 있습니다(CEF 90을 목표로 작업 중입니다).

  • 클라이언트 충돌 감소

    • 구 버전의 CEF는 일부 하드웨어에서 문제를 일으킵니다. 초기 데이터에 따르면 대다수의 충돌은 구 버전의 CEF 때문에 발생합니다. 업데이트가 완료되면 플레이어가 겪는 충돌이 줄어들 거라는 강한 확신을 가지고 있습니다.

  • 호환성 개선

    • CEF 팀은 새로운 버전을 다양한 하드웨어 조합과 철저하게 테스트합니다. 이러한 테스트의 혜택은 리그 오브 레전드 클라이언트에 무상으로 돌아옵니다.

  • 웹소켓(WebSocket) 성능 개선

    • 리그 오브 레전드 클라이언트는 크게 두 부분으로 나뉩니다. 플레이어가 사용하는 시각적 애플리케이션인 ‘프론트엔드’가 있고 이보다 훨씬 작고 수면 아래에서 작동하는 ‘기반’이 있습니다. 기반의 역할은 서버에서 데이터를 불러오고 플레이어에게 알맞은 내용이 보이도록 클라이언트에서 필요한 모든 정보를 관리하는 것이며 예시로 아래와 같은 작업을 수행합니다.

      • 게임 중에는 클라이언트가 꺼지도록 설정한 플레이어가 게임에 진입하면 게임이 끝날 때까지 프론트엔드를 종료시킵니다.

      • 플레이어가 컬렉션 탭을 열었을 때 어떤 챔피언을 보유하고 있는지 확인합니다.

    • 웹소켓은 근본적으로 프론트엔드와 기반을 이어주는 배관과 같습니다. 새로운 버전의 CEF에서는 배관이 더 크고 직선에 가깝기 때문에 더 많은 데이터를 더 빠르게 전송할 수 있습니다. 웹소켓 개선은 오래된 하드웨어를 사용하는 경우 특히 게임 종료 화면, 챔피언 선택 등 데이터 전송이 대량으로 이루어지는 곳에서 성능 향상으로 이어질 수 있습니다. CEF 버전을 비교해보니 최대 속도 상승 배율은 아래와 같습니다.

      • Windows에서는 4.1배까지

      • Mac에서는 7.8배까지

  • 애니메이션 성능 개선

    • 게임 종료 화면의 경험치 바처럼 데이터를 기반으로 애니메이션이 절차적으로 이루어지는 경우에(많은 애니메이션이 이러합니다) 특히 효과적입니다. 엄밀히 말하면 이러한 애니메이션은 메모리 누수의 일종이기 때문에 클라이언트를 장시간 끄지 않았을 때의 전반적인 성능도 개선됩니다.

  • 프레임률 개선 - ‘굼뜬’ 느낌 완화 및 클릭 응답 속도 개선

  • 개발자 사용 용이성(속도와 안정성) 개선

    • 클라이언트를 장시간 끄지 않았을 때 메모리 누수가 발생하지 않도록 하는 방법 추가

    • 클라이언트에서 화면에 무엇이 렌더링되기까지 걸리는 시간에 대한 데이터를 더 잘 파악할 수 있게 해주는 새로운 지표

  • CPU 사용량 개선

    • 현재 클라이언트에 적용된 CEF 버전(74)에는 ‘네트워크 서비스’라는 새로운 기능이 포함되었습니다. 이는 모든 네트워크 요청이 CPU에서 하나의 스레드로 처리되도록 해서 다른 스레드가 콘텐츠 불러오기 등의 작업에 활용될 수 있게 하는 기능입니다. 지난번에 CEF를 업데이트할 당시 완전히 새로운 기능이었으며 테스트해볼 시간이 없었기 때문에 현재 클라이언트에서는 네트워크 서비스를 사용하지 않습니다. 이번에 CEF 업데이트를 진행하며 리그 오브 레전드에 네트워크 서비스를 적용하기 위한 계획을 세우기 시작할 수 있습니다.

  • 자바스크립트 성능 개선

새로운 버전의 크로미엄에는 자바스크립트를 처리할 때 사용하는 V8 엔진을 대폭 개선하는 변경사항이 포함됩니다. 호환성 개선과 마찬가지로 새로운 버전으로 업데이트하기만 해도 누릴 수 있는 이점입니다.

지난 분기 동안 기존 웹 컴포넌트(동영상 삽입, 팝업 알림 등을 위한 웹사이트 기능)를 새로운 CEF 버전과 호환되는 버전으로 업그레이드하는 데 집중했습니다. 이는 CEF를 업데이트했을 때 문제가 생기지 않도록 하기 위함입니다. 업그레이드를 매끄럽게 진행하고자 했으니 지난 몇 번의 패치에 걸쳐 웹 컴포넌트 업그레이드를 여러 번 진행했다는 사실을 눈치채신 분이 없었기를 바랍니다. 이러한 업그레이드는 대량의 코드에 영향을 주기 때문에 테스트에서 놓친 작은 문제가 일부 남아있다는 점을 인지하고 있으며, 발견하는 대로 수정하고 있습니다

웹 컴포넌트 업그레이드는 몇 주 뒤에 완료될 예정입니다. 그다음 CEF 업데이트 작업에 착수해 2021년 7월 말까지 마무리할 계획입니다.

커뮤니티 창

지난번에 커뮤니티 창에도 집중하고 있다고 말씀드렸는데요. 장기적으로는 커뮤니티 창을 ComponentsJS(구식 아키텍처)에서 엠버로 전환할 계획입니다. 엠버로 전환하는 작업은 CEF 업데이트 진행에 집중하는 동안 보류하게 되었지만, 전환에 필요한 초기 단계는 마쳤으며 CEF 업데이트가 완료되면 작업을 재개하고자 합니다.

CEF 업데이트 준비에 집중하기 전에 해결한 커뮤니티 패널 관련 주요 문제는 아래와 같습니다.

  1. 커뮤니티 창이 연결되지 않는 문제
  2. 친구 목록이 로딩되지 않고, 친구의 상태가 틀리게 표시되고, 친구가 보이지 않는 문제
  3. 친구가 일반 게임 중일 때 플레이어 카드에서 랭크 정보가 사라지는 문제
  4. 클라이언트 시작 시 연결이 끊어졌다가 슬픈 포로가 표시되었다가 친구 목록을 불러오는 중으로 바뀌는 문제

메모리 사용량과 자바스크립트 오류에 대한 소식

또한 클라이언트를 종료하지 않은 채 게임을 플레이했을 때의 메모리 사용량을 계속 주시해왔습니다. 기쁘게도 10.25 패치 이후 게임당 메모리 사용량이 거의 30MB 감소했으며 메모리 부족으로 인한 충돌이 계속해서 전반적으로 감소하고 있습니다.

마지막으로 자바스크립트 오류를 짚고 넘어가고 싶습니다. 저번 글에서 말씀드린 라이엇 지역에서 발생한 자바스크립트 오류의 실제 건수에 착오가 있었습니다. 10.25 패치에서는 무려 2억 6,500만 건이 발생했습니다. 그래도 고무적인 사실은 덕분에 문제 해결이 얼마나 시급한지가 더욱더 잘 드러나게 되었으며 플레이어들이 실제로 겪은 오류 건수가 달라진 것이 아니라 측정하는 방식만 달라졌다는 점입니다. 그 후 패치당 오류 건수를 1억 4,000만 건으로 줄였으며 더욱더 줄일 수 있겠다는 확신이 듭니다.

예정된 작업

단기적으로는 CEF 업데이트가 최우선이지만, 업데이트 이후 2021년 중으로 진행하고 싶은 작업에 대한 계획도 세우고 있습니다.

  • 위에서 말씀드린 대로 커뮤니티 창을 엠버로 전환하고자 합니다.
  • 게임 종료 과정을 다시 살펴보고자 합니다. 작년 말부터 올해 초까지 게임 종료 과정의 주요 문제를 몇 가지 해결하기는 했지만, 아직 할 일이 많이 남아있습니다. 클라이언트로 돌아가기까지 걸리는 시간이나 게임 종료 과정에서 일어나는 멈춤 현상에 대한 불만이 여전히 많습니다. 게임 종료 과정을 손보기 시작하면 우선 클라이언트와 게임 엔진 및 서비스의 상호작용을 모두 파악한 뒤 어떻게 하면 경험을 개선할 수 있을지 살펴보고자 합니다. 게임 종료 과정에는 클라이언트 팀의 담당이 아닌 여러 서비스가 관여되기 때문에 다른 팀과 협력하며 공동 수정 작업을 우선적으로 진행할 계획입니다.

  • 챔피언 선택 진입까지 오래 걸리는 문제를 살펴보고자 합니다. 일부 지역에서 많이 제보되는 문제인 만큼 (인터넷 기반시설은 지역마다 다르니) 플레이어의 네트워크 연결과 관련이 있다고 생각합니다. 네트워크 문제에 대해 저희가 할 수 있는 조치는 많지 않지만, 그래도 경쟁 모드 게임플레이 팀과 협력해 클라이언트 내에서 가능한 조치를 통해 모든 플레이어가 적당한 시간 내로 챔피언 선택에 진입할 수 있게 하는 방법이 있는지 찾아볼 예정입니다.

  • 오랫동안 켜두었을 때의 클라이언트 안정성을 살펴보고자 합니다. 작년 말 메모리 누수의 해결이 중점 분야로 떠올랐습니다. 메모리 누수는 게임 플레이 횟수가 늘어날수록, 클라이언트를 오랫동안 켜둘수록 메모리 사용량이 증가하는 문제입니다. 더 종합적인 후속 조치를 하기 위해 몇 번의 게임을 플레이했든 클라이언트를 얼마나 오랫동안 켜두었든 상관없이 방금 로그인했을 때와 같은 경험이 지속되도록 하는 직관적인 방법을 찾아볼 계획입니다. 계속 여기에 몰두하며 더 까다로운 메모리 누수 문제를 처리하는 방안이 나을 수 있지만, 단기적인 해결책과 비교했을 때 무엇이 나을지 살펴볼 필요가 있습니다.


이번 현황은 여기까지입니다! 항상 그렇듯 저희가 진행하는 작업은 대부분 정기적인 플레이어 설문 조사 등 다양한 경로를 통해 받는 피드백을 기반으로 이루어집니다. 앞으로도 계속 클라이언트에서 개선이 가장 시급한 부분, 어떤 변경사항이 경험에 가장 긍정적인 영향을 주었는지 등 많은 피드백 부탁드립니다!