Bài đăng phổ biến

Thứ Năm, 1 tháng 11, 2012

AndEngine - Cách sử dụng Object Pool

Nguồn bài viêt: Vietandroid.com --tkminh Object pool

Trong game đặc biệt là game mobile việc tạo ra quá nhiều instance cho cùng 1 đối tượng là không cần thiết, vì nó gây chiếm dụng nhiều bộ nhớ làm cho game chạy chậm. VD: Điển hình là game bắn súng, khi người ta bắn ra 1 viên đạn, bạn tạo ra 1 object cho viên đạn đó. Người dùng bắn 100 viên đạn, bạn tạo ra 100 viên đạn đó thì rất là tốt bộ nhớ....Sẽ tốt hơn rất nhiều khi chúng ta tái sử dụng viên đạn đó khi chúng đã hết chu trình của nó. Do đó Object pool ra đời:

Chúng ta tạo ra 1 lớp Bullet chẳng hạn kế thừa từ lớp GenericPool<?>


01public class ProjectilesPool extends GenericPool<Sprite> {
02    private TextureRegion mTextureRegion;
03
04    public ProjectilesPool(TextureRegion pTextureRegion) {
05        if (pTextureRegion == null) {
06            // Need to be able to create a Sprite so the Pool needs to have a TextureRegion
07                throw new IllegalArgumentException("The texture region must not be NULL");
08        }
09        mTextureRegion = pTextureRegion;
10    }
11
12    /** Được gọi khi một viên đạn được yêu cầu nhưng trong pool không có viên đạn nào */
13    @Override
14    protected Sprite onAllocatePoolItem() {
15        return new Sprite(AndEngineSimpleGame.player.getX(),AndEngineSimpleGame.player.getY(), mTextureRegion.deepCopy());
16    }
17
18    /** được gọi khi 1 viên đạn được gửi tới pool */
19    protected void onHandleRecycleItem(final Sprite projectile) {
20        projectile.clearEntityModifiers();
21        projectile.clearUpdateHandlers();
22        projectile.setVisible(false);
23        projectile.detachSelf();
24        projectile.reset();
25    }
26}

các bạn chỉ cần chú ý:

Ta sẽ cần 1 LinkedList để chứa tất cả các viên đạn được tạo ra

public LinkedList<sprite> bulletList;

- Method onAllocatePoolItem Dùng để tạo mới object sprite

- Method onHandleRecycleItem: dùng tái tạo 1 object cụ thể
- Method onHandleObtainItem: reset lại object như lúc ban đầu
- Method checkAndRecycle: mình sẽ lặp qua hết các object trong Pool và sẽ recycle lại nếu thỏa điều kiện





Không có nhận xét nào:

Đăng nhận xét