0

Lưu ý đặc biệt khi làm Game

Một số lưu ý đặc biệt khi xây dựng một ứng dụng Game trên Android. Thôi không tóm tắt trước đâu nhé, mất thời gian lắm. Mình đi vào bài luôn.

I. Asset

Ok, chúng ta có 2 loại Asset đặc trưng đó là lọa 2D và 3D

1. 2D Asset

Để xây dựng được một Game thì hầu như tất cả đều phải sử dụng tới những hình ảnh 2D, bất kể thể loại game nào từ 2D tới 3D. À mấy game xây dựng như kiểu bắn ruồi các kiểu thì có thể tự vẽ bởi code nhưng mà mình chắc chắn rằng sau khi hoàn thành trông nó sẽ thật là tồi tệ. Về loại asset này chúng ta cần chú ý 3 điểm sau:

Kích thước

Mỗi một frame ảnh chỉ nên để lại những pixel cần thiết và hiệu quả. Nhưng pixel không cần thiết nên lược bớt đi nhiều nhất có thể, bởi chúng sẽ làm tăng dung lượng asset và bộ nhớ trong khi chạy.

Dữ liệu

Khi xây dựng trò chơi thì không phải tất cả các hình ảnh đều yêu cầu phải chứa đầy đủ các thông tin về ảnh. Bởi vì tùy từng định dạng hình ảnh khác nhau mà dữ liệu được lưu trữ trong từng pixel của ảnh là khác nhau.

Ví dụ như là việc giảm số màu trên ảnh, nhiều loại hình ảnh không cần thiết lắm phải đầy đủ full thông tin pixel như là các loại hình nền phía sau của ảnh chẳng hạn, chúng ta chỉ cần tập chung vào các nhân vật với enemi, obstacle... là đủ. Với một hình ảnh nền mà có opacity, trong ảnh có một chi tiết cần rõ ràng như là một ngôi nhà chẳng hạn. Ok bạn nên tách hẳn ngôi nhà đó ra khỏi hình nền thành một chi tiết riêng và thiết lập định dạng ảnh cho phù hợp. Về việc thiết lập cho ảnh, chúng nên được để ở các định dạng 8bit, 14 bit hoặc 24 bit.

Một số tool có sẵn trên mạng có thể rất hữu ích cho bạn trong việc optimize ảnh đấy. Ví dụ luôn 1 cái như http://optimizilla.com/. 😄

Xử lý ảnh

Việc xử lý, load các hình ảnh lên nhiều hoặc nén ảnh nhiều cũng sẽ ảnh hưởng rất lớn tới performance của game. Do vậy việc tạo ra các alias hoặc các sprite sheet cũng là một cách tốt để giảm thiểu thời gian xử lý ảnh.

2. 3D Asset

Về loại này thì phức tạp hơn loại 2D, sẽ có 2 thứ lớn cần quan tâm. =)) nhưng mà đừng lo, làm nhiều ràu sẽ quen.

2D Textures

loại này thì sẽ cần để ý tới optimize cả 2D asset như đã nói ở trên.

Đỉnh & đa giác

Phần còn lại cần quan tâm sẽ là số lượng các đỉnh và đa giác của model. Có một điều rõ ràng rằng tất cả số đa giác được liên kết với nhau để tạo nên các chi tiết, hình hài cho model. Vậy nên càng nhiều đa giác chúng ta sẽ có được càng nhiều chi tiết và hình dáng sắc nét hơn cho model.

NHƯNG mà vấn đề của chúng ta ở đây là các thiết bị di động vẫn còn giới hạn về phần cứng. Việc phải lưu giữ thông tin các điểm, các cạnh đa giác, render ra một model sẽ ngốn kha khá bộ nhớ. Vì vậy việc hạn chế số đỉnh và đa giác trên model giúp bạn tăng performance được rất nhiều đấy.

Chưa hết, với mỗi một model có nhiều thành phần như là một con người chẳng hạn. Có đầu, chân, tay, body,.. việc để các mesh chồng chéo nhau có thể dẫn tới việc thừa các đỉnh và đa giác rất nhiều. Bởi vậy khi tạo model cần chú ý tới một kỹ thuật đó là Rigging.

II. Sử dụng FULL luôn tất cả các tính năng của thư viện bên ngoài

Hiện nay các nhà phát triển game hầu hết là sử dụng thêm các thư viện bên ngoài thêm vào nữa bởi sự tiện lợi, chỉ việc dùng sẵn của nó. Tiết kiệm được thời gian. Nhưng song song với nó là việc các thư viện thứ 3 thông thường có rất nhiều thứ chạy song song nữa mà thực tế không cần dùng tới trong game. Nó cũng sẽ ảnh hưởng không nhiều thì ít tới game.

Bởi vậy một lời khuyên đưa ra đó là hay cẩn thận chọn lọc và sử dụng các thư viện. Nếu cần thiết thì hay dùng, còn không thì hạn chế nó đi.

III. Không hề quản lý các kết nối mạng

Ối dời cái này thì như kinh nghiệm của mình gặp thì vẫn còn nhiều lắm. Nhiều người lập trình không để ý đâu. Hiện nay hầu hết các game trên android đều có kết nối mạng, rất rất nhiều các loại game online. Việc truyền nhận dữ liệu thường xuyên sẽ mất rất nhiều kb cũng như rất rất tốn pin luôn. Với những game realtime, chúng thường có một số lượng lớn các request và respone, không mấy nhà phát triển do muốn tiết kiệm thời gian phát triển nên không để ý tới việc quản lý và xử lý chúng cho hợp lý dẫn tới nhiều trường hợp game lỗi, lỗ hổng,lại phải bảo trì, sửa chữa thêm... vì vậy chú ý tới việc quản lý các kết nối mạng cũng không hề kém quan trọng.

IV. Rendering Pipeline

Vẫn là 2 loại. 2D và 3D:

1. 2D

Hệ thống vẽ 2D của Android dựa trên canvas. Tất cả các asset 2D đều được load vẽ lên canvas để hiển thị lên màn hình. Và tất cả chúng đều có một vị trí xác định trên canvas. Mặc dù từ bản android 2.3 trở lại đây đã có thể sử dụng sprite 4096x4096 nhưng nó có thể sẽ ngốn một lượng bộ nhớ khá lớn. Nhiều thiết bị android yếu sẽ khó khăn trong việc load asset cỡ này. Kích thước giới hạn tốt nhất đó là 2048x2048. Nó chỉ nên nhỏ hơn chứ không nên là lớn hơn. Điều này sẽ giảm được rất nhiều bộ nhớ và số draw call.

2. 3D

Android sử dụng OpenGl để render các tài nguyên lên màn hình, bởi vậy mà Rendering Pipeline cho android 3D là OpenGL pippeline cơ bản. Việc game 3D chạy có ngon hay không phụ thuộc khá nhiều tới các đỉnh hình học trong model.

V. Coding

Về chuẩn lập trình cho game thì hiện nay phong cách hướng cấu phần hay hướng mô-đun vẫn là ngon nhất. Các engine lớn đều có xu thế hướng người dùng theo cách lập trình này, điển hình như Unreal Engine, Unity 3D... Ngoài ra cũng cần chú ý tới kỹ năng lập trình cũng có thể làm cho game có thể phi như ngựa hoặc bò như rùa. Ví dụ như một người lập trình, khi cấp phát bộ nhớ nhưng lại quên không giải phóng nó khi không dùng tới nữa. :#) Cứ như vậy game có thể sẽ tốn rất nhiều bộ nhớ, hay còn gọi là rò rỉ bộ nhớ đấy =)). Rồi hệ quả là đơ hoặc crash.

Cách giải quyết không có gì khác là chịu khó học hỏi. À có một số lỗi làm cho game kém chất lượng mà develop không mấy khi để ý đó là:

  • Tạo ra nhiều các instance static.
  • Định nghĩa biến lặp lại nhiều lần.
  • Không viết đúng chuẩn.
  • Tạo singleton không đúng.
  • Load các object khi game đang chạy.

VI. Other

  • Việc lựa chọn làm game loại nào cũng là một vấn đề cần lưu ý. Nếu làm game với xử lý 3D thì phải chấp nhận nó nặng hơn loại game chỉ xử lý 2D. Game 2D thì FPS ở khoảng 60FPS là ok. Còn với game 3D thì tầm tầm 40FPS là cũng chấp nhận được rồi. Lý do mà 3D nặng hơn 2D là vì thằng 3D còn phải xử lý các đỉnh, cạnh của model, render Mesh, hệ thống Collision 3D, hệ thống Physic 3D...
  • Vấn đề nữa đó là hãy chú ý tới những sự khác nhau của các thiết bị và config cho game sao cho phù hợp với config của từng loại máy. Ví dụ một số thành phần của thiết bị có thể ảnh hưởng tới performance của game:
    • CPU, ngày xưa chả nói nhưng giờ chắc hầu hết đều có tốc độ lớn hơn 2GHz rồi.
    • RAM: đây là thành phần có quyết định lớn nhất tới performance của game.
    • GPU: Quyết định tới tốc độ render. Nó đóng vai trò như một thành phần xử lý đồ họa cho đối tượng.
    • Chất lượng hiển thị: thằng này tỷ lệ nghịch với performance luông. Tại vì chất lượng càng cao thì RAM, GPU, CPU càng phải xử lý nhiều. May mắn rằng android đã chia sẵn việc hiển thị cho từng loại rồi(LDPI, HDPI, XHDPI, ...).
    • Cuối cùng đó là dung lượng pin. Thằng này tỷ lệ thuận với performance =))

HẾT ! Còn gì thiếu xót rất mong các bạn đóng góp thêm !


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí