Về cơ bản, bitmap 2D được hiển thị như thế nào?


9

Giả sử chúng ta có một máy tính có địa chỉ từ 64 bit và chúng ta muốn lập trình nó để xuất ra một ký tự 5x7 được lưu dưới dạng bitmap hình ảnh nhị phân (như cái bên dưới) sang màn hình ánh xạ bộ nhớ.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Vì chúng tôi có 5 x 7 = 35 pixel mỗi ký tự, chúng tôi có thể lưu trữ một ký tự bằng 35 bit trong một từ. Với bit có ý nghĩa ít nhất bắt đầu ở phía bên trái của từ và với mỗi pixel trong ảnh được biểu thị bằng bit thứ n như hình trên, số "3" ở trên sẽ được lưu trữ trong bộ nhớ là: 01110100010000100110000011000101110, sau đó là 29 không sử dụng bit được đặt thành 0.

Đây có phải là cách các ký tự được / được lưu trữ trong các máy tính cũ / hiện đại? Hay họ sử dụng một byte / từ trên mỗi pixel thay thế?

Nếu chúng được lưu trữ theo cách này, thì thói quen trong mã lắp ráp / mã máy (không sử dụng gì nhiều hơn các hướng dẫn cơ bản như bitwise, số học và các hoạt động vận chuyển dữ liệu từ Kiến trúc tập lệnh của máy tính) được sử dụng để chuyển đổi dữ liệu này thành hình ảnh trên Màn hình trông như thế nào? Nó sẽ là một cái gì đó như:

  1. Lưu trữ tọa độ hiển thị x và y cho pixel hiện tại sẽ được cập nhật trong một thanh ghi nhất định.
  2. Lưu trữ hai giá trị RGB đã chọn (trong trường hợp này là 0,255,0 cho màu xanh lá cây và 0,0,0 cho màu đen) trong hai thanh ghi riêng biệt khác.
  3. Có thêm hai thanh ghi hoạt động như các bộ đếm được khởi tạo thành 5 và 7 để theo dõi hàng và cột hiện tại của hình ảnh được hiển thị.
  4. Kiểm tra nếu thanh ghi cột không bằng 0. Nếu không, kiểm tra xem LSB của bitmap có được đặt thành 1 không, thì AND thanh ghi giá trị RGB tương ứng với thanh ghi tọa độ x và y tùy thuộc vào kết quả, sau đó MOV kết quả đó đến thanh ghi đầu ra hiển thị.
  5. Giảm thanh ghi bộ đếm hàng lên 1, kiểm tra xem nó có bằng 0. Nếu có, sau đó đặt nó trở lại 5 và tăng tọa độ y lên 1 và giảm bộ đếm cột thêm 1.
  6. Chuyển thanh ghi giữ bitmap 1 bit sang trái.
  7. JMP để hướng dẫn 4.

Có cách nào đơn giản hoặc hiệu quả hơn để làm điều này? Dường như thậm chí một thứ gì đó đơn giản như việc hiển thị một ký tự văn bản nhỏ chỉ mất khá nhiều thao tác và sẽ mất khoảng 200 chu kỳ CPU.

Cuối cùng, có bất kỳ cuốn sách hay tài nguyên tốt nào về mã cấp độ máy để hiển thị hình ảnh từ đầu không, vì tôi không thể tìm thấy bất kỳ thứ gì vì chúng che phủ chủ đề cụ thể này hoặc mã được viết bằng ngôn ngữ cấp cao hoặc một ngôn ngữ cấp cao trình biên dịch sử dụng macro, tất cả đều là "gian lận" và không giải thích điều gì về cơ bản đang diễn ra ở mức thấp nhất.


3
Các đồ họa Lập trình Black Book chắc chắn là một giá trị đọc cổ điển. Có rất nhiều ma thuật đen thời
xưa

Vâng, tôi thứ hai cuốn sách của Michael Abrash. Đó là quyển sách đáng đọc. Có rất nhiều mánh khóe hơn trong tay áo đối với những gì được viết trong cuốn sách này nhưng triết lý đằng sau nó rất quan trọng (ngay cả cho đến ngày nay!)
Romain Piquois

Câu trả lời:


7

Bạn phải phân biệt văn bản và chế độ đồ họa của bảng đồ họa của máy.

Ngày xưa, chủ yếu là chế độ văn bản được hỗ trợ. Trong chế độ này, hội đồng quản trị đã lưu trữ định nghĩa bitmap của các ký tự và hiển thị chúng ở vị trí con trỏ hiện tại. Tất cả những gì bạn phải làm là cung cấp mã ASCII của ký tự (một byte cho mỗi ký tự) trong một bộ đệm văn bản nhỏ.

Ngày nay, bộ đệm raster có độ phân giải cao được cung cấp, có thể truy cập pixel và bạn viết thông tin màu ở một số định dạng được hỗ trợ (ở chế độ "cao nhất", 3 byte (RGB) cho mỗi pixel, cho một megapixel hoặc hơn).

Ban đầu, các bitmap nhị phân đơn giản (được đóng gói) có kích thước khác nhau đã được sử dụng và " chuyển " sang bộ nhớ raster thông qua yêu cầu tới trình điều khiển thiết bị, với khả năng dịch định dạng.

Ngày nay, các ký tự hầu hết được định nghĩa là các bản vẽ vector , là một mô tả độc lập với độ phân giải của các phác thảo và cần phải trải qua một quá trình kết xuất phức tạp bao gồm khử răng cưa để có kết quả mượt mà.

Đầu ra được kết xuất có thể được lưu vào bộ nhớ cache để hiển thị nhanh, một lần nữa bằng cách xóa.

Quá trình tổng thể rất phức tạp, có thể được tăng tốc phần cứng và được xử lý bởi hệ điều hành (quản lý GUI) một cách minh bạch, cùng với các hoạt động vẽ nguyên thủy đồ họa khác.


1

Câu trả lời ngắn gọn là CÓ, bạn không thể tránh thực hiện nhiều thao tác bit nếu định dạng của bạn cần.

Vẽ một bitmap về cơ bản có nghĩa là sao chép một pixel từ một nguồn đến đích và bạn phải làm những gì nó cần để làm điều đó. (Trích dẫn đội trưởng rõ ràng)

Một câu trả lời dài hơn là nếu bạn viết một trình rasterizer phần mềm, bạn có thể có một số thuật toán và mẹo để tiết kiệm thời gian cpu của bạn (bằng cách biết phần nào bạn KHÔNG CẦN ĐẾN DRAW (tối ưu hóa độ trong suốt), bằng cách có định dạng pixel của nguồn giống nhau là đích (trực tiếp hoặc dưới dạng bộ đệm), thực hiện tối ưu hóa bản ghi nhớ, v.v ... Về cơ bản hãy xem xét vòng lặp vẽ của trình rasterizer của bạn và xem cách bạn có thể cấu trúc lại chúng để tiết kiệm thời gian của CPU. (Ví dụ: bạn có thể tạo khi chạy một đoạn mã trình biên dịch mã chỉ để in chữ A hoặc có meta vào thông tin bitmap nguồn của bạn để cho bạn biết cách bỏ qua vùng trong suốt, v.v.) Mỗi ​​trường hợp sử dụng có thể có một giải pháp khác nhau dựa trên tập lệnh CPU, định dạng bộ đệm, thuật toán kết xuất nguyên thủy của bạn (xoay vòng, kéo dài bitmap? loại lọc nào? v.v ...), thanh ghi CPU và bộ đệm, v.v ...

Vì vậy, dù sao đi nữa, nó TOOK rất nhiều chu kỳ CPU để ghi từng pixel vào thời xưa khi mã hóa lạ & bộ nhớ nhỏ là chuẩn mực. :-) Nhưng họ đã không cấm các máy 16/32 bit có CPU 8 MHZ để làm những việc như vậy: https://www.youtube.com/watch?v=GWwPJU6pp30 (Và một đoạn lớn CPU cũng được sử dụng cho âm nhạc)

Trong trường hợp kết xuất CTNH, CTNH sẽ thực hiện chuyển đổi từ định dạng nguồn sang định dạng đích và trong khi nó sẽ không sử dụng nhiều thủ thuật có sẵn cho trình raster SW, thì việc triển khai chung trong CTNH hầu như sẽ đánh bại hầu hết việc thực hiện SW.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.