Python + sdl2: список или байтовый массив для c_void_p - PullRequest
0 голосов
/ 01 мая 2020

В настоящее время я пишу эмулятор Gameboy в Python. Я хочу использовать pysdl2 для вывода графики c.

У меня есть список значений RGB (3 значения на пиксель, поэтому этот список имеет размер 256x256x3). Это фон, а не то, что будет отображаться на реальном экране.

Прямые манипуляции с пикселями слишком медленные, поэтому я подумал об использовании sdl2.SDL_UpdateTexture для обновления всей текстуры сразу. Но я не могу преобразовать свой список в необходимый тип c_void_p. Есть простой способ сделать это? Или есть лучший способ достичь достаточного количества FPS? Я не думал, что будет так сложно обновлять изображение 60 раз в секунду.

Короткий пример:

import sdl2


pic = [0xff] * 256*256*3

window = sdl2.SDL_CreateWindow(b"Gameboy Emulator", 256, 256, 256, 256, sdl2.SDL_WINDOW_SHOWN)
renderer = sdl2.SDL_CreateRenderer(window, -1, 0)
texture = sdl2.SDL_CreateTexture(renderer, sdl2.SDL_PIXELFORMAT_RGB888, sdl2.SDL_TEXTUREACCESS_STATIC, 256, 256)

Я попробовал следующее:

pic_as_string = "".join(map(chr, pic))
pointer = cast(c_char_p(pic_as_string), c_void_p)

sdl2.SDL_UpdateTexture(texture, None, pointer, 3*256)

Я сейчас использую pypy3, если это уместно.

...