01/10/2018, 11:04

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.

Henry viết 13:09 ngày 01/10/2018

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

明玉 viết 13:06 ngày 01/10/2018

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

Henry viết 13:12 ngày 01/10/2018

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]
明玉 viết 13:18 ngày 01/10/2018

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.

HK boy viết 13:13 ngày 01/10/2018

Ấ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)
Henry viết 13:19 ngày 01/10/2018

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

Nguyễn Phạm Anh Quân viết 13:19 ngày 01/10/2018

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!
明玉 viết 13:10 ngày 01/10/2018

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

Bài liên quan
0