2011-12-21 28 views
6

Tôi hiện đang phát triển một dự án với SDL. Về cơ bản nó vẽ và di chuyển hình ảnh (bề mặt) trên màn hình.Cách nhanh nhất để xóa khối bộ nhớ (hoặc bề mặt SDL) là gì?

Để di chuyển hình ảnh mà không để lại đường nhỏ, trước tiên bạn phải xóa bề mặt màn hình , giống như glClear() và tôi đang làm việc đó với vòng lặp đơn giản trên bề mặt pixel (cũng vẽ một hộp đen trên bề mặt hoặc ghi nhớ).

Trong khi các giải pháp trước hoạt động tốt cho các bề mặt nhỏ, chúng ngày càng chậm hơn khi bề mặt phát triển lớn hơn vì vậy tôi đang tìm cách nhanh nhất có thể xóa (không) khối bộ nhớ.

Ngoài ra, một người bạn đã chỉ ra rằng việc sử dụng hướng dẫn SIMD có thể thực hiện công việc rất nhanh nhưng lần cuối tôi đã thực hiện ASM là trên 8085, bất kỳ thông tin chi tiết nào về điều này cũng có thể hữu ích.

Trả lời

13

Cách nhanh nhất là sử dụng memset.

memset(ptr, 0, length); 

Điều này tự động sử dụng SIMD trên kiến ​​trúc hỗ trợ nó *. Bạn sẽ không đánh bại nó. Nó đã được bộ nhớ bị ràng buộc, vì vậy nó viết zeroes nhanh như bộ vi xử lý có thể nhổ chúng ra. Tôi không biết ai nói với bạn rằng memset chậm hơn đối với các khối lớn hơn, nhưng bạn nên ngừng nghe người đó.

* Có một số thanh công cụ không cung cấp cho bạn nhanh memset. Có vẻ như bạn đang sử dụng nó.

+1

Thực ra, nó chỉ áp dụng cho các chức năng SDL, không kiểm tra kỹ lưỡng bộ nhớ. <* Có một số khung công cụ không cung cấp cho bạn một bộ nhớ nhanh> Một số móc khóa PIC MCU, ví dụ (không phải trường hợp rõ ràng) – NeonMan

+0

Vâng, hơi lạ khi chạy SDL trên một vi điều khiển PIC, sau khi tất cả, và PIC không có SIMD. –

+0

YMMV. Kinh nghiệm của tôi là memset thường khá chậm. Những người tôi đã nhìn vào nguồn cho chỉ làm bộ byte. Tôi đã có thành công lớn bằng văn bản của riêng tôi rằng (cho các khu vực lớn hơn) sử dụng viết lớn hơn cho các phần giữa (chỉ sử dụng viết nhỏ ở cuối như necesary). –

3

Bạn nên thử memset, việc triển khai phải được tối ưu hóa cao để tận dụng mọi hướng dẫn có sẵn trên hệ thống của bạn.

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