2011-12-21 2 views
2

Derelict 및 D를 사용하여 SDL 자습서 시리즈 (C++로 작성)를 수행하고 있습니다. 지금까지 변환은 간단했지만 튜토리얼 작가 스타일은 나를 귀찮게하고 나는 그 주위의 최선의 방법을 찾아 내려고 노력해 왔습니다. 하지만 D에 대한 지식이 최고가 아니기 때문에이 문제를 해결할 수 있을지 잘 모르겠습니다.Derelict 및 SDL을 사용하여 D에서 외부 리소스를 적절하고 명확하게 관리하는 방법

기본적으로 SDL을 사용하려면 이미지 파일을 SDL_Surfaces로 메모리에로드해야합니다. 프로그램을 종료하기 전에 SDL_FreeSurface()를 사용하여이 표면을 수동으로 해제해야합니다. 이것은 scope(exit)에 대한 이상적인 케이스처럼 보입니다. 실제로는 단일 기능의 범위에서 리소스를로드 및 언로드하는 데 매우 효과적입니다. 그러나 이상적으로는 하나의 함수가 로딩을 처리하고 다른 어딘가에 다른 함수가 그 함수를 해제하도록 모든 것을 나눠서 처리하는 것이 이상적입니다. 그리고 그 이상으로, 아마 각 자원은 스스로를 처리 할 것입니다. 그게 RAII 같아요. 그러나 D에서 그것을 사용하는 방법을 정말로 모르겠어요. 에로드하고 ~this()에서 무료로 리소스를 가지고 새로운 클래스를 설정하는 줄 알았지 만 그것은 내가 읽은 것 같다. 클래스를 scope으로 인스턴스화하지 않으면 소멸자가 호출되지 않을 수 있습니다. 내가 추측 한 구조체를 사용할 수는 있지만 클래스의 유용한 장점을 놓치고있는 것처럼 보입니다.

내가 원한 것은 리소스를로드하고 해제되는 것에 대한 보장을 얻는 것이지만 모든로드 및 언로드를 하나의 거대한 방법으로 처리 할 필요가없는 정상적인 방법으로 수행하는 것입니다. 어떻게 접근해야합니까?

답변

3

적어도 멀티 태스킹을 지원하는 운영 체제가있는 플랫폼에서는 응용 프로그램을 종료 할 때 클린업에 대해 걱정할 필요가 없습니다.

또는 단순히 글로벌 집합에 해당 리소스를 저장할 수 있습니다.

+0

일부 리소스를 프로세스 외부에서 유지 관리 할 수 ​​있습니다. 비디오 카드, 파일 또는 네트워크를 통해. OTOH 저는 자원에 대한 나쁜 설계라고 생각합니다. 즉, 글로벌 세트는 좋은 생각처럼 들립니다. – BCS

+1

+1에 CyberShadow가 말합니다. @BCS - 나쁜 디자인이 아니므로 시스템은 응용 프로그램이 종료 된 후 엉망을 정리할 것을 보장합니다. 그것은 매우 강력한 보증이며, 수백만의 개발자가이 프로그램에 의존합니다. – DejanLekic

+1

필자는 스코어 (exit)가 함수 내에서 (분명히) 위로 이동하는 것으로 제한되는 내 딜레마를 발견했다고 생각합니다. 이제 main "run"함수는'scope (exit) {clean_up();}을 호출합니다. 아마도 매우 우아하지는 않지만 깨끗한 것을 보증하는 제 경우는 모든 것을 다 해줍니다. – CodexArcanum

2

원하는 경우 자동으로 SDL_Surface를 해제하는 것이 좋습니다. 구조체에 SDL_Surface를 래핑하고 RAII를 활용해야합니다. 이 유형의 것에 적합합니다. 더블 해제를 피하기 위해 포스트 블릿을 비활성화하거나 참조 계산을 구현하십시오.

struct SurfaceRAII 
{ 
    this(SDL_Surface* surf_handle) 
    { 
     m_handle = surf_handle; 
    } 

    // disable default constructor and postblit (no copies) 
    @disable this(); 
    @disable this(this); 

    ~this() 
    { 
     SDL_FreeSurface(m_handle); 
    } 

    public SDL_Surface* m_handle; 
} 

테스트되지 않았지만 그게 일반적인 생각입니다.

편집 : 원하는 경우 클래스에 std.typecons.RefCounted를 사용할 수도 있습니다.

+0

자동 청소를 제외하고 RAII는 범위 (종료) 이상을 제공하지 않습니다. –

+0

포스트 블릿이 RAII 구조체를 사용하지 않는 것은 사실입니다. 레퍼런스 카운트 된 RAII 객체는 좀 더 유연성을 제공한다고 생각합니다. – eco