Ứ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

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

1 Like

ờ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

1 Like

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é

1 Like

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

1 Like

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é!

1 Like

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

1 Like
void LoadImage()
{
    
    
    sp1.Children.Clear();
    lbFile.Items.Clear();

    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.Multiselect = true;
    openFileDialog.Filter = "Images (*.BMP;*.JPG;*.PNG)|*.BMP;*.JPG;*.PNG|All files (*.*)|*.*";
    //openFileDialog.FilterIndex = 1;

    if (openFileDialog.ShowDialog() == true)
    {
        foreach (string filename in openFileDialog.FileNames)
            lbFile.Items.Add(filename);
    }
    foreach (string i in lbFile.Items)
    {
        Image img = new Image();
        img.Source = new BitmapImage(new Uri(i));
        img.Tag = i;
        img.Cursor = Cursors.Hand;
        sp1.Children.Add(img);
        img.MouseEnter += img_MouseEnter;                             
    }          
    scroll.ScrollToTop();          
}

private void Open_Folder_Click(object sender, RoutedEventArgs e)
{
    LoadImage();          
}

private void img_MouseEnter(object sender, RoutedEventArgs e)
{
    Tag.IsExpanded = false;           
    Image item = (Image)sender;
    string NameFile = item.Tag.ToString();
    Main.Title = NameFile;
    
}

đấ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.

1 Like

à 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 :joy:

ả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?

2 Likes

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ì… :joy:. Chưa biết dùng profiler thì Google có hết:

https://msdn.microsoft.com/en-us/library/aa969767(v=vs.110).aspx

1 Like

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 :joy:

nguyên nhân là đây, rồi tự xử đi, hổng giúp đâu

1 Like

Không liên quan đến wpf mà cách làm không đúng.

Với yêu cầu trên thì load từng tấm ảnh lên Bitmap sau đó resize nó ra kích thước rất nhỏ. Ví dụ 80x60 rồi hiển thị cái bitmap này như một icon.
Khi chọn icon mới load ảnh kích thước thực ra viewer. Cách này list 1000 bức ảnh vẫn được.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?