KoreanFoodie's Study

언리얼 코딩 표준 간단 리뷰 본문

Game Dev/Unreal C++ : Study

언리얼 코딩 표준 간단 리뷰

GoldGiver 2022. 10. 14. 16:17

언리얼 코딩 표준

  • 명명규칙 : 파스칼케이스, 접두사(U - UObject 상속 /A - AActor 상속 /S - SWidget 상속 / C - 에픽의 개념이 유사 / b - 부울 변수 / F - 그 외 대부분) 
  • 포터블 C++ 코드 : bool(크기 추정 금지, BOOL 은 컴파일 안됨), TCHAR, uint8, int8, uint(16, 32, 64 버전) , float, double, PTRINT(포인터를 가질 수 있는 정수, 크기 추정 금지)
  • 표준 라이브러리 사용 : 표준 컨테이너와 스트링은 interop 코드를 제외하고 사용하지 말아야 함
  • 코멘트 : 코드는 구현을 설명하고, 코멘트는 그 의도를 설명한다.
  • 최신 C++ 언어 문법 : static_assert 사용, override 및 final 사용 권장. nullptr, 범위 기반 for, 람다 사용 권장. enum 대신 enum 클래스 사용.
  • auto 키워드의 사용을 '지양'한다 : 변수 타입에 람다를 바인딩해야 하는 경우, 복잡한 이터레이터 타입을 사용하는 경우, 템플릿 코드에서 표현식의 타입을 쉽게 식별할 수 없는 경우에 사용한다.
  • 이동 시맨틱 : MoveTemp 를 통해 명시적으로 호출 가능.
  • 코드 포맷 : 단일 구문에도 중괄호를 새 줄에 사용.
  • 네임스페이스 : UHT 에는 네임스페이스가 지원되지 않아 UCLASS, USTRUCT 등을 정의할 때는 사용 불가. 새 API 는 UE:: 네임스페이스에 배치(이상적으로는 중첩된 네임스페이스 - UE::Audio::). Private 일 경우 UE::Audio::Private 같이 사용. Using 선언은 전역 범위에서 사용하지 않기. 네임스페이스 안에서 사용시 일관성 지키기. 매크로는 네임스페이스 내에 있을 수 없지만, 대신 UE_ 접두사 사용(e.g. UE_LOG).
  • 물리적 종속성 : 파일 이름에 접두사 붙이는 것 피하기. #pragma once 사용 등, 다른 헤더의 표준 라이브러리 헤더 include 하지 않기. 전방 선언 적극 활용하기. 다른 헤더를 통해 간접적으로 의존하지 않고 필요한 것을 전부 include 하기(가급적 필요한 특정 부분만). 큰 함수는 논리적 하위 함수로 나누기(컴파일러 최적화). 인라인 함수의 남용을 주의(사용하지 않는 파일에 있어도 강제로 리빌드). FORCEINLINE 에는 더 보수적이어야 함(코드와 로컬 변수가 호출 중 함수로 확장되어, 큰 함수에서 발생하는 것과 동일한 빌드 시간 문제가 생김).
  • 캡슐화 : 클래스 멤버는 클래스의 public/protected 인터페이스 일부가 아니면 거의 항상 프라이빗으로 선언. 더 이상 파생시키지 않는 클래스는 final 로 선언.
  • 일반적인 스타일 문제 : 변수의 초기화를 최대한 늦추기. 메서드는 하위 메서드로 분할. 컴파일러 경고는 반드시 없애기. 파일 끝에 빈 줄이 있어야 gcc 와 함께 제대로 작동함. 스트링 리터럴 주변에 항상 TEXT() 매크로 사용(리터럴에서 FStrings 생성하는 경우 추가 비용). 핫 리로드 기능을 고려(리로드 동안 변할 확률이 있는 함수에는 인라인 또는 템플릿 사용하지 않기). 리로드 동안 그대로 남아 있을 것에만 statics 사용. 포인터와 레퍼런스 사용시 다음과 같이 사용(e.g. FShaderType* Ptr). 헤더에 특수한 스태틱 변수를 정의하지 않기(해당 헤더가 포함된 모든 이동 단위로 인스턴스 컴파일; 대신 extern 을 사용).
  • 플랫폼별 코드 : 플랫폼별 코드는 적합한 이름의 하위 디렉터리의 소스 파일에 추상화 및 구현(e.g. Engine/Platforms/[PLATFORM]/Source/Runtime/Core/Private/[PLATFORM]PlatformMemory.cpp). [PLATFORM] 하위 디렉터리 존재 여부와 상관없이 코드가 컴파일 되어야 함(크로스 플랫폼 코드가 플랫폼별 코드에 종속되면 안 됨; 예시).

 

 

Comments