2015-06-01 4 views
1

Я работал с кодом для печати пикселей.Как получить высокую частоту кадров при использовании putpixel() в C?

// C код

#include<graphics.h> 
#include<conio.h> 

int main() 
{ 
    int gd = DETECT, gm; 

initgraph(&gd, &gm, "C:\\TC\\BGI"); 

for (int i=0;i<100;i++) 
    { 
    for(j=0;j<200;j++) 
    { 
    putpixel(i, j, GREEN); 
    } 
    } 

getch(); 
closegraph(); 
return 0; 
} 

Есть ли способ достижения более быстрый отклик от компилятора C при использовании putpixel() в этом коде? Скорость, с которой консоль окрашивается при выполнении putpixel(), довольно медленная, поэтому мне было интересно, есть ли какая-либо другая библиотека, которую я мог бы использовать для ускорения процесса пиксельных пикселей на экране, используя C в системе Windows или Linux один?

+0

Добро пожаловать в переполнение стека. Вопрос не должен быть запросом для библиотеки или программного обеспечения, поскольку они могут привести к спаму и многим мнимым ответам. – milesper

+0

см. [Графика в C/C++] (http://stackoverflow.com/a/21699076/2521214), поскольку вы используете BGI I can not help (не использовали его в течение 2 десятилетий), если вы собираетесь использовать что-то более новое, например GDI то просто создайте bitmap, чтобы получить указатель на его строки и использовать их как любой Array в C/C++. при выполнении рендеринга скопируйте растровое изображение сразу в видимую область (например, окно, ...), это также называется обратным буферизацией. Но вы, вероятно, все еще используете среду MS DOS, поэтому может быть прямой доступ к памяти. + VESA будет лучше, если ваша ОС не ограничивает ваш доступ к ней. – Spektre

+0

'putpixel()' не является стандартной функцией C; вам, возможно, нужно четко указать инструментарий и библиотеку, которую вы используете. Используете ли вы подлинную библиотеку BGI в 16-битном компиляторе Borland (кажется маловероятным) или вы используете эмуляцию Win32 Win32? В любом случае это будет относительно медленным, WinBGIm - это не более чем обтекатель API BGI для Win32 GDI под капотом. – Clifford

ответ

1

putpixel() довольно медленно, независимо от того, какую рамку или библиотеку вы используете. Попробуйте создать растровое изображение и вычислить адрес памяти каждого пикселя самостоятельно.

Межплатформенные рамки, которые позволяют вам делать такие вещи: SDL и Allegro.

Смотрите также:

+0

Спасибо Аарон. У меня нет большого опыта в этой области.Любой пример или ссылка, на которую я должен ссылаться во время работы над SDL? Другое дело, без включения какой-либо платформы кросс-платформы, есть ли какой-либо выход для вычисления адреса памяти и печати пикселя? – beginner

+0

Учебники для SDL: http://lazyfoo.net/SDL_tutorials/ Прямой доступ к памяти всегда зависит от оборудования. Существует не общий, кросс-платформенный способ сделать это. Но основная проблема заключается в настройке графической среды. Это тысячи строк кода - специфичная для платформы и в Linux, это зависит от дистрибутива и установленных драйверов и фреймворков. –

+0

Я предлагаю вам загрузить источник для SDL и посмотреть, как много усилий было бы «просто» создать графический контекст для визуализации. –

2

Боюсь, ответ почти всегда будет "не использовать putpixel()".

Проблема в том, что для достижения такой небольшой работы требуется много работы (однопиксельное изменение!), И вам нужно сделать это несколько десятков тысяч раз, прежде чем вы сделаете что-нибудь полезное.

В идеальном мире вы можете рассчитывать на то, что все это будет встраиваться и оптимизироваться до нужного вам, но если putpixel() обрабатывает множество различных форматов экрана (и из того, что я помню о BGI, это так), то это потребует очень маловероятные степени вставки и петли.

Что вы хотите сделать, это найти более высокоуровневую операцию, например putimage(), или в вашем простом примере bar(), который может достичь большего с помощью одного вызова функции.

Возможно, вы захотите перейти к чему-то более ориентированному на производительность, например SDL, но у вас все еще будет такая же фундаментальная проблема, если вы попытаетесь использовать вызов функции для каждого отдельного пикселя.