객체를 재활용하지 말고, 소멸 후 다시 생성해서 사용할 것

많은 게임 프로그래머가 최적화에 너무 집착하는 경향이 있습니다. 그 대표적인 예가 객체를 소멸시키고 생성하는 것에 거부감을 갖는 것입니다. 객체를 소멸시키고 생성하는 부하가 너무 크다면, 객체를 당연히 재활용해야 합니다. 하지만, 그렇지 않은 곳에서까지 그 방법을 택하는 것은 프로그램을 필요 이상으로 복잡하게 만들어서 좋지 않습니다.

객체를 재활용하려면 객체의 상태를 초기화하는 함수를 만들어야 합니다. 즉, 소멸자와 생성자가 하는 일을 거의 그대로 하는 함수를 만들어야 하는 것입니다. 그러면 대개 다음처럼 진행됩니다.

object_type::object_type()
{
	initialize();
}

object_type::~object_type()
{
	finalize();
}

void object_type::initialize()
{
	...
	my_valid = true;
}

void object_type::finalize()
{
	...
	my_valid = false;
}

void object_type::reset()
{
	finalize();
	initialize();
}

참고로, reset 함수 안에서는 불필요한 일을 좀 더 줄이기 위해서, 변형된 finalize와 initialize를 호출할 수도 있습니다. 하지만, 기본적인 틀은 위의 코드에서 크게 벗어나지 않습니다.

위 방식이 특히 비효율적일 때는, 생성자와 소멸자를 잘 활용하는 멤버 변수를 갖고 있을 때입니다. 생성자 안에서는 멤버 변수의 생성자가 자동으로 불리고, 소멸자 안에서도 멤버 변수의 소멸자가 자동으로 불립니다. 그래서 사용자는 복잡한 생성 소멸 처리를 따로 할 필요가 없습니다. 하지만 객체 재활용 방식을 사용하면, reset 함수에서 초기화 처리를 별도로 해 줘야 합니다.

게다가, my_valid = true처럼 객체가 유효한 상태인지 기억해 둬야 하며, 외부에서 그 객체를 접근할 때에도 유효한 상태인지 확인해야 해서 실수의 여지가 많아집니다. 뿐만 아니라, 어떤 객체는 위의 방식을 쓰고 어떤 객체는 일반적인 방식을 쓴다면, 코드는 더 난해해집니다.

생성 소멸 문제를 쉽게 해결하려면, 객체를 재활용하려고 하지 말고 생성자와 소멸자를 적극적으로 활용하는 것이 좋습니다.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중