Bài đăng phổ biến
-
Trong bài này tôi sẽ hướng dẫn cài 1 plugin cho eclipse "Eclipse Git plugin" và lấy về phiên bản mới nhất của AndEngine (GLES 2.0)...
-
http://rdcworld-android.blogspot.in/2012/03/how-to-get-own-mobile-number.html http://www.androidhive.info/ http://vietandroid.com/ htt...
-
Bài này nhằm mục đích. Ánh xạ tọa độ texture vào Polygon trong Opengl như thế nào? Opengl sử dụng khái niệm "Texture Coordinates" ...
-
nguồn: https://sites.google.com/site/matimdevelopment/how-to-design-your-game-useful-concept-pattern Trong bài này tôi sẽ mô tả ý kiến ch...
-
AndEngine là một open - source free cho android 2D Opengl Engine. Nó được đưa ra vào giữa năm 2010 bởi Nicolas Gramlich. Đến bây giờ đã được...
-
Chào các bạn đến với seri thế giới 3D. Trong phần này tôi sẽ hướng dẫn các bạn 3 phần: Phần 1: Các khái niệm cơ bản của thế giới 3D Phần 2...
-
What is the different between extends SimpleBaseGameActivity and BaseGameActivity and BaseActivity? SimpleBaseGameActivity có trong GLES2 ...
Thứ Bảy, 3 tháng 11, 2012
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<?>
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
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; |
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
- 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
Đăng ký:
Bài đăng (Atom)
