Xử lý pixel trong python trong thời gian thực, không cài thêm thư viện?

Mình có một pointer, pointer đó trỏ đến mảng thể hiện một tấm ảnh, mình chạy lặp xử lý thế này:

UINTP = ctypes.POINTER(ctypes.c_uint)
ptr = ctypes.cast(pixels_address, UINTP)
for y in range(0, 600):
   for x in range(0, 800):
      ptr[x + y * 800] = 0 # #00000000 không màu, trong suốt

Code chạy rất chậm, nếu bỏ vào vòng lặp game thì FPS còn có 10.
Vậy cho mình hỏi nếu chỉ dùng Python, dùng ctypes thôi thì có cách nào xử lý khối dữ liệu này một cách nhanh lẹ nhất không.

Thay vì lấy từng cái một, ta lấy một cụm thì sao?

Nhờ bạn giải thích thêm?

Mà cái biến ptr có phải là một list object không?
Nếu mà nó là một list object thì mình sẽ làm thế này nếu muốn change một loạt các giá trị một list

>>> a = [1, 2, 3, 4, 5]
>>> a
[1, 2, 3, 4, 5]
>>> a = [0] * len(a)
>>> a
[0, 0, 0, 0, 0
>>> b = [1, 2, 3, 4, 5]
>>> b[1:4] = [0] * (4 - 1)
>>> b
[1, 0, 0, 0, 5]

Không, ptr ở đây là con trỏ, trỏ đến array kiểu C, mỗi một phần tử có kích thước 4 byte, mỗi phần tử là mã màu của từng pixel.
pixels_address là offset của array đó trong bộ nhớ, mình cast nó sang kiểu của ctypes để có thể xài được nó như code.

Ấy mà độ phức tạp của các đoạn em đưa ra đều là O(n), O(n) * O(n) = O(n^2), khác gì như đoạn code trên.

–> 1 cách dễ hiểu: Bản chất của slicing, [u] * n,… vẫn là

lặp n lần:
    lst.append(u)
1 Like

:open_mouth: :smiley: uh huh em hiểu rồi.
Nhưng mà theo em nghĩ, nếu theo vấn đề này đưa ra, em nghĩ cách tốt nhất là lấy một một cụm gán luôn một thể thay vì từng phần tử. Nhưng vẫn chưa biết

Dĩ nhiên là chậm rồi! Bạn tưởng tượng trong 1 game loop, nó phải làm tất cả các việc sau đây:

  • Kiểm tra message đến từ các task trong game
  • Tính toán (vật lý, AI, sound…)
  • Kiểm tra message đến từ hệ thống windows, nếu có thì phải xử lý
  • Đưa dữ liệu xuống cho card đồ họa xử lý.
    Do đó đối với xử lý single thread, cho dù tối ưu cỡ nào thì nó cũng vẫn chậm, có 3 cách giải quyết:
  • Nâng cấp lên mô hình multithread
  • Đưa bớt việc xuống card đồ họa (GPU), rất thông dụng
  • Tiền xử lý (pre-processing) các task nặng nề như xử lý ảnh của bạn, lưu vào data để chạy real-time!
    Và dĩ nhiên, tất cả những thứ trên ko nên làm trên Python, mà phải đưa xuống C++ để làm, Python ko thích hợp để xử lý các công việc nặng nề như ảnh hay đồ họa!
5 Likes

Cảm ơn bạn, thế là mọi mong muốn của mình đều bất khả thi :sob:
Mình thử làm transition effect mới trong Ren’Py, nhưng thế này thì chịu rồi.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?