Когда вы делаете это:
for i in data:
То же самое, что и это:
for i in data.keys():
Теперь вы видите, что переменная i
является клавишей словаря, и, случается, string
. Таким образом, вы не можете индексировать его, используя другую строку. Но на самом деле, зачем перебирать ключи, если вы уже знаете имя того, кто вас интересует? Вы можете удалить весь цикл! Я думаю, что вы хотели сделать это вместо:
if data['name'] == playerName:
Самый быстрый способ потянуть 2D массив цветных триплетов:
GL_LUMINANCE
устройство хранения данных, когда Вам не нужен оттенок - намного быстрее!)glTexImage2D
GL_TEXTURE_MIN_FILTER
параметр структуры устанавливается на GL_NEAREST
Этот метод немного быстрее, чем glDrawPixels
(который по некоторым причинам имеет тенденцию быть плохо реализованным), и намного быстрее, чем использование собственного блитирования платформы.
Кроме того, это дает Вам опцию неоднократно сделать шаг 4 без шага 2, когда Ваша пиксельная карта не изменилась, который, конечно, намного быстрее.
Библиотеки, которые обеспечивают только медленное собственное блитирование, включают:
Относительно кадр/с можно ожидать, структура рисунка a 1024x768 на Intel Core 2 Duo с графикой Intel: приблизительно 60 футов в секунду, если структура изменяет каждый кадр и> 100 футов в секунду, если это не делает.
Но просто сделайте это сами и посмотрите ;)
Я сделал это некоторое время назад использующее 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;
}
При попытке вывести пиксели для экранирования, то Вы, вероятно, захотите использовать 'поверхность' sdl facuility. Для самой большой производительности попытайтесь принять меры, чтобы входные данные были в подобном расположении на выходную поверхность. Если возможно, избегайте устанавливать пиксели на поверхности по одному.
SDL не является аппаратным интерфейсом самостоятельно, а скорее слоем мобильности, который работает хорошо сверх многих других слоев дисплея, включая DirectX, OpenGL, DirectFB и xlib, таким образом, Вы получаете очень хорошую мобильность, и это - очень тонкий слой сверху тех технологий, таким образом, Вы платите очень мало производительности наверху сверху тех.
Другие опции кроме SDL (как упомянуто)
Мое предложение
Сколько кадр/с я могу ожидать на 1024x768?
Ответ на тот вопрос зависит от такого количества факторов, которые невозможно сказать.
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.
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.