2010-10-10 3 views
5

Tôi có một TFrame gốc Delphi mô phỏng trình xem Cloud Cumulus Tag của Roy Tanck, một trình cắm thêm Flash của WordPress. Những gì mà trình cắm thêm thực hiện là tạo ra một hình cầu 3D của các từ quay xung quanh trên bề mặt của một quả cầu "ảo". Bạn có thể nhìn thấy nó trong hành động ở đây:Delphi 6: Delphi có thể làm đồ họa mượt mà như Flash không?

http://www.roytanck.com/2008/03/06/wordpress-plugin-wp-cumulus-flash-based-tag-cloud/

Trong cấu trúc ứng dụng của tôi mỗi từ có TBitmap riêng của mình và để làm cho cầu tôi in tất cả bitmap của từ để một TBitmap tạm thời và sau đó bitblt() mà TBitmap tạm thời trên Canvas của một TPaintBox hiển thị. Các hoạt động kết xuất xảy ra trên một sự kiện bộ đếm thời gian TTimer xảy ra mỗi 50 mili giây.

Tuy nhiên, không có vấn đề làm thế nào cứng tôi cố gắng có một "jitter" đáng chú ý đến sự chuyển động của các từ, đặc biệt là so với chuyển động mượt mà mượt của trình phát Flash. Tôi nghĩ việc tăng tốc độ khung hình có thể hữu ích và thậm chí tôi đã thử sử dụng bộ hẹn giờ Đa phương tiện cập nhật cứ 10 mili giây bằng khóa và mở khóa thích hợp tất cả Canvases do bản chất đa luồng của bộ hẹn giờ MM. Vẫn còn hốt hoảng. Điều duy nhất tôi có thể tính toán là các phép tính tôi thực hiện dẫn đến các vị trí pixel rời rạc cho mỗi từ để hiển thị tại và gây ra jitter. Ngược lại, và đây là giả định, có lẽ Flash có khả năng phối màu để tạo điều kiện cho việc hiển thị "giữa pixel" hoặc có thể chống răng cưa trong thời gian thực và đó là lý do tại sao nó không jitter?

Trong mọi trường hợp, có thể chuyển động mượt mà mượt mà tôi đang tìm bằng mã Delphi gốc không? Hoặc là cách duy nhất để làm điều đó là đi tất cả các cách để một cái gì đó giống như một giải pháp Direct3D hoặc OpenGL? Tôi không muốn lãng phí thời gian để điều chỉnh điều này đến chết nếu đó là một trận thua. Mặt khác, nếu bạn có bất kỳ lời khuyên nào tôi muốn nghe chúng. Tôi đoán là nếu tôi phải đi theo tuyến đường Direct3D/OpenGL thì đó là một công việc lớn và đường cong học tập vì vậy nếu tôi có thể tìm ra cách để thực hiện điều này trong mã Delphi bản địa, tôi rất thích điều đó.

THEO-UP EDIT: Sẽ in bằng bitmap "ảo" lớn hơn nhiều và sau đó sử dụng một phương pháp lấy mẫu lại như thế giúp đưa ra ở đây để in "xuống" để thực tế có thể nhìn thấy Canvas ?:

Scale an image nicely in Delphi?

+0

Bạn có trên DoubleBuffering, AllPaintingInWmPaint, SupportsTransparentBackColor và UserPaint không? Sử dụng các công cụ này khi thực hiện hiển thị GDI trên biểu mẫu sẽ ngăn không cho nhấp nháy. – Nowayz

+0

Nowayz. Tôi không có nhấp nháy. Các jitter là vị trí, không phải do repaints. –

+0

Câu trả lời chắc chắn là có. Nhưng nếu bạn muốn đồ họa 3D thực sự mượt mà, CPU không đủ nhanh. Bạn cần sử dụng GPU, sử dụng OpenGL. –

Trả lời

2

Tôi đã viết một số trò chơi ở Delphi. Nó chắc chắn là doable. Có một số điều cần theo dõi.

Bạn không chỉ phải kích hoạt sự kiện thường xuyên mà còn kiểm tra thời gian đến và di chuyển dựa trên thời gian được thăm dò thay vì giả sử thời gian dựa trên thời gian chờ đợi dự kiến.

Nếu độ chính xác của pixel không phụ thuộc vào GPU là cần thiết, tôi sẽ giới thiệu Antigrain Geometry hoặc là người anh em họ Pascal AGGPAS cho Delphi.

Phông chữ hoạt ảnh có thể có vấn đề khác trong việc hiển thị phông chữ thường chứa logic để đảm bảo rằng các đường nét mỏng xuất hiện trên các giới hạn pixel. Việc di chuyển văn bản được hiển thị theo cách đó có thể thay đổi diện mạo khi các nét khác nhau có thể nhảy từ được căn chỉnh với một pixel sang điểm ảnh tiếp theo.

Nếu phông chữ được hiển thị để được căn chỉnh pixel, có lẽ nó sẽ quản lý tốt hơn nếu bạn định lượng hiển thị thành số nguyên. Nó sẽ vẫn liên kết với các điểm ảnh nhưng bằng cách di chuyển một pixel tại một thời điểm, nó sẽ làm cho nó hoạt động liên tục mỗi lần.

+0

tôi tin rằng phông chữ GDI có 'ANTIALIASED_QUALITY' (http://msdn.microsoft.com/en-us/library/dd183499 (v = vs.85) .aspx) sẽ không bị" gắn lưới ", tránh * "bouncing characters" * vấn đề. –

1

IMHO đúng cách để đi là Direct3D (hoặc OpenGL, nhưng cho Delphi là Windows chỉ có thể Direct3D là tốt hơn). Nó được giới thiệu chính xác bởi vì GDI không giỏi trong các nhiệm vụ như vậy. Flash hỗ trợ cả đồ họa vector và raster, và do đó có thể xử lý các loại ứng dụng như vậy tốt hơn so với GDI đơn giản cũ.

+1

Viết một ứng dụng OpenGL Delphi rất dễ dàng, vì có một đơn vị OpenGL.pas. Viết một ứng dụng DirectX Delphi không phải là dễ dàng. –

+0

Trải nghiệm của tôi với Direct3D là khi nó hoạt động thì tuyệt vời nhưng khi bạn gặp sự cố, đặc biệt là do vấn đề codec ở đâu đó trong chuỗi bộ lọc, cuộc sống có thể rất đau đớn rất nhanh. Đó là lý do tại sao tôi làm việc rất chăm chỉ để tránh nó. Tôi đã không mệt mỏi OpenGL chưa và chắc chắn muốn. –

+0

Tôi chỉ có nghĩa là DirectX là nền tảng đồ họa tiên tiến của Windows, nó hỗ trợ tốt hơn. MS cho thấy họ "không thích" OpenGL rằng nhiều –