C++ 게임의 최적화GPG2권 구경원(돼지고기)6월25일
C++ 게임의 최적화- 프로파일링의 중요성잘못된 코드에 대한 최적화.
최적화를 했는데도 속도가 떨어지는 경우. -자주 호출되는 코드에 대한 최적화.
객체가 필요하게 되기 전까지는 생성하지 말 것void Function(intarg)	{Object obj;if(arg == 0)	return;…}arg가 0 일때에도Object 객체 생성.필요한 선언을 최대한 뒤로 미루자.반복문일 경우는 루프 밖에 객체를 선언하자.
초기화 목록을 사용할 것Class Vehicle{public:Vehicle(const std::string &name)     {          m_Name = name;     }	private:	std::string m_Name;	}Vehicle  생성자호출전string m_Name에 대한 생성자 호출.m_Name = name 의 복사대입 연사자 호출.Vehicle 기본생성자도 메모리에 할당할 수 있다.Class Vehicle{	public:	Vehicle(const std::string &name)		: m_Name(name)	private:	std::string m_Name;	}
후증가 보다는 전증가를 사용할 것x++자기 자신의 복사본을 생성한 후 값을 넘긴다.++x  자기 자신을 증가시킨 후 넘긴다.for 문같은반복문에서는전증가 사용이 좋다.Const int Value = *this;++(*this);Return Value;*this += 1;Return *this;
값을 반환하는 연산자를 피할 것Vector operator+(const Vector &v1, const Vector &v2)V = v1 + v2;Vector의 임시객체를 생성하고 복사(값으로 반환) 하는 추가적인부담을 야기시킨다.Void Vector::Add(const Vector &v1, const Vector &v2)V = v1.Add(v2);첫번째 인자를 즉시 수정하여 사용하기 때문에 임시객체를 반환할 필요가 없다.
가벼운 생성자를 사용할 것- 생성자가 호출될 때 마다 초기화가 필요하지 않는 변수들도 초기화가 일어난다.- 자주 사용되는 행렬이나 벡터는 초기화 함수로 따로 관리하자.자동으로 객체를 복사하고 싶지 않으면 Operator= 를 	private 로 선언하자.- 내부적인 임시객체 생성을 방지하기 위해서 explicit를 선언하는 습관을 들이자.
객체를 미리 할당하고 캐싱할 것게임에서 번번하게 할당, 해제되는 클래스.배열. 리스트. 맵. 등의 자료구조를 이용해서 미리 필요한 데이터를 할당하고 사용이 필요할때에 데이터를 가져와서 사용하고, 사용이 다된 객체는 다시 돌려보낸다.
메모리 관리암시적인 메모리 할당 주의
힙메모리 단편화를 주의하자.- 메모리를 미리 할당하자.
가상 함수가상함수 호출-> 가상함수 테이블 참조 ->멤버함수 포인터얻기-> 멤버함수 호출.추가적인 오버헤드 발생.작고 자주 쓰이는 객체들은 클래스 상속구조를 사용하지 말고 상속 구조에서 독립 시키자.
코드 크기- 실행파일을 최대한 작게 만들자.- 예외를 발생시키는 코드를 제거.- 쓰이지 않는 함수와 클래스를 빌드에서 제외- 컴파일러 최적화 수준을 높게 설정한다.속도보다는 크기에 대한 최적화를 실행하도록 설정한다.- 인라인 함수의 사용 주의.- RTTI와 dynamic_cast의 사용 자제.

[Gpg2권]1.1 c++ 게임의 최적화

  • 1.
    C++ 게임의 최적화GPG2권구경원(돼지고기)6월25일
  • 2.
    C++ 게임의 최적화-프로파일링의 중요성잘못된 코드에 대한 최적화.
  • 3.
    최적화를 했는데도 속도가떨어지는 경우. -자주 호출되는 코드에 대한 최적화.
  • 4.
    객체가 필요하게 되기전까지는 생성하지 말 것void Function(intarg) {Object obj;if(arg == 0) return;…}arg가 0 일때에도Object 객체 생성.필요한 선언을 최대한 뒤로 미루자.반복문일 경우는 루프 밖에 객체를 선언하자.
  • 5.
    초기화 목록을 사용할것Class Vehicle{public:Vehicle(const std::string &name) { m_Name = name; } private: std::string m_Name; }Vehicle 생성자호출전string m_Name에 대한 생성자 호출.m_Name = name 의 복사대입 연사자 호출.Vehicle 기본생성자도 메모리에 할당할 수 있다.Class Vehicle{ public: Vehicle(const std::string &name) : m_Name(name) private: std::string m_Name; }
  • 6.
    후증가 보다는 전증가를사용할 것x++자기 자신의 복사본을 생성한 후 값을 넘긴다.++x 자기 자신을 증가시킨 후 넘긴다.for 문같은반복문에서는전증가 사용이 좋다.Const int Value = *this;++(*this);Return Value;*this += 1;Return *this;
  • 7.
    값을 반환하는 연산자를피할 것Vector operator+(const Vector &v1, const Vector &v2)V = v1 + v2;Vector의 임시객체를 생성하고 복사(값으로 반환) 하는 추가적인부담을 야기시킨다.Void Vector::Add(const Vector &v1, const Vector &v2)V = v1.Add(v2);첫번째 인자를 즉시 수정하여 사용하기 때문에 임시객체를 반환할 필요가 없다.
  • 8.
    가벼운 생성자를 사용할것- 생성자가 호출될 때 마다 초기화가 필요하지 않는 변수들도 초기화가 일어난다.- 자주 사용되는 행렬이나 벡터는 초기화 함수로 따로 관리하자.자동으로 객체를 복사하고 싶지 않으면 Operator= 를 private 로 선언하자.- 내부적인 임시객체 생성을 방지하기 위해서 explicit를 선언하는 습관을 들이자.
  • 9.
    객체를 미리 할당하고캐싱할 것게임에서 번번하게 할당, 해제되는 클래스.배열. 리스트. 맵. 등의 자료구조를 이용해서 미리 필요한 데이터를 할당하고 사용이 필요할때에 데이터를 가져와서 사용하고, 사용이 다된 객체는 다시 돌려보낸다.
  • 10.
  • 11.
    힙메모리 단편화를 주의하자.-메모리를 미리 할당하자.
  • 12.
    가상 함수가상함수 호출->가상함수 테이블 참조 ->멤버함수 포인터얻기-> 멤버함수 호출.추가적인 오버헤드 발생.작고 자주 쓰이는 객체들은 클래스 상속구조를 사용하지 말고 상속 구조에서 독립 시키자.
  • 13.
    코드 크기- 실행파일을최대한 작게 만들자.- 예외를 발생시키는 코드를 제거.- 쓰이지 않는 함수와 클래스를 빌드에서 제외- 컴파일러 최적화 수준을 높게 설정한다.속도보다는 크기에 대한 최적화를 실행하도록 설정한다.- 인라인 함수의 사용 주의.- RTTI와 dynamic_cast의 사용 자제.