-
09-04-2012, 04:28 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
[J2ME] bạn đã tối ưu code dự án J2ME như thế nào ? [cùng thảo luận]
bạn đã tối ưu code dự án J2ME như thế nào ? hãy cùng thảo luận, chia sẻ những kinh nghiệm để các dự án J2ME chạy được nuột hơn [IMG]images/smilies/smile.png[/IMG]
View more random threads:
- Làm sao để lấy company name của 1 contact trong address book
- Cách ghi Bitmap vào SDCARD trong Android?
- [Android] Làm sao add 1 file xml vào project android?
- Xây dựng chương trình hát Karaoke trên mobile bằng j2me, có thể không?
- Không kéo thả được DatePicker vào layout : couldn't resolve resource @layout/date_picker_selected_date, failed to parse file...
- Giúp đỡ về touch event trong DrawerLayout
- Làm sao để stop thread trong android ?
- tại sao không xuất hiện màn hình xử lý trong j2me?
- Run ứng dụng Android bị lỗi launching new_configuration has encountered a problem?
- [Android] Làm sao cho SurfaceView vào trong TabHost?
-
10-04-2012, 04:16 PM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Mình hay dùng cách sử dụng 1 Thread cho tất cà các canvas. Không sử dụng các hàm gc bừa bãi.
-
10-04-2012, 05:15 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
1. vấn đề dùng canvas
Dùng nhiều canvas là ko nên [IMG]images/smilies/biggrin.png[/IMG]
chỉ nên dùng 1 Canvas trong project J2ME
lí do :
- dùng 1 Canvas sẽ tránh được hiện tượng giật hình (khi chuyển canvas này sang canvas nọ)
- không phải get graphics nhiều lần, vì chỉ có mỗi 1 canvas, get graphics 1 lần duy nhất
- bộ thu gom gc cũng ko phải làm việc nhiều
thực tế qua 16 dự án của công ty mình cũng kiểm nghiệm điều này rồi (*)
các dự án thực tế ng ta chỉ sử dụng 1 canvas duy nhất (*)
-
10-04-2012, 05:20 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
16 : Con số ấn tượng thật. Bạn này dày dặn kinh nghiệm rồi, còn gì nữa cùng chia sẻ đi.
-
10-04-2012, 06:15 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
2. vấn đề bộ nhớ & giải phóng bộ nhớ tự động
mặc dù j2me có bộ thu gom bộ nhớ tự động nhưng trong J2ME chờ để bộ thu gom hoạt động thì lúc đó
ứng dụng đã out of memory từ lâu rồi nhé [IMG]images/smilies/biggrin.png[/IMG] .nguyên nhân thì hỏi chúa @_@
tốt nhất là tự tay giải phóng
cách giải phóng :
bạn gán null tất cả các object được khởi tạo (những object ko còn dùng đến) và gọi lệnh gc như sau
Mã:Runtime.getRuntime().gc();
Mã:System.gc();
lúc nào thì giải phóng
- thường đối với 1 j2me apps thì lúc nào bạn ko cần dùng nữa thì sẽ giải phóng,
- đối với 1 j2me game, thực tế người ta sẽ dùng 1 thread quét định kì (0.5s) , gọi lệnh gc ở trên liên tục
biến nào chiếm nhiều bộ nhớ nhất
- dĩ nhiên là biến String, chiếm đến >=60% bộ nhớ của ứng dụng j2me thông thường.bạn có thể enable memory monitor lên để kiểm tra điều này => hạn chế dùng biến String, nếu dùng thì nên dùng String buffer. String buffer có thể hiểu nôm na là dùng đến đâu thì chiếm bộ nhớ đến đó.\
- hạn chế dùng biến int, nên dùng short,byte nếu có thể
- hạn chế dùng các biến Image, các image nếu ko transparent thì nên để định dạng jpg, nếu image kích thước 320x240 nên để dung lượng tầm 10kb là vừa
- hạn chế dùng thread, thread là 1 nguyên nhân để bộ nhớ tăng vọt thất thường.khuyến cáo là dùng tối đa 3 thread trong 1 dự án j2me. 3 thread thì máy tàu giật điên cuồng rồi thì phải. nên dùng timer nếu có thể.
Kinh nghiệm của mình là dùng tối đa 1 thread, thay thế = timer nếu có thể
- nếu dùng thread,timer thì trước khi hủy class chứa nó cần phải hủy nó trước. thực tế là nếu hủy class chứa timer mà ko hủy timer trước thì dù có gọi gc, bộ nhớ vẫn tăng vọt...biết chết liền [IMG]images/smilies/biggrin.png[/IMG]
trong j2me vấn đề tối ưu bộ nhớ khá hay, làm nhiều sẽ rút ra được kinh nghiệm. chả như android, cứ khai báo biến quên ngày tháng mà ko cần lo nghĩ gì...^^
-
21-04-2012, 07:08 PM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Có vài ý góp vui :
- jar size : ảnh png 256 colors và dùng lại những vùng ảnh trùng nhau thường là chia ra ảnh thành những mảnh nhỏ và lưu tọa độ lại . Dùng code để sinh lại các chunks của ảnh png.Dùng một thuật toán nén hay hơn libz để nén data vào jar.Code thì nên so sánh các statement và các operator sau khi gen ra JIT code sẽ hơn thua nhau bao nhiêu bytes và ý nghĩa của từng statement trên javac ( không nên tập trung vào đây vì xuống size jar ít lắm nhưng sẽ tốt hơn cho performace ) .
- performace : tối đa việc đẩy người dùng vào cases mà ta có thể tính toán trước trên giấy trong giai đoạn analyzing & design,dynamic struct cho app của bạn ( vẫn ở giai đoạn design),cache data vào mem tối đa có thể ( mâu thuẫn với mem), code chú ý các vòng lặp .Chỉ vẽ lại những vùng cần vẽ trên canvas.
- mem : Thread và timer sống nhiều sẽ chiếm nhiều mem lý do vì JVM phải tạo ra các stack riêng cho các thread và timer này .Thường thì dùng 1 thread chính rồi kick-off 1 thread done-die liền sau mỗi case.String thường các app thông dụng hay có nhiều => biến nó thành 1 cục data rồi load string từ data lên .Static nhiều sẽ làm hao mem nhưng stable .
[IMG]images/smilies/smile.png[/IMG] profiler để debug rồi tùy từng trường hợp thui .À mà trên realdevice thì còn nhiều thứ lắm để nói .
-
21-06-2012, 08:47 AM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Một topic hay. Cố gắng phát huy nhé, nhất là những anh em nào có kinh nghiệm về mảng này. [IMG]images/smilies/clap_grin.gif[/IMG]
-
22-06-2012, 03:49 PM #8Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
3. có nên dùng thư viện của hãng thứ 3 không ? ưu nhược điểm của từng thư viện ?
hãy cùng thảo luận....
-
17-08-2012, 09:44 AM #9Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Các câu trả lời của các bác trên khá hay, một kiến thức ứng dụng tốt.
Tuy nhiên chúng ta vẫn còn nhiều cách nữa, trong đó có cả thay đổi chút thói quen code nữa, mình xin đóng góp một vài cách sau:
1. Chú ý việc khởi tạo các object:
Việc khởi tạo các object rất tốn bộ nhớ, nên chúng ta tránh khởi tạo nó trong vòng lặp for như sau:
Mã:for (int i = 0; i < length; i++) { ClassName p = new ClassName(); results[i] = p.calculateResult(); }
Nếu bạn dùng vòng lặp kiểu như vậy thì rất dở
Mã:for (int i = 0; i < v.size(); i++) { // Làm gì đó }
Mã:int size = v.size(); for (int i = 0; i < size; i++) { // Làm gì đó }
Mã:for (int i = 0, n = v.size(); i < n; i++) { // Làm gì đó }
Mã:for (int i = v.size() - 1; i >= 0; i--) { // Làm gì đó }
4. Nếu được thì dùng toán tử shift thay cho các toán tử toán học khác
Chẳng hạn ta có thể dùng int a = 11 << 1 thay cho int a = 11 * 2
Tuy nhiên nếu bạn không rành về toán tử shift thì mình khuyến cáo là không nên dùng.
5. Tránh sử dụng synchronization nếu không cần thiết
6. Cuối cùng là sử dụng obfuscater khi biên dịch ứng dụng.
Thông qua phân tích dữ liệu Google từ 86 quốc gia, mới đây, một công ty tại Anh đã công bố bảng xếp hạng kích tấc "cậu nhỏ" của các nước trên thế giới. Kết quả, hầu hết các nước xếp ở nhóm đầu của...
"Chim" của chàng trai Việt thuộc...