객체지향 언어는 프로그램을 다수의 객체로 만들고, 이 객체들이 서로 상호작용하도록 하는 언어입니다.
그리고 이 방식은 현대에서 컴퓨터와 관련된 여러가지 분야에서 사용되고 있습니다.
그리고 우리가 익히 아는 게임 엔진들 역시 객체지향 언어를 기본으로 하여 작동합니다.
예컨대, Unity Engine은 C#을 기본 베이스로 하고 Unreal Engine은 C++을 기본 베이스로 합니다.
위의 게임 엔진말고도 Godot Engine은 C#과 C++을 양쪽 다 지원하고 Renpy는 파이썬을 기본으로 합니다.
그런데 보다보면 뭔가 이상함을 느끼게 됩니다.
각 게임 엔진 별로 왜 서로 다른 언어를 사용할까요?
그 이유는 객체 지향 언어 안에서도 서로 구분이 이뤄지기 때문입니다.
1) 객체 지향 언어의 비교
- Native 언어 -> 대표주자 : C++
컴파일, 링크, 빌드의 3가지 과정을 거치는 언어를 일컬어 Native 언어라고 합니다.
인간이 사용하는 고급 언어를 컴퓨터가 사용하는 저급 언어로 바꿔주는 절차를 가지는 언어를 일컫습니다.
우리는 코드를 보며 이해할 수 있지만, 컴퓨터는 이해하지 못합니다.
이런 상황에서 통역을 해주는 과정을 거치는 언어를 Native 언어라고 이해하시면 됩니다.
이러한 Native 언어의 특징으로는 다음과 같습니다.
- 메모리를 직접 제어 : 예시) 포인터
- Cache의 활용 극대화 : 데이터 접근 시간 단축 및 메모리 접근 패턴 최적화
- 저수준 API의 직접 호출
- 복사 작업의 최소화
이러한 Native 언어를 한 문장으로 표현하면
안정성 < 성능 입니다.
그러나 이 경우에 발생하는 문제들이 있습니다.
특히 메모리를 직접 제어한다는 것은 데이터를 손상시킬 수 있는 큰 문제를 불러올 수 있기에
기존의 Native 언어에서 더 발전한 언어들이 등장하게 되었습니다.
- 하이레벨 OOP(Object Oriented Programming) 언어 -> 대표주자 : Java, C#
기존의 C++과 같은 저레벨 OOP 언어의 특징을 극복하고자 등장한 C# 같은 언어는
위험을 감수하면서 프로그래밍의 성능을 가져가기 보다는 대신 안정성을 가져가고자 하였습니다.
이들의 특징으로는 다음과 같습니다.
- 유지보수성 향상 : 인터페이스와 같은 API 들을 지원
- 크래시로부터 보호
- 자동 메모리 관리 : 가비지 컬렉터의 사용
- 고질적 실수 예방
이러한 하이레벨 OOP 언어를 한 문장으로 표현한다면
안정성 > 성능 입니다.
성능보다는 안정성을 택하여 위험을 줄여나가는 것을 택한 것입니다.
위와 같이 객체지향 언어는 그 방식과 설계에 따라 구분지을 수 있습니다.
2) 플레이어 VS 개발자
이제 본론으로 돌아와 게임의 입장에서 생각해 보겠습니다.
게임을 대하는 입장은 2가지로 구분지을 수 있습니다.
바로 플레이어 와 개발자입니다.
플레이어는 게임이 갖고 있는 컴퓨터나 기기에서 아무 문제없이 실행되기를 원합니다.
화려한 스킬과 다채로운 색감, 언제나 재밌는 경험을 선사해야 하는 것이 게임의 역할입니다.
재밌는 경험과 더불어 게임의 진행은 막힘없이 또 문제없이 이뤄져야 합니다.
정리하면 플레이어의 입장에서 게임은 UX를 위해 단일 컴퓨터에서 최대의 성능을 제공해야 합니다.
이제 반대의 시각인 개발자의 시각에서 게임을 다뤄보겠습니다.
구성이 방대해질 수록 더 많은 고객을 만들어낼 수 있으므로 게임의 규모가 커지는 것은 당연합니다.
그리고 준비된 기한안에 작업을 완료하여 출시함으로써 고객의 니즈를 만족시키는 것이 목적입니다.
따라서 게임 개발의 진행과정은 안정적으로 이루어져야만 합니다.
정리하면 개발자의 입장에서 게임은 규모가 커지면 커질수록 방대하고 복잡한 구성을 안정적으로 관리해주어야 합니다.
즉, 게임 개발은 최대 성능을 제공하면서 안정적이어야 한다는 딜레마를 품고 있습니다.
다시 말해 Native 언어와 하이레벨 OOP 언어의 특징을 모두 갖고 있어야 합니다.
3) 언리얼 엔진의 해결책 : 언리얼 C++
언리얼 엔진은 성능을 위해 C++을 기반으로 설계하되, 기존의 C++을 확장해 모던객체지향설계를 가능하게 했습니다.
언리얼 C++은 우리가 이전까지 다뤄온 C++과는 많은 차별점이 있고,
이 차별점이 언리얼 엔진을 안정적이면서 뛰어난 성능을 갖게 해주었습니다.
따라서 언리얼 C++을 이해하여 사용할 줄 안다면 성능과 안정성이라는 두 마리 토끼를 모두 잡을 수 있게 되는 것입니다.
이 포스팅은 언리얼 C++이 사용되는 이유와 언리얼 C++을 배워야 하는 이유를 설명드리고자 글로만 작성되었습니다.
다음 포스팅부터는 코드와 함께 실제 언리얼 엔진 프로젝트로 같이 작성해보겠습니다.
두서 없는 글을 읽어주셔서 감사합니다.
참고할만한 책 : https://www.yes24.com/Product/Goods/65418549
이득우의 언리얼 C++ 게임 개발의 정석 - 예스24
언리얼 엔진 학습에 목말라하는 게임 개발자에게 단비 같은 언리얼 엔진 프로그래밍 책이다. 에픽게임즈 본사의 개발자 프로그램 ‘언리얼 데브 그랜트’를 수상한 저자의 책으로, 언리얼 엔진
www.yes24.com
언리얼 엔진에 관련해서는 이득우 교수님의 책이나 강의를 추천드립니다.
'언리얼 > 언리얼 C++' 카테고리의 다른 글
언리얼 C++ - 언리얼 리플렉션 시스템의 활용 (0) | 2024.06.30 |
---|---|
언리얼 C++ - 언리얼 오브젝트 리플렉션 시스템 ~ CDO (0) | 2024.06.24 |
언리얼 C++ - 언리얼의 문자열 (0) | 2024.06.24 |
언리얼 C++ - 간단한 언리얼 오브젝트 클래스 생성 (0) | 2024.06.17 |
언리얼 C++에 대해 배워보자! - 언리얼 오브젝트 (0) | 2024.06.17 |