정적 코드 분석이 GameDev 산업에서 어떻게 도움이되는지

( 2020 년 12 월 4 일)

게임 산업은 끊임없이 진화하고 있으며 속도가 빠른 총알보다 빠르게 발전하고 있습니다. 산업의 성장과 함께 개발의 복잡성도 증가합니다. 코드 기반이 점점 더 커지고 버그도 증가하고 있습니다. 따라서 현대 게임 프로젝트는 코드 품질에 특별한주의를 기울여야합니다. 오늘은 코드를 좀 더보기 좋게 만드는 방법 중 하나 인 정적 분석과 실제로 PVS-Studio가 다양한 크기의 게임 프로젝트 개발에 어떻게 도움이되는지 살펴 보겠습니다.

“최근 프로그래머로서 제가 한 가장 중요한 일은 정적 코드 분석을 적극적으로 추구합니다. 제가 방지 한 수백 가지 심각한 버그보다 더 가치있는 것은 소프트웨어 안정성과 코드 품질을 보는 방식에 대한 사고 방식의 변화입니다. ”— John Carmack

우리는 수년 동안 주요 게임 개발자와 협력 해 왔으며이 기간 동안 게임 산업에 흥미롭고 유용한 일을 많이 할 수있었습니다. 게임 업계의 고객 목록 을 고려하면 그리 놀라운 일이 아닙니다. 우리는 고객을 적극적으로 지원합니다. PVS-Studio를 자체 개발 프로세스에 통합하고, 분석기에서 발견 된 오류를 수정하고, 특수한 사용자 지정 기능을 만들기까지합니다.

또한 우리는 많은 독립적 인 개발을 수행합니다. GameDev 방향의 분석기는 물론 PVS-Studio를 홍보하여 ​​사람들에게 다양한 비디오 게임에서 발견 한 흥미로운 오류를 알려줍니다.

물론 흥미로운 이야기가 있습니다. 이 문서에서는 이러한 몇 가지 사례를 다룹니다.

PVS-Studio 및 Unity

제품을 홍보하는 방법 중 하나는 진행중인 프로젝트 확인에 대한 기사를 작성하는 것입니다. 누구나이 기사에서 혜택을 볼 수 있습니다. 독자는 익숙한 프로젝트에서 비정상적인 오류를 확인하고 새로운 것을 배울 수 있습니다. PVS-Studio 팀은 실제 코드에서 수행 한 작업을 보여줄 수있는 기회를 얻습니다. 따라서 프로젝트 개발자는 오류에 대해 배우고 미리 수정할 수 있습니다.

Unity에 대한 첫 번째 주요 지식이있었습니다. 2016 년에이 게임 엔진의 개발자가 공식 저장소에서 여러 구성 요소, 라이브러리 및 데모의 소스 코드를 열었습니다. 당연히 그런 유혹적인 사건을 지나칠 수 없었고 게시 된 코드를 확인하는 기사를 쓰고 싶었습니다.

그런 다음 Unity3D 코드가 있다는 것을 알게되었습니다 (당시 엔진은 그렇게 불 렸습니다). 매우 높은 품질이었습니다. 그러나 여전히 우리는 그것에 대해 상당히 많은 심각한 오류를 발견 할 수있었습니다. 기사 를 작성하기에 충분했습니다.

2 년 후 또 다른 일이 발생했습니다. Unity 개발자가 엔진의 코드를 열고 편집기 자체. 그리고 이전과 마찬가지로 우리는 그것을 알아 차리지 못하고 엔진의 소스 코드를 확인했습니다. 그리고 그것은 아무것도 아닙니다. 우리는 또한 매혹적인 결점의 무리 를 발견했습니다.

동시에 우리의 의도는 단순히 글쓰기를 넘어선 것입니다. 조항. 우리는 PVS-Studio에서 계속 작업하고 있으며 GameDev는 우리 개발에서 가장 중요한 영역 중 하나입니다. 따라서 Unity 게임 개발자가 프로젝트에 대한 최상의 분석을 얻을 수 있기를 바랍니다.

Unity 프로젝트 분석의 품질을 개선하기위한 단계 중 하나는 Unity 스크립팅 API에 정의 된 메서드에 대한 주석을 작성하는 것입니다. .

메소드 주석은 PVS-Studio에서 사용되는 특수 메커니즘입니다. 사용자는 특정 분석법에 대한 모든 필요한 정보를 분석기에 제공 할 수 있습니다. 분석기 개발자 자신 (예 : 당사)이 특수 코드로 작성합니다.

이 정보는 완전히 다양한 종류가 될 수 있습니다. 예를 들어 메서드가 전달 된 매개 변수에 미치는 영향, 메모리를 할당 할 수 있는지 여부, 처리해야하는 값을 반환하는지 여부 등이 있습니다. 따라서, 주석은 분석기가 메소드의 로직을 더 잘 이해할 수 있도록하여 새롭고 더 복잡한 오류를 감지 할 수 있도록합니다.

우리는 이미 수많은 주석을 작성했습니다 (예 : 시스템의 메소드에 대해). 그리고 Unity Scripting API의 메서드 주석을 추가하게되어 기뻤습니다.

평가를 통해 주석 목록을 확장하기 시작했습니다. 총 몇 개의 방법이 있습니까? 어떤 것이 먼저 주석을 달아야합니까? 전체적으로 많은 방법이 있었기 때문에 우리는 가장 자주 사용되는 방법에 주석을 달아 시작하기로 결정했습니다.

이렇게 인기있는 방법을 찾고있었습니다. 먼저 Unity 기능을 사용하는 GitHub에서 프로젝트 풀을 수집 한 다음 Roslyn 기반의 자체 작성 유틸리티를 사용하여 호출을 계산했습니다. 그 결과 가장 자주 사용되는 클래스 목록을 얻었습니다.

  • UnityEngine.Vector3
  • UnityEngine.Mathf
  • UnityEngine.Debug
  • UnityEngine.GameObject
  • UnityEngine.Material
  • UnityEditor.EditorGUILayout
  • UnityEngine.Component
  • UnityEngine.Object
  • UnityEngine.GUILayout
  • UnityEngine.Quaternion

다음으로 유지되었습니다. 이러한 클래스의 메서드에 주석을 달 수 있습니다. 테스트 프로젝트를 만들고 문서를 파헤쳐 이러한 방법에 대한 정보를 가능한 한 많이 얻었습니다. 예를 들어, 프로그램이 어떻게 작동하는지 확인하기 위해 다양한 인수로 null 을 전달하려고했습니다.

이러한 확인 과정에서 때때로 문서화되지 않은 흥미로운 정보를 발견했습니다. 엔진에서 몇 가지 주목할만한 버그도 발견했습니다. 예를 들어 다음 코드를 실행할 때 :

MeshRenderer renderer = cube.GetComponent();
Material m = renderer.material;
List<int> outNames = null;
m.GetTexturePropertyNameIDs(outNames);

Unity 편집기 자체가 충돌합니다 (최소 버전 2019.3.10f1에서). 물론 누구나 그러한 코드를 작성할 가능성은 거의 없습니다. 그래도 이러한 스크립트를 실행하면 Unity 에디터가 충돌 할 수 있다는 사실이 궁금합니다.

그래서 주석을 작성했습니다. 분석을 실행 한 후 즉시 새로운 트리거링을 발견했습니다. 예를 들어 분석기가 GetComponent 메소드에 대한 이상한 호출을 감지했습니다.

void OnEnable()
{
GameObject uiManager = GameObject.Find("UIRoot"); if (uiManager)
{
uiManager.GetComponent();
}
}

Analyzer 경고 : V3010 GetComponent함수의 반환 값을 활용해야합니다. — 현재 UIEditorWindow.cs 추가 22

GetComponent 메서드는 기한이 있더라도 특정 값의 반환을 의미합니다. 그 이름에. 이 값을 어떤 방식 으로든 사용해야한다고 가정하는 것이 논리적입니다. 이제 새로운 주석 덕분에 분석기는이 메소드에 대한 이러한 “무인”호출이 논리적 오류를 나타낼 수 있음을 알고 이에 대해 경고합니다.

이것은 우리 세트에 나타난 유일한 경고가 아닙니다. 새 주석을 추가 한 후 프로젝트를 테스트하십시오. 이 기사를 너무 크게 만들지 않도록 나머지는 인용하지 않겠습니다. 가장 중요한 점은 이제 PVS-Studio를 사용한 Unity 프로젝트 개발을 통해 버그없이 훨씬 더 안전하고 깔끔한 코드를 작성할 수 있다는 것입니다.

Unity 메서드에 대한 주석 작업에 대해 자세히 알아 보려면, 다음은 기사입니다. PVS-Studio 분석기가 Unity 프로젝트에서 더 많은 오류를 찾기 시작한 방법 .

Unreal Engine 4

2014 년 언리얼 개발자가 엔진 4가 엔진의 소스 코드를 열었으므로 해당 프로젝트를 지나칠 수 없었고 이에 대한 기사 도 작성했습니다. 엔진 개발자는 기사를 좋아하고 발견 한 오류를 수정했습니다. 하지만 이것만으로는 충분하지 않았고 분석기 라이선스를 Epic Games에 판매하기로 결정했습니다.

Epic Games는 PVS-Studio로 엔진을 개선하는 데 관심이 있었기 때문에 다음 사항에 동의했습니다. : 분석기가 경고를 표시하지 않도록 자체적으로 언리얼 엔진 코드를 수정하고, 에픽 게임즈 직원이 라이선스를 구매하고 추가로 수행 한 작업에 대해 보상합니다.

모든 경고가 표시되어야하는 이유 결정된? 사실은 오류가 발생할 때 바로 수정하여 정적 분석의 이점을 극대화 할 수 있다는 것입니다. 처음으로 프로젝트를 확인하면 일반적으로 수백 (때로는 수천) 경고가 표시됩니다. 이러한 모든 분석기 트리거링 중에서 새로 작성된 코드에 대해 발행 된 경고를 쉽게 잃을 수 있습니다.

첫눈에이 문제는 매우 쉽게 해결할 수 있습니다. 앉아서 전체 보고서를 살펴보기 만하면됩니다. , 점차적으로 오류를 수정합니다. 그러나이 방법은 더 직관적이지만 시간이 걸릴 수 있습니다. 억제 파일을 사용하는 것이 훨씬 더 편리하고 빠릅니다.

억제 파일은 숨길 수있는 PVS-Studio의 특수 기능 입니다. 특수 파일의 분석기 경고. 그러나 숨겨진 경고는 후속 로그에 표시되지 않습니다. 개별적으로 볼 수 있습니다.

첫 번째 확인 후 많은 트리거가 발생한 후 몇 번의 클릭만으로 감지 된 모든 경고를 억제 파일에 추가 할 수 있습니다. 다음 확인 후 단일 항목없이 깨끗한 로그를 얻을 수 있습니다.

이제 이전 경고가 더 이상 로그에 포함되지 않으므로 새 경고가 나타나면 즉시 쉽게 감지 할 수 있습니다. 작업 순서는 다음과 같습니다. 코드 작성 –> 분석기로 확인 –> 새 경고 발견 –> 오류 수정. 이것이 분석기 사용을 최대한 활용하는 방법입니다.

동시에 억제 파일의 경고를 잊지 마십시오. 이전과 마찬가지로 주요 오류 및 취약성에 대한 경고를 포함 할 수 있습니다. 따라서 이러한 경고로 돌아가서 주기적으로 경고 수를 줄여야합니다.

의심 할 여지없이이 시나리오는 편리하지만 Epic Games의 개발자는 코드를 즉시 수정하기를 원했기 때문에 우리에게 할 일입니다.

그리고 우리는 일해야합니다. 프로젝트 코드를 확인한 후 1821 개의 Level_1 및 Level_2 경고를 발견했습니다. 이렇게 많은 양의 경고를 구문 분석하려면 심각한 작업이 필요하며이 전체 프로세스를 용이하게하기 위해 CI 서버에 지속적인 코드 분석을 설정했습니다.

다음과 같았습니다. 매일 밤 서버에서 현재 언리얼 엔진 4 버전이 빌드되었고 빌드 직후 분석이 자동으로 시작되었습니다. 따라서 우리 직원들이 아침에 출근했을 때 항상 분석기로부터 새로운 보고서를 받았으며,이를 통해 경고 제거 진행 상황을 추적 할 수있었습니다. 또한이 시스템을 통해 서버에서 수동으로 실행하여 언제든지 빌드 안정성을 확인할 수있었습니다.

전체 프로세스는 17 일 (근무일 기준)이 걸렸습니다. 오류 수정 일정은 다음과 같습니다.

사실,이 일정은 우리의 작업을 완전히 반영하지 않습니다. 모든 경고를 수정 한 후 최신 pull 요청을 수락 할 때까지 이틀을 더 기다렸습니다. 이번에는 언리얼 엔진의 최신 버전이 자동으로 확인되었고 새로운 코드로 계속 업데이트되었습니다. 그래서, 무슨 일이 일어 났을까요? 이틀 동안 PVS-Studio는 코드에서 4 개의 오류를 더 발견했습니다! 그중 하나가 중요했고 잠재적으로 정의되지 않은 동작으로 이어질 수있었습니다.

물론 이러한 오류도 수정했습니다. 그 시점에서 언리얼 엔진 개발자는 한 가지만 남았습니다. 우리가했던 것처럼 자신의 위치에 자동 분석을 설정하는 것입니다. 그 순간부터 그들은 방금 작성한 코드에 대해 매일 발행되는 경고를보기 시작했습니다. 이를 통해 개발 초기 단계 에 나타난 코드의 오류를 바로 수정할 수있었습니다.

언리얼 엔진 코드 작업 방법에 대한 자세한 내용은 공식 Unreal Engine 블로그 또는 웹 사이트 .

분석 다양한 게임

다양한 오픈 프로젝트를 확인하고 그에 대한 기사를 쓰나요? 이제 게임 프로젝트에 대한 비슷한 기사가 많이 있습니다! VVVVV , 우주 엔지니어 , Command & Conque r, osu! 및 심지어 (초기 기사) Doom 3 . 또한 비디오 게임 업계에서 가장 흥미로운 소프트웨어 버그의 상위 10 을 컴파일했습니다.

그래서 우리는 아마도 대부분의 잘 알려진 오픈 소스 엔진. Unity 및 Unreal Engine 4 외에도 Godot , Bullet , Amazon Lumberyard , Cry Engine V 및 기타 많은 제품이 우리의 시야에 들어 왔습니다.

이 모든 것의 가장 좋은 점은 우리가 설명한 많은 버그가 나중에 프로젝트 개발자가 직접 수정했다는 것입니다. 개발중인 도구가 세상에 실제적이고 가시적이며 가시적 인 이점을 가져다 준다는 사실을 느끼는 것이 좋습니다.

비디오 게임 개발과 관련된 모든 기사 목록을 블로그의 특별 페이지

결론

이 시점에서 내 기사가 끝납니다. 버그와 오류없이 코드를 정리하고 올바르게 작동하기를 바랍니다!

정적 분석 주제에 관심이 있으십니까? 프로젝트에 오류가 있는지 확인하고 싶으십니까? PVS-Studio 를 사용해보세요.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다