Двойная буферизация C++

399
22 июля 2017, 07:33

Написал пиксельную бегущую дорожку в c++, в которой вводишь текст и он в консольке бегает по кругу, по скольку строка бегущая то частота обновления экрана приблизительно 9 раз в секунду, понятно что это мерцание страшноватенько выглядит, и тут я пришёл к тому что мне нужно освоить двойную буферизацию. Но так как в интернете найти годную статью для чайника не получилось то обращяюсь к вам, помогите освоить двойную буферизацию с нуля. Зарание огромное спасибо !

#include "iostream"
#include "stdio.h"
#include "windows.h" 
#include "conio.h" 
#include "locale.h"
using namespace std;
void setcur(int x, int y)//установка курсора на позицию  x y 
{
    COORD coord;
    coord.X = x;
    coord.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
};
enum ConsoleColor
{
    Black = 0,
    Blue = 1,
    Green = 2,
    White = 15,
    Red = 4,
    Bluelight = 9,
    Yellow = 6,
};
void SetColor(ConsoleColor text, ConsoleColor background); //меняет цвет
void pix(int type, int x); //создаёт "пиксели"
void ramaup(); //верхняя рамка
void fir();  //левая часть динамической рамки
void firs(); //правая часть динамической рамки
void ramadown(); //нижняя рамка
void b(); //чёрный пиксель
void w(); //белый пиксель
void err(int x); //елая надпись еррор на синем фоне(найс отсылочка к синему экрану)))
void literki(int x, int y, char c); //главный пиксельный "словарь"
void vodA(); //заполнитесь массива
void dalabub(); //главная функция
int main()
{
    setlocale(LC_ALL, "RU");
    system("mode con cols=170 lines=60");
    vodA();
    dalabub();
    system("pause");
    return 0;
}

char begu[256];
int g, f;
void vodA()
{
    for (int k = 0; k < 10; k++)
    {
        begu[k] = ' ';
    }
    cout << "\t\t\n\n\n\nВведите текст для бегущей строки(русские буковы не понимать) :" << endl;
    char gg[230];
    cin.getline(gg, 230);
    int i = strlen(gg);
    f = i + 10;
    g = i + 20;
    for (int k = 10, j = i + 10, f = 0; k < j; k++, f++)
    {
        begu[k] = gg[f];
    }
    for (int k = i + 10, j = i + 20; k < j; k++)
    {
        begu[k] = ' ';
    }
    system("cls");
}
    void literki(int x, int y, char c)
    {
        if (c == ' ') {
            if (x == 1) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { w(); } }
            if (x == 2) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { w(); } }
            if (x == 3) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { w(); } }
            if (x == 4) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { w(); } }
            if (x == 5) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { w(); } }
            if (x == 6) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { w(); } }
            if (x == 7) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { w(); } }
        }
        if (c == '\0') {
            if (x == 1) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { w(); } }
            if (x == 2) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { w(); } }
            if (x == 3) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { w(); } }
            if (x == 4) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { w(); } }
            if (x == 5) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { w(); } }
            if (x == 6) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { w(); } }
            if (x == 7) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { w(); } }
        }
        if (c == 'A' || c == 'a') {
            if (x == 1) { if (y == 0) { w(); }if (y == 1) { w(); }if (y == 2) { b(); }if (y == 3) { b(); }if (y == 4) { b(); }if (y == 5) { w(); } }
            if (x == 2) { if (y == 0) { w(); }if (y == 1) { b(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { b(); } }
            if (x == 3) { if (y == 0) { w(); }if (y == 1) { b(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { b(); } }
            if (x == 4) { if (y == 0) { w(); }if (y == 1) { b(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { b(); } }
            if (x == 5) { if (y == 0) { w(); }if (y == 1) { b(); }if (y == 2) { b(); }if (y == 3) { b(); }if (y == 4) { b(); }if (y == 5) { b(); } }
            if (x == 6) { if (y == 0) { w(); }if (y == 1) { b(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { b(); } }
            if (x == 7) { if (y == 0) { w(); }if (y == 1) { b(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { b(); } }
        }
        if (c == 'B' || c == 'b') {
            if (x == 1) { if (y == 0) { w(); }if (y == 1) { b(); }if (y == 2) { b(); }if (y == 3) { b(); }if (y == 4) { b(); }if (y == 5) { w(); } }
            if (x == 2) { if (y == 0) { w(); }if (y == 1) { b(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { b(); } }
            if (x == 3) { if (y == 0) { w(); }if (y == 1) { b(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { b(); } }
            if (x == 4) { if (y == 0) { w(); }if (y == 1) { b(); }if (y == 2) { b(); }if (y == 3) { b(); }if (y == 4) { b(); }if (y == 5) { w(); } }
            if (x == 5) { if (y == 0) { w(); }if (y == 1) { b(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { b(); } }
            if (x == 6) { if (y == 0) { w(); }if (y == 1) { b(); }if (y == 2) { w(); }if (y == 3) { w(); }if (y == 4) { w(); }if (y == 5) { b(); } }
            if (x == 7) { if (y == 0) { w(); }if (y == 1) { b(); }if (y == 2) { b(); }if (y == 3) { b(); }if (y == 4) { b(); }if (y == 5) { w(); } }
        }
}
void SetColor(ConsoleColor text, ConsoleColor background)
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}
void pix(int type, int x)
{
    if (type == 0) { SetColor(Black, Black); for (int c = 0; c < x; c++) { cout << "ЫЫ"; } }
    if (type == 1) { SetColor(Black, Black); for (int c = 0; c < x; c++) { cout << "ЫЫ"; } cout << endl; }
    if (type == 2) { SetColor(White, White); for (int c = 0; c < x; c++) { cout << "ЫЫ"; } }
    if (type == 3) { SetColor(White, White); for (int c = 0; c < x; c++) { cout << "ЫЫ"; } cout << endl; }
    if (type == 4) { SetColor(Bluelight, Bluelight); for (int c = 0; c < x; c++) { cout << "ЫЫ"; } }
    if (type == 5) { SetColor(Bluelight, Bluelight); for (int c = 0; c < x; c++) { cout << "ЫЫ"; } cout << endl; }
    if (type == 6) { SetColor(Yellow, Yellow); for (int c = 0; c < x; c++) { cout << "ЫЫ"; } }
    if (type == 7) { SetColor(White, White); for (int c = 0; c < x; c++) { cout << "\tЫЫ"; } }
}
void ramaup()
{
    pix(3, 1); pix(3, 1); pix(3, 1);
    pix(7, 1); pix(2, 3); pix(4, 60); pix(3, 3);
    pix(7, 1); pix(2, 2); pix(4, 1); pix(6, 60); pix(4, 1); pix(3, 2);
    pix(7, 1); pix(2, 1); pix(4, 1); pix(6, 1); pix(4, 60); pix(6, 1); pix(4, 1); pix(3, 1);
    pix(7, 1); pix(4, 1); pix(6, 1); pix(4, 1); pix(2, 60); pix(4, 1); pix(6, 1); pix(4, 1); pix(3, 1);
}
void fir()
{
    pix(7, 1); pix(4, 1); pix(6, 1); pix(4, 1);
}
void firs()
{
    pix(4, 1); pix(6, 1); pix(4, 1); pix(3, 1);
}
void ramadown()
{
    pix(7, 1); pix(4, 1); pix(6, 1); pix(4, 1); pix(2, 60); pix(4, 1); pix(6, 1); pix(4, 1); pix(3, 1);
    pix(7, 1); pix(2, 1); pix(4, 1); pix(6, 1); pix(4, 60); pix(6, 1); pix(4, 1); pix(3, 1);
    pix(7, 1); pix(2, 2); pix(4, 1); pix(6, 60); pix(4, 1); pix(3, 2);
    pix(7, 1); pix(2, 3); pix(4, 60); pix(3, 3);
}
void b()
{
    pix(0, 1);
}
void w()
{
    pix(2, 1);
}
void err(int x)
{
    if (x == 1) { SetColor(Red, Blue); cout << "er"; }
    if (x == 2) { SetColor(Red, Blue); cout << "ro"; }
    if (x == 3) { SetColor(Red, Blue); cout << "re"; }
    if (x == 4) { SetColor(Red, Blue); cout << "rr"; }
    if (x == 5) { SetColor(Red, Blue); cout << "or"; }
}
void dalabub()
{
    for (int k = 0; k < f; k++)
    {
        for (int i = 0, o = 0; i <= 5; i++, o++)//сдвиг
        {
            ramaup();
            for (int l = 1; l <= 7; l++)//уровень (х)
            {
                fir();
                for (int j = i; j <= 5; j++) //сдвигающеяся передняя
                {
                    literki(l, j, begu[k]);
                }
                for (int h = 0, p = k + 1; h < 9; h++, p++)//9 букв "целых"
                {
                    for (int e = 0; e <= 5; e++) //пиксельки
                    {
                        literki(l, e, begu[p]);
                    }
                }
                for (int v = 0; v < o; v++)
                {
                    literki(l, v, begu[k + 10]);
                }
                firs();
            }
            ramadown();
            setcur(0,0);
        }
    }
    dalabub();
}
Answer 1

Ну заведи два массива - один для текущего кадра, второй для следующего. сначала подготавливаешь второй кадр, как обычно записывешь. Когда кадр готов, можно начинать его рисовать на экран, но при этом не надо рисовать все символы(элементы), нужно сравнивать следующий кадр с текущим и рисовать только то, что отличается. Затем своп массивов и далее по кругу, никаких cls внутри цикла. только не нужно рекурсии как в

void dalabub(){
    ...
    dalabub();
}

будет что-то вроде

for(;;){
    draw_to_buffer();
    draw_buffer();
    swap_buffer();
}
READ ALSO
Определить в Jquery (Обработчик событии) когда создается scrolling прокрутка

Определить в Jquery (Обработчик событии) когда создается scrolling прокрутка

Есть обработчик onscrollСобытие onscroll происходит, когда элемент прокручивается

253
Как запустить таймер, а потом отключить его?

Как запустить таймер, а потом отключить его?

Есть событие <button onclick='start()'>Старт</button> и <button onclick='stop()'>Стоп</button>

270
tree for PHP/JS

tree for PHP/JS

нужно реализовать дерево, с возможность (добавление/изменение/перемещение/удаление элемента), можно использовать jquery, плагины к нему и/или...

202