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.
Bài liên quan
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ộtlist 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 listKhô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à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:
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:
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!
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.