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<?>
01 | public class ProjectilesPool extends GenericPool<Sprite> { |
02 | private TextureRegion mTextureRegion; |
04 | public ProjectilesPool(TextureRegion pTextureRegion) { |
05 | if (pTextureRegion == null ) { |
07 | throw new IllegalArgumentException( "The texture region must not be NULL" ); |
09 | mTextureRegion = pTextureRegion; |
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 */ |
14 | protected Sprite onAllocatePoolItem() { |
15 | return new Sprite(AndEngineSimpleGame.player.getX(),AndEngineSimpleGame.player.getY(), mTextureRegion.deepCopy()); |
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(); |
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