01/10/2018, 14:08
Ứng dụng ngốn quá nhiều ram
Chào mọi người, mình mới bắt đầu tự học về wpf, đang tập tành viết vài ứng dụng đơn giản. Mình tạo một ứng dụng để xem ảnh, ảnh sau khi được chọn sẽ load lên một stackpanel. chỉ đơn giản như thế nhưng mình để ý thấy cái ứng dụng này ngốn ram khủng khiếp liệu có cách nào cho nó giảm ram xuống được không ?
ảnh:https://imgur.com/a/cZWAk
Bài liên quan
Thì bạn xài cái khác là OK! Đừng nên ôm khư khư 1 cái
Đùa đấy! Bạn nên nâng cấp RAM hoặc thay ổ SSD là chạy ngon rồi
ờm, vấn đề không phải là mình không đủ ram chạy chẳng quá mình thấy sao nó ngốn ram dã man đến thế, mình cho load lên có khoảng 10 cái ảnh mà lắm lúc nó vọt lên tận 500-600 ram lận @@
Có khi bạn nên xài cái khác là ok
tức là cái này là do máy mình hả @@
Khả năng cao là vậy! Mà nói thật thay ổ cứng nào tốt hơn thì ngon rồi
P/s: tốt nhất bạn nên cung cấp thêm về thông tin phần cứng máy bạn thì mình sẽ xử lý được nhé
https://imgur.com/a/jyufk đây bạn ơi
Ghi nhớ rằng bạn nên xài ram 8gb thì làm cái gì cũng không bị lag đâu nhé! Có điều kiện thì dùng 16gb ram thì mượt miễn chê luôn
mình vừa đem ứng dụng sang máy khác chạy thử thì tình trạng ngốn ram vẫn thế, cái này là do ứng dụng của mình viết nó đang ăn hơi nhiều ram chứ không phải tại máy đâu. mình đang tìm giarp pháp để giảm lượng ram của cái app mình viết xuống ấy
Ý bạn là thế chứ gì. Thế thì bạn check lại code và optimize nó đi. Đừng nên xài quá nhiều biến và hằng. Tức là chương trình của bạn vẫn như thế nhưng số dòng và các hàm, biến, hằng, class giảm đi. bạn có thể tham khảo nguyên lý SOLID trong ngành lập trình để có thể viết code nhìn dễ bảo trì hơn và đỡ “ngốn ram” như bạn vùa bảo nữa.
bạn có thể lên trang toidicodedao để học được nhiều kiến thức hơn từ ngành lập trình nhé!
https://imgur.com/a/SROpi code có thế này thôi chứ có nhiều nhặn gì đâu @@
Đăng code đầy đủ đi đừng chụp hình nữa
void LoadImage()
{
private void Open_Folder_Click(object sender, RoutedEventArgs e)
{
LoadImage();
}
đấy, có thế này thôi bạn
à quên chú thích lại sp1 là stackpanel. lbfile là một cái listbox
phần code xaml bạn có cần xem luôn không ?
ảnh cũ chưa xóa mà thêm ảnh mới vào, load 10 ảnh thì còn giữ cả 10 nên ngốn RAM là đúng rồi. Sửa dòng này sao cho load 10 tấm thì chỉ hiện tấm cuối cùng thôi.
à không đấy là mình cho load cả 10 ảnh để xem 10 ảnh nên mới để thế, ứn gdujng của mình là xem một lúc nhiều ảnh chứ không phải từng ảnh 1, khi bắt đầu chọn nút open thì minh đã cho sp1.children.clear() ảnh cũ rồi mà. mình chí thấy việc load imge sao nó ngốn ram thế, liệu có cách nào load ảnh lên mà cần ít tài nguyên hơn không thôi
ờm nãy ko thấy dòng clear đầu tiên
ảnh bự cỡ nào? 3000px x 2000px? Load 1 tấm mà lên 400MB hay load 10 tấm mới lên 400MB?
à đúng rồi cái hàm LoadImage() nó load tất cả image trong thư mục nên nó ngốn RAM là đúng rồi. Cả cái thư mục có 100 tấm nó load cả 100 thì chưa vọt lên 1GB là may rồi. Load từng tấm thôi. Sửa tên lại là LoadAllImagesInFolder() luôn cho nó dễ hiểu, còn LoadImage() thì chỉ load 1 tấm, đúng tên đúng chức năng.
nếu chỉ load 1 tấm sao lại dùng foreach ở đây?
Bạn mở profiler xem đoạn nào trong chương trình ngốn nhiều tài nguyên rồi xử lý phần đó, ngồi đoán mò từng chỗ xem chỗ nào bị bottleneck thì chắc tới mùa quýt. Project nhỏ còn ăn may đoán được, gặp project lớn 10k~100k LOC thì… . Chưa biết dùng profiler thì Google có hết:
https://msdn.microsoft.com/en-us/library/aa969767(v=vs.110).aspx
chắc ảnh khoảng 1200x2000, nếu 1 tấm thì có tầm 50-70 còn 10 tấm thì gấp 10 luôn, mình tính nếu không có cách giảm ram xuống thì cho nó load khoảng 3 tấm trong danh sách trước hết 3 tấm thì lại tới 3 tấm tiếp cơ mà chưa biết làm sao để cho thằng listbox nó nhảy selecteditems khi biết mình đã xem hết 3 ảnh đầu
nguyên nhân là đây, rồi tự xử đi, hổng giúp đâu