Что самый быстрый путь состоит в том, чтобы потянуть 2D массив цветных триплетов на экране?

Когда вы делаете это:

for i in data:

То же самое, что и это:

for i in data.keys():

Теперь вы видите, что переменная i является клавишей словаря, и, случается, string. Таким образом, вы не можете индексировать его, используя другую строку. Но на самом деле, зачем перебирать ключи, если вы уже знаете имя того, кто вас интересует? Вы можете удалить весь цикл! Я думаю, что вы хотели сделать это вместо:

if data['name'] == playerName:
9
задан Ciro Santilli 新疆改造中心法轮功六四事件 7 April 2016 в 22:07
поделиться

6 ответов

Самый быстрый способ потянуть 2D массив цветных триплетов:

  1. Используйте плавание (не байт, не дважды) устройство хранения данных. Каждый триплет состоит из 3 плаваний от 0,0 до 1,0 каждый. Это - формат, реализованный наиболее оптимально GPU (но шкала полутонов использования GL_LUMINANCE устройство хранения данных, когда Вам не нужен оттенок - намного быстрее!)
  2. Загрузите массив на структуру с glTexImage2D
  3. Удостоверьтесь что GL_TEXTURE_MIN_FILTER параметр структуры устанавливается на GL_NEAREST
  4. Отобразите структуру на соответствующую четверку.

Этот метод немного быстрее, чем glDrawPixels (который по некоторым причинам имеет тенденцию быть плохо реализованным), и намного быстрее, чем использование собственного блитирования платформы.

Кроме того, это дает Вам опцию неоднократно сделать шаг 4 без шага 2, когда Ваша пиксельная карта не изменилась, который, конечно, намного быстрее.

Библиотеки, которые обеспечивают только медленное собственное блитирование, включают:

  • GDI Windows
  • SDL на X11 (в Windows это обеспечивает быстрый opengl бэкенд при использовании HW_SURFACE),
  • QT

Относительно кадр/с можно ожидать, структура рисунка a 1024x768 на Intel Core 2 Duo с графикой Intel: приблизительно 60 футов в секунду, если структура изменяет каждый кадр и> 100 футов в секунду, если это не делает.

Но просто сделайте это сами и посмотрите ;)

9
ответ дан 4 December 2019 в 11:44
поделиться

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

Вот некоторый пример кода, надежда, можно использовать его.

#include <GL/glut.h>
#include <GL/glut.h>

#define WIDTH 1024
#define HEIGHT 768

unsigned char texture[WIDTH][HEIGHT][3];             

void renderScene() {    

    // render the texture here

    glEnable (GL_TEXTURE_2D);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glTexImage2D (
        GL_TEXTURE_2D,
        0,
        GL_RGB,
        WIDTH,
        HEIGHT,
        0,
        GL_RGB,
        GL_UNSIGNED_BYTE,
        &texture[0][0][0]
    );

    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f); glVertex2f(-1.0, -1.0);
        glTexCoord2f(1.0f, 0.0f); glVertex2f( 1.0, -1.0);
        glTexCoord2f(1.0f, 1.0f); glVertex2f( 1.0,  1.0);
        glTexCoord2f(0.0f, 1.0f); glVertex2f(-1.0,  1.0);
    glEnd();

    glFlush();
    glutSwapBuffers();
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);

    glutInitWindowPosition(100, 100);
    glutInitWindowSize(WIDTH, HEIGHT);
    glutCreateWindow(" ");

    glutDisplayFunc(renderScene);

    glutMainLoop();

    return 0;
}
6
ответ дан 4 December 2019 в 11:44
поделиться

При попытке вывести пиксели для экранирования, то Вы, вероятно, захотите использовать 'поверхность' sdl facuility. Для самой большой производительности попытайтесь принять меры, чтобы входные данные были в подобном расположении на выходную поверхность. Если возможно, избегайте устанавливать пиксели на поверхности по одному.

SDL не является аппаратным интерфейсом самостоятельно, а скорее слоем мобильности, который работает хорошо сверх многих других слоев дисплея, включая DirectX, OpenGL, DirectFB и xlib, таким образом, Вы получаете очень хорошую мобильность, и это - очень тонкий слой сверху тех технологий, таким образом, Вы платите очень мало производительности наверху сверху тех.

1
ответ дан 4 December 2019 в 11:44
поделиться

Другие опции кроме SDL (как упомянуто)

  • Каир появляется с блеском (в C, работах над всеми plaforms, но лучше всего в Linux)
  • Спокойный Холст (в C++, multiplaform)
  • Сырые данные OpenGL API или спокойный OpenGL (Необходимо знать openGL),
  • чистый Xlib/XCB, если Вы хотите принять во внимание non-opengl plaforms

Мое предложение

  1. QT, если Вы предпочитаете C++
  2. Каир, если Вы предпочитаете C
1
ответ дан 4 December 2019 в 11:44
поделиться

Сколько кадр/с я могу ожидать на 1024x768?

Ответ на тот вопрос зависит от такого количества факторов, которые невозможно сказать.

0
ответ дан 4 December 2019 в 11:44
поделиться

the "how many fps can i expect" question can not be answered seriously. not even if you name the grandpa of the guy who did the processor layouting. it depends on tooooo many variables.

  • how many triplets do you need to render?
  • do they change between the frames?
  • at which rate (you wont notice the change if its more often than 30times a sec)?
  • do all of the pixels changes all of the time or just some of the pixels in some areas?
  • do you look at the pixels without any perspective distortion?
  • do you always see all the pixels?
  • depending on the version of the opengl driver you will get different results

this could go on for ever, the answer depends absolutly on your algorithm. if you stick to the opengl approach you could also try different extensions (http://www.opengl.org/registry/specs/NV/pixel_data_range.txt comes to mind for example), to see if it fits your needs better; although the already mentioned glTexSubImage() method is quite fast.

1
ответ дан 4 December 2019 в 11:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: