2009-07-29 27 views
7

Tôi hiện đang làm việc trên một ứng dụng cho phép người dùng phát (tự động cuộn) qua một loạt hình ảnh cục bộ. Thông thường sẽ có năm hoặc sáu trên màn hình cùng một lúc.Tăng tốc tải hình ảnh từ đĩa trong ứng dụng biểu mẫu windows (C# .net)

Nút cổ chai lớn tại thời điểm này có vẻ là tải dữ liệu hình ảnh thực tế từ đĩa. Một chủ đề hẹn giờ gọi cho các hình ảnh được cập nhật mỗi 1/6 của một giây và ứng dụng đang đấu tranh để theo kịp với tốc độ đó. Mỗi hình ảnh có kích thước khoảng 25Kb.

Tôi đã cố gắng tạo bộ đệm cuộn để thử và tải trước hình ảnh nhưng điều này cũng bị bắt kịp với chính nó nên cuối cùng cũng bị chậm lại.

Mỗi nhịp của bộ đếm thời gian, tôi lặp qua sáu placeholders hình ảnh tải hình ảnh tiếp theo bằng cách sử dụng phương pháp tiêu chuẩn

Image img = Image.FromFile("filename"); 

nhưng nghĩ ai đó có thể biết một cách nhanh hơn để có được những hình ảnh hết đĩa.

Có từ 500 đến 20.000 hình ảnh trong mỗi bộ trong số sáu bộ sao cho quá lớn để tải toàn bộ nội dung vào bộ nhớ khi bắt đầu.

Nếu có ai đề xuất cách nhanh hơn để kéo những hình ảnh này qua, nó sẽ được đánh giá cao.


Chỉnh sửa để thêm một số chi tiết về luồng ứng dụng.

Được rồi, đây là những gì đang diễn ra:

Nút lượt truy cập của người dùng nhấn 'phát'. Bộ hẹn giờ bắt đầu với thời gian chờ là 1/6 giây.

hẹn giờ gọi lại:

Update image index (_index++) 
for each viewer in list of visible viewers (the forms to display images) 
{ 
    get the filename from the id stored in the viewer 
    check to see if the file exists 
    if it does exist, 
     create new bitmap from image 
     and return that image 
    otherwise return null 

    if returned image isn't null, display it on screen 
} 

Đó rõ ràng là đi qua một vài lớp - hình ảnh tải đi vào trong lớp dịch vụ và sau đó đi này thông qua để trình bày và sau đó đến giao diện người dùng nhưng đó là ý chính của những gì đang xảy ra .

Trả lời

8

Tôi đã xem qua this page mô tả cách sử dụng API GDI + trực tiếp để tải hình ảnh. Rất đơn giản để sử dụng:

ImageFast.FromFile(@"C:\MyPhoto.JPG"); 

Added để hiển thị tốc độ của ImageFast qua Image Từ phương pháp tập tin

này sử dụng mã nguồn tìm thấy here.Mã đã được sao chép và dán và không yêu cầu thay đổi.

Stopwatch watch = Stopwatch.StartNew(); 

string filePath = @"C:\TestImage25k.png"; 

Image fromFile = Image.FromFile(filePath); 

watch.Stop(); 

Console.WriteLine("Image.FromFile  Ticks = {0:n}", watch.ElapsedTicks); 

long fromFileTicks = watch.ElapsedTicks; 

watch.Reset(); 
watch.Start(); 

Image fastImage = ImageFast.FromFile(filePath); 

watch.Stop(); 

long fastFileTicks = watch.ElapsedTicks; 

Console.WriteLine("ImageFast.FromFile Ticks = {0:n}", watch.ElapsedTicks); 

Console.WriteLine("fromFileTicks - fastFileTicks = {0:n}", fromFileTicks - fastFileTicks); 

Giao diện điều khiển đầu ra là

 
Image.FromFile  Ticks = 19,281,605.00 

ImageFast.FromFile Ticks = 7,557,403.00 

fromFileTicks - fastFileTicks = 11,724,202.00 

Bạn có thể thấy tác động của ImageFast. Theo thời gian, 11 triệu ve được lưu sẽ tăng lên.

+1

Tôi đã viết một ứng dụng thử nghiệm nhanh để kiểm tra điều này và ImageFast nhanh hơn 11 triệu bọ ve. Từ tập tin của hình ảnh mất 19 triệu trong khi ImageFast chỉ mất 7 triệu. –

+0

Cảm ơn kết quả kiểm tra, David :) – bernhof

+0

Không thành vấn đề. Tôi thích kết quả của ImageFast. –

1

Dễ nhất có thể là đặt nút 'tiếp theo' và 'trước đó' để giới hạn số lượng hình ảnh và tải trước.

0

Nếu bạn có 6 hình ảnh được hiển thị cùng một lúc và bạn thay đổi tất cả 6 giây một lần, bạn sẽ gặp sự cố về hiệu suất. Tải 150 kb từ đĩa phải là một hoạt động tầm thường ngay cả khi không có bộ nhớ đệm. Có vẻ như bạn có thể làm quá tải tệp. Bạn có chắc bạn chỉ tải 6 hình ảnh cùng một lúc không? Bạn đang đọc hình ảnh từ đĩa không được hiển thị?

Nếu bạn có thể cung cấp thêm một chút chi tiết về luồng ứng dụng, tôi có thể hữu ích hơn một chút.

+0

Hi, tôi đã chỉnh sửa câu hỏi để thể hiện một chút của dòng chảy ứng dụng. Nó chắc chắn chỉ tải 6 hình ảnh cùng một lúc. Nếu tôi bắt đầu đóng cửa một số cửa sổ 'người xem', nó sẽ tăng tốc đáng kể. Tôi cũng đã cố gắng đọc 50 hình ảnh đầu tiên từ mỗi bộ vào bộ nhớ trước khi chơi và hoàn toàn loại bỏ nút cổ chai, vì vậy nó có vẻ chỉ là tải làm chậm mọi thứ. –

0

tôi có lẽ sẽ tạo ra một sợi nền để liên tục lấy tất cả các hình ảnh từ đĩa (giữ ui đáp ứng) và sau đó xuất bản mỗi hình ảnh vừa được nạp thông qua một sự kiện

1

Kiểm tra các khái niệm về double buffering. Những gì bạn muốn làm là có một chuỗi thứ hai có thể tải bộ hình ảnh tiếp theo trong khi bạn đang hiển thị tập hợp đầu tiên. Khi cổng thời gian 1/6 được truy cập, bạn chuyển một tập hợp hình ảnh ra và bắt đầu tải tập tiếp theo.

Các vấn đề liên quan