Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Màn hình bị giật khi vẽ hình, xử lý như thế nào?

  1. #1
    Ngày gia nhập
    08 2008
    Bài viết
    22

    Angry Màn hình bị giật khi vẽ hình, xử lý như thế nào?

    Xin chào các bạn. Mình đang làm 1 chương trình tương tự như chương trình Paint( chỉ mới xây dựng lớp vẽ hình chữ nhật). Tuy nhiên khi vẽ nhiều hình thì xãy ra hiện tương giật màn hình (theo mình nghĩ là do gọi hàm Invalidate để tô vẽ lại tất cả các hinh). Mình không biết xữ lý làm sao hết. Mình gởi code lên mong các ban xem giúp nha.
    Attached Files Attached Files

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Mình đã sửa lại hết giật rồi đó bạn.
    Attached Files Attached Files
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    08 2008
    Bài viết
    22

    Thank you very much. Không hiểu sao mà mấy bửa nay mình làm sửa hoài mà không được

  4. #4
    Ngày gia nhập
    08 2008
    Bài viết
    22

    Còn đây là chương trình của mình sau khi đã viết thêm 1 số chức năng
    (Bài cùi bắp hơn là của mình, còn bài kia mình sưu tầm được)
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi duytue : 12-11-2008 lúc 01:09 AM.

  5. #5
    Ngày gia nhập
    06 2010
    Nơi ở
    HCM
    Bài viết
    7

    mình sắp học môn đồ họa máy tính nên hỏi thêm một chút nha!
    vì sao mà nó lại giật khi vẽ vậy?
    có thể chỉ rõ cách xử lý vấn đề này bằng code cụ thể không?
    cảm ơn rất nhiều

  6. #6
    Ngày gia nhập
    10 2009
    Nơi ở
    Close All
    Bài viết
    993

    Mặc định Màn hình bị giật khi vẽ hình, xử lý như thế nào?

    Ap dụng kĩ thuật Double Buffering là hết à.

  7. #7
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Hình giật là do quá trình xóa nền + vẽ. Xóa nền thực chất là vẽ một hình chữ nhật có kích thước to = màn hình/cửa sổ và tô màu trùng với màu nền. Sau khi xóa nền xong, ta mới bắt đầu vẽ hình đè lên cái nền ấy. Thời gian chênh lệch giữa 2 lần vẽ này tuy ko nhiều nhưng mắt người vẫn đủ tinh để nhận ra sự thay đổi hình ảnh trong khoảng thời gian ngắn đó và có cảm giác là hình bị nháy. Muốn hết nháy thì ta phải dùng buffer. Thực chất khi vẽ trong buffer, quá trình xóa nền + vẽ hình vẫn diễn ra. Nhưng những gì xảy ra trong buffer ko được thể hiện ra màn hình ngay mà phải đợi xong hết rồi người ta mới flush buffer ra màn hình.

    Code thì bạn ko cần phải kiếm đâu xa, có sẵn ngay trên những bài post trên rồi đó.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  8. #8
    Ngày gia nhập
    10 2009
    Nơi ở
    Close All
    Bài viết
    993

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Hình giật là do quá trình xóa nền + vẽ. Xóa nền thực chất là vẽ một hình chữ nhật có kích thước to = màn hình/cửa sổ và tô màu trùng với màu nền. Sau khi xóa nền xong, ta mới bắt đầu vẽ hình đè lên cái nền ấy. Thời gian chênh lệch giữa 2 lần vẽ này tuy ko nhiều nhưng mắt người vẫn đủ tinh để nhận ra sự thay đổi hình ảnh trong khoảng thời gian ngắn đó và có cảm giác là hình bị nháy. Muốn hết nháy thì ta phải dùng buffer. Thực chất khi vẽ trong buffer, quá trình xóa nền + vẽ hình vẫn diễn ra. Nhưng những gì xảy ra trong buffer ko được thể hiện ra màn hình ngay mà phải đợi xong hết rồi người ta mới flush buffer ra màn hình.

    Code thì bạn ko cần phải kiếm đâu xa, có sẵn ngay trên những bài post trên rồi đó.
    Đây chính là tư tưởng chính của Double Bufferring.
    P/S: Còn 1 cách nữa là bạn chuyển qua vẽ trên console là hết giật à. (đùa tí cho vui)

  9. #9
    Ngày gia nhập
    12 2009
    Nơi ở
    The country of happiness
    Bài viết
    182

    mình mở bằng visual studio 2008, khi debug thì báo lỗi , run file trong thư mục release thì báo lỗi thiếu file *.dll. Compile như thế nào vậy các bạn ?

  10. #10
    Ngày gia nhập
    03 2009
    Nơi ở
    %appdata%\Temp
    Bài viết
    819

    Còn 1 kĩ thuật nữa là page flipping. Cơ bản thì ý tưởng nó cũng giống Double Buffering. Tuy nhiên nó dùng 2 buffer gọi là front buffer và back buffer. Đầu tiên hình được vẽ vào front buffer. Con trỏ màn hình trỏ vào đây. Sau đó hình được vẽ vào back buffer rồi chuyển con trỏ qua buffer này. Cứ tuần tự như vậy.
    Page Flipping
    One drawback to using double buffering is the amount of time it takes to copy the back buffer to the screen. A display resolution of 800x600 at a bit depth of 16 takes 800x600x2 bytes, or 938KB. That's nearly a megabyte of memory that has to get shuffled around at 30 frames per second. Although copying that amount of memory is fast enough for many games, what if you didn't have to copy a buffer at all and could instantly make the back buffer the display buffer?

    You can: This technique is called page flipping. With page flipping, you use two buffers, one as a back buffer and the other as a display buffer
    The display pointer points to buffer being displayed. This display pointer can be changed on most modern systems. When you are finished drawing to the back buffer, the display pointer can be switched from the current display buffer to the back buffer, as in Figure 2.11. When the display pointer is changed, the display buffer instantly becomes the back buffer, and vice versa.
    Và cả 2 kĩ thuật này được sử dụng trong class BufferStrategy
    Good luck!
    PS: Trong bufferstrategy thì bạn có thể tạo ko chỉ 1, 2 mà có thể nhiều buffer hơn tùy vào yêu cầu chương trình. Các buffer sẽ quay vòng lần lượt
    Tạo nhiều buffer có nhược điểm là màn hình update chậm hơn những gì mình làm (đã tested by me, mình tạo 10 buffer và thấy nó chậm đi đáng kể thì mình di đổi hướng của sprite) tạo thành hiệu ứng trôi hơi giống quán tính (chỉ hơi giống thôi )
    .::[The best way to predict the future is to invent it]::.
    __________________________________________________ _ - Alan Kay -

Các đề tài tương tự

  1. Graphic Hình bị giật khi vẽ trong C#, xử lý như thế nào?
    Gửi bởi nhocjerry trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 9
    Bài viết cuối: 26-10-2012, 09:46 PM
  2. Làm thế nào để vẽ trong form không bị giật?
    Gửi bởi voicewithin trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 15
    Bài viết cuối: 25-04-2011, 08:55 AM
  3. Làm thế nào để xuất ảnh ra các định dạng ảnh từ giao diện đã vẽ!!!
    Gửi bởi vuduyhien trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 17-02-2011, 10:03 AM
  4. Vẽ lại form, màn hình giật, giải pháp nào để khắc phục?
    Gửi bởi khakha trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 15
    Bài viết cuối: 20-05-2010, 09:40 PM
  5. Dùng GDI+ vẽ mấy cái hình đơn giản + timer bị giật giật, làm sao khắc phục?
    Gửi bởi darkblackangel trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 8
    Bài viết cuối: 15-05-2009, 10:37 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn