2008-09-16 26 views
12

Chúng tôi cần tối ưu hóa hiển thị văn bản cho ứng dụng C# Windows Forms hiển thị số lượng lớn các chuỗi nhỏ trong lưới không đều. Bất cứ lúc nào có thể có hơn 5000 tế bào có thể nhìn thấy cập nhật 4 lần mỗi giây. Họ phông chữ và kích thước là nhất quán trên các ô, mặc dù màu sắc có thể thay đổi từ ô này sang ô khác, như sẽ in đậm/nghiêng/đồng bằng.API nhanh nhất để hiển thị văn bản trong Windows Forms?

Tôi đã nhìn thấy mâu thuẫn thông tin trên web về TextRenderer.DrawText vs Graphics.DrawString là nhanh nhất/tốt nhất, làm giảm tới một GDI vs GDI+ so sánh ở cấp Win32.

Tôi cũng đã thấy các kết quả hoàn toàn khác nhau trên Windows XP so với Windows Vista, nhưng mục tiêu chính của tôi là Windows XP. Các bài viết hứa hẹn những tiến bộ tuyệt vời dưới WinFXDirectX 10 không hữu ích ở đây :-)

Cách tiếp cận tốt nhất ở đây là gì? Tôi không ngại giới thiệu một lớp C++/CLI nhỏ và tối ưu hóa việc xử lý ngữ cảnh thiết bị để ép ra hiệu suất cao hơn, nhưng tôi muốn một số lời khuyên dứt khoát về hướng đi nào.

EDIT: Cảm ơn bạn đã trả lời ban đầu. Tôi sẽ thử một sự kết hợp của nền bitmap rendering và gắn bó với các cuộc gọi tương đương GDI.

Trả lời

5

Nhà phát triển Microsoft đã đăng một bài viết GDI vs. GDI+ Text Rendering Performance trên blog của mình để trả lời câu hỏi tốc độ thô: trên hệ thống của mình, GDI DrawText nhanh hơn khoảng 6 lần so với GDI + DrawString.

Nếu bạn cần là một con quỷ tốc độ thực, TextOut nhanh hơn DrawText, nhưng bạn sẽ phải tự lo việc cắt và tự gói từ. ExtTextOut hỗ trợ cắt.

Hiển thị GDI (TextRenderer) sẽ nhất quán hơn với các phần khác của Windows bằng GDI; GDI + cố gắng độc lập với thiết bị và vì vậy some spacing and emboldening are inconsistent. Xem công cụ cấu hình khu vực bề mặt SQL Server 2005 để biết ví dụ về hiển thị không nhất quán.

+0

Ứng dụng mẫu trong liên kết blog là ứng dụng tôi đã thấy khi thấy sự khác biệt lớn giữa Vista và XP - trên máy tính Vista, GDI và GDI +, trong khi XP, tôi thấy sự khác biệt 6x mà tác giả đề cập. Đây có lẽ là một vấn đề trình điều khiển Vista, nhưng nêu bật một số khó khăn ở đây - cảm ơn! –

+1

Lưu ý lịch sử: ExtTextOut từng là cách nhanh nhất để vẽ hình chữ nhật vững chắc trên một số thẻ/trình điều khiển :) –

2

GDI có tốc độ vẽ nhanh hơn nói chung là GDI +. Tôi đã làm việc trên một dự án đã phải vẽ hàng ngàn dòng và chuỗi văn bản và chuyển từ GDI + sang GDI đã cải thiện hiệu suất đáng kể. Đó là sử dụng Windows XP nên tôi không thể bình luận về Vista. Tôi cũng khuyên bạn nên sử dụng bộ đệm đôi cho bản vẽ của mình để cải thiện hiệu suất. Tạo bitmap màn hình tắt tương thích và sử dụng lại mỗi lần bạn cần vẽ.

3

5000+ hiển thị văn bản chậm ngay cả với GDI, đặc biệt nếu bạn cần cuộn. Tạo một chuỗi hiển thị riêng biệt và thông báo cho chuỗi giao diện người dùng 200 ms một lần và bitblt các kết quả hiện tại. Nó mang lại trải nghiệm người dùng mượt mà.

2

Tạo lớp xen kẽ C++/CLI để thực hiện bản vẽ trong mã gốc sẽ dẫn đến bản vẽ cực nhanh. Chúng tôi đã chứng kiến ​​điều này và đo lường nó.

Nếu bạn không muốn làm điều đó, chúng tôi đã tìm thấy đồ họa.DrawString chỉ nhanh hơn một chút so với TextRenderer.DrawText.

2

Trên hệ thống Windows 7 64 bit của tôi TextOut thậm chí còn chậm hơn một chút so với DrawString! TextRenderer.DrawText chậm hơn nhiều so với DrawString.

+1

Tôi cũng phát hiện ra điều này ... nhưng tôi không thể tìm ra lý do nào cả !? – series0ne

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