Быстрая настройка пикселей - PullRequest
8 голосов
/ 19 августа 2011

Я искал и искал хороший ответ, и вот-вот заплачу от разочарования. Я программист-любитель, я не делаю вещи, потому что они имеют смысл, или они являются правильным способом сделать это; Я делаю их, чтобы узнать, как, и сейчас я в тупике.

Я хочу установить отдельные пиксели на экране. Это может показаться легким, но другие мои условия затрудняют это. Мне нужно сделать это быстро, только для процессора, 20 кадров в секунду или лучше (с другими запущенными элементами программы, конечно), на экране 400 на 300 или лучше (полный экран?).

Я рендерил некоторые классные изображения, используя программы, написанные на Python, которые используют Pygame, но требуется 50 миллисекунд, чтобы заполнить экран 100 на 100 пикселей случайными пикселями (это мои 20 кадров в секунду, и другие биты программы замедляют его вниз больше). В идеале я ЛЮБЛЮ, чтобы сделать свою собственную (дрянную) 3D-игру, которая использует только процессор, устанавливая пиксели на экране (возможно, воксельная графика).

Есть ли какой-нибудь способ (с любым языком, но предпочтительно Python), который мне может понравиться, создать двумерный массив значений пикселей (более похожий на трехмерный массив с RGB) (это называется растровым изображением?) В ОЗУ и выгрузить его на на дисплей или что-то? Разве это не было бы быстро ??? Как вы взаимодействуете непосредственно с пикселями в окне. Argh! Я такой невежественный. Я не программист нуб. Дайте мне все, что вы можете бросить в меня, я могу переварить это. Мне просто нужно несколько указателей (хаха) в правильном направлении.

Ответы [ 5 ]

4 голосов
/ 19 августа 2011

Если вы хотите создать свою собственную «для каждого пикселя» математику (в отличие от простого перемещения кругов и растровых изображений), вам придется делать это на C (или C ++), чтобы приблизиться к скорости машины.

С другой стороны, если вы хотите создать полноценную игру, писать все это на низкоуровневом языке, таком как C., будет неинтересно. Вам нужно будет объединить быстрый C-код с некоторым высокоуровневымскриптовый язык.С помощью Python вы можете соединиться с модулем расширения C через numpy, или вы можете встроить такой язык, как Lua, в код C, или вы можете попытаться (о ужас) изучить высокоуровневое кодирование на C ++.В любом случае все усложняется.

Если вы просто хотите поиграть с быстрым рендерингом пикселей, я рекомендую использовать SDL (это то, что Pygame использует внутри), но только с C или C ++.Следуйте учебнику, подобному этому , и повеселитесь.

Если вы хотите остаться в комфорте Python, я советую сначала попробовать 2D-игру (загрузка и перемещение по растровым изображениям) илиЭксперимент с Каиром (рендеринг геометрических фигур).

3 голосов
/ 22 августа 2011

Я могу получить более 20 кадров в секунду с разрешением (1920,1080) с помощью Pygame.

Как указал Маллет, вы должны использовать функцию pygame.surfarray.blit_array (), чтобы скопировать данные пикселей в pygame, а затем обновить экран вызовом pygame.display.flip ().

>>> import timeit
>>> timeit.timeit('pygame.surfarray.blit_array(screen, pixels);pygame.display.flip()', setup='import pygame;import numpy as np;size=(1920,1080);screen=pygame.display.set_mode(size);pixels=np.random.randint(np.iinfo(np.uint32).max,size=size).astype(np.uint32)', number=20)
0.6346819400787354
>>> timeit.timeit("""
... pygame.surfarray.blit_array(screen, pixels)
... pygame.display.flip()
... """,setup="""
... import pygame
... import numpy as np
... size=(1920,1080)
... screen=pygame.display.set_mode(size)
... pixels=np.random.randint(np.iinfo(np.uint32).max,size=size).astype(np.uint32)
... """, number=20)
0.4848361015319824
1 голос
/ 21 августа 2011

Что вы действительно хотите сделать для PyGame - это использовать pygame.surfarray или pygame.pixelarray.После того, как вы установите значения в массиве, вы скопируете их все сразу.Если вы прочтете документацию о surface.set_at (...), которая устанавливает пиксели индивидуально, вы увидите, что это не рекомендуется для всех, кроме самых маленьких задач.на основе NumPy или Numeric (используйте NumPy).Googling производит http://pygame.org/docs/tut/surfarray/SurfarrayIntro.html,, который даст вам общий обзор некоторых замечательных вещей, которые вы можете сделать.

0 голосов
/ 19 августа 2011

Вы должны посмотреть на bitblit , хотя я не делал бит-блитов в python, поиск в Google дал многообещающие результаты. Вот связанное обсуждение от Графических камней стр.134 , где они обсуждают аналогичную проблему.

0 голосов
/ 19 августа 2011

Blockquote. Есть ли какой-нибудь способ (с любым языком, но предпочтительно Python), который мне может понравиться, создать двумерный массив значений пикселей (более похожий на трехмерный массив с RGB) (это называется растровым изображением?) В ОЗУи сбросить его на дисплей или еще что-нибудь?

Да, это называется Frame Buffer .Вы рисуете растровое изображение в памяти, а затем меняете его в памяти дисплея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...