Поскольку вы читаете и переписываете каждый пиксель, я думаю, что вы можете получить лучшее улучшение скорости, не используя Surface
.
Я предлагаю сначала взять ваше изображение 80x60 и преобразовать его в простой растровый файл с 32-битными пикселями. Затем считайте данные пикселей в объект python array
. Теперь вы можете перемещаться по объекту array
, считывать значения, вычислять новые значения и совмещать новые значения с максимальной скоростью. Когда закончите, сохраните ваше новое растровое изображение, а затем преобразуйте его в Surface
.
Вы также можете использовать 24-битные пиксели, но это должно быть медленнее. 32-битные пиксели означают, что один пиксель является одним 32-битным целочисленным значением, что значительно упрощает индексирование массива пикселей. 24-битные упакованные пиксели означают, что каждый пиксель составляет 3 байта, что намного раздражает при индексировании.
Я полагаю, что благодаря этому подходу вы получите гораздо большую скорость, чем пытаясь избежать использования for
. Если вы попробуете это, пожалуйста, напишите что-нибудь здесь, чтобы сообщить нам, насколько хорошо это работает или нет. Удачи.
РЕДАКТИРОВАТЬ: Я думал, что array
имеет только один индекс. Я не уверен, как вам удалось заставить работать два индекса. Я ожидал, что вы сделаете что-то вроде этого:
def __i(x, y):
assert(0 <= x < 80)
assert(0 <= y < 60)
i = (y*80 + x) * 4
return i
def red(x, y):
return __a[__i(x, y)]
def green(x, y):
return __a[__i(x, y) + 1]
def blue(x, y):
return __a[__i(x, y) + 2]
def rgb(x, y):
i = __i(x, y)
return __a[i], __a[i + 1], __a[i + 2]
def set_rgb(x, y, r, g, b):
i = __i(x, y)
_a[i] = r
_a[i + 1] = g
_a[i + 2] = b
# example:
r, g, b = rgb(23, 33)
Поскольку Python array
может содержать только один тип, вам нужно установить тип "unsigned byte", а затем индексировать, как я показал.
Где, конечно, __a
- фактическая array
переменная.
Если ничего из этого не помогло, попробуйте преобразовать ваше растровое изображение в список или, возможно, три списка. Вы можете использовать вложенные списки для получения 2D-адресации.
Надеюсь, это поможет. Если это не помогает, тогда я не понимаю, что вы делаете; если вы объясните больше, я постараюсь улучшить ответ.