Pool 클래스는 언제 그리고 왜 객체를 보유해야합니까?


12

저는 opengl es를 공부하고 있으며 터치와 키보드 이벤트를 추적하기 위해 "수영장"수업을 사용하는 것을 보았습니다.

풀 클래스가 어떻게, 왜 필요한지 설명해 주시겠습니까? 내가 읽은 내용에서 가비지 수집과 관련이 있으며 입력 클래스 수를 제한했습니다.

이 모든 것이 나에게 추상적 인 것처럼 보이므로 누군가 무슨 일이 일어나고 있는지 설명해 주시면 감사하겠습니다. 여기에 코드를 붙여 넣을 것입니다.

    public Pool(PoolObjectFactory <> factory, int maxSize) {            
        this.factory = factory;         
        this.maxSize = maxSize;         
        this.freeObjects = new ArrayList < T > (maxSize);     
    }  
         
    public T newObject() {        
        T object = null ;        
        if (freeObjects.isEmpty())            
            object = factory.createObject();        
        else             
            object = freeObjects.remove(freeObjects.size() - 1);        
            return object;     
    } 

    public void free(T object) {         
        if (freeObjects.size() < maxSize)             
            freeObjects.add(object);     
    }

    PoolObjectFactory <TouchEvent> factory = new PoolObjectFactory <TouchEvent> () {
     
    @Override     
    public TouchEvent createObject() {         
         return new TouchEvent();     
    } 

    Pool <TouchEvent> touchEventPool = new Pool <TouchEvent> (factory, 50); 
    TouchEvent touchEvent = touchEventPool.newObject(); 
    . . . do something here . . . 
    touchEventPool.free(touchEvent);

감사!

답변:


17

풀은 객체 수가 급격히 변동 할 때 사용되며 메모리 할당 및 가비지 수집량을 줄이는 데 사용됩니다.

풀을 사용하면 새 메모리를 할당하는 표준 new Object ()가 풀에서 이미 할당 된 객체를 가져 오는 것으로 대체됩니다. 그래도 이전 객체의 모든 변수를 기본값으로 재설정하더라도 훨씬 빠릅니다.

매번 새 항목을 만들면 각 개체에 메모리를 할당해야하기 때문에 엄청난 오버 헤드가 생깁니다. 또한 너무 많은 오브젝트를 작성하기 때문에 가비지 콜렉터가 자주 실행되어 성능을 저하시키는 원인이되는 오브젝트를 자주 정리해야합니다.

일반적인 예는 글 머리 기호입니다.

FPS의 경우 화면에 글 머리 기호가 0 개가 있고 다음 초에 1000이 표시된 다음 초가 다시 0이 될 수 있습니다. 발사 할 때마다 새로운 글 머리 기호를 만들려면 일정한 메모리 할당이 성능을 많이 사용하게됩니다. 또한 가비지 수집기는 이러한 모든 인스턴스를 추적하고 주기적으로 정리해야하므로 훨씬 더 많은 시간이 걸립니다.

총알 수가 5000 개이고 freeObjects 목록에없는 총알 만 업데이트하고 상호 작용하는 경우 총알 당 1 개의 할당 대신 소방 기간이 얼마나 오래 지속 되더라도 총 총 5000 개만 할당됩니다. 또한 가비지 콜렉터는 화재 가능성이 종료 된 후에 만 ​​실행하면됩니다. 메모리와의 상호 작용은 매우 느리기 때문에 성능에 큰 영향을 미치고 워크로드가 골고루 분산되어 프레임 속도가 끊어지지 않습니다.


입자 효과를위한 풀 클래스가 매우 중요하다고 생각합니다. 맞습니까?
mathacka

그렇습니다. 정확히 상황 풀의 종류가 설계되었습니다.
ClassicThunder

자체 객체이거나 클래스를 사용하는 클래스 풀을 사용하는 것이 더 좋은 방법입니까? 즉 Object.getObject () 대 ObjectFactory.getObject ()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.