@Quark_Hell
C++ программист

Как мне ускорить процесс взаимодействия с консолью?

Недавно я написал свою графическую библиотеку,которая помогает мне рисовать объекты в консоле.Однако, как я заметил,на весь процесс "рендера" уходит не более 80 мс,а вот такие команды как printf и SetConsoleColour,а так-же SetConsoleCursorPosition замедляют время работы более чем в 2 РАЗА!!!.Я перепробовал множество альтернатив команды printf(а именно она больше всего замедляет время выполнения),но ни одна из них никак не повлияла на время рендера.Как я могу это ускорить?

Вот мой код:
https://pastebin.com/8LeFA2Lv

//TODO:Make render relatively camera position
public:
    __declspec(dllexport) static bool RenderFrame(Camera camera) {
 
        for (size_t y = 0; y < ScreenClass::SizeY; y++)
        {
            for (size_t x = 0; x < ScreenClass::SizeX; x++)
            {
                bool IsDraw = false;//Костыль
 
                Vector2 currentPos;
                currentPos.x = x;
                currentPos.y = y;
 
                ConsoleInfo::SetCursorPosition({ static_cast<SHORT>(currentPos.x), static_cast<SHORT>(currentPos.y) });
 
                for (size_t z = 0; z < SpriteObject::AllSpriteObjects.size(); z++)
                {
                    vector<Vector2> triangles = SpriteObject::AllSpriteObjects[z]->Mesh.Triangles;
 
                    for (size_t t = 0; t < triangles.size(); t += 3)
                    {
                        float x1 = ((triangles[t].x + SpriteObject::AllSpriteObjects[z]->Position->x) - currentPos.x) * ((triangles[t + 1].y + SpriteObject::AllSpriteObjects[z]->Position->y) - (triangles[t].y + SpriteObject::AllSpriteObjects[z]->Position->y)) - ((triangles[t + 1].x + SpriteObject::AllSpriteObjects[z]->Position->x) - (triangles[t].x + SpriteObject::AllSpriteObjects[z]->Position->x)) * ((triangles[t].y + SpriteObject::AllSpriteObjects[z]->Position->y) - currentPos.y);
                        float x2 = ((triangles[t + 1].x + SpriteObject::AllSpriteObjects[z]->Position->x) - currentPos.x) * ((triangles[t + 2].y + SpriteObject::AllSpriteObjects[z]->Position->y) - (triangles[t + 1].y + SpriteObject::AllSpriteObjects[z]->Position->y)) - ((triangles[t + 2].x + SpriteObject::AllSpriteObjects[z]->Position->x) - (triangles[t + 1].x + SpriteObject::AllSpriteObjects[z]->Position->x)) * ((triangles[t + 1].y + SpriteObject::AllSpriteObjects[z]->Position->y) - currentPos.y);
                        float x3 = ((triangles[t + 2].x + SpriteObject::AllSpriteObjects[z]->Position->x) - currentPos.x) * ((triangles[t].y + SpriteObject::AllSpriteObjects[z]->Position->y) - (triangles[t + 2].y + SpriteObject::AllSpriteObjects[z]->Position->y)) - ((triangles[t].x + SpriteObject::AllSpriteObjects[z]->Position->x) - (triangles[t + 2].x + SpriteObject::AllSpriteObjects[z]->Position->x)) * ((triangles[t + 2].y + SpriteObject::AllSpriteObjects[z]->Position->y) - currentPos.y);
 
                        if (x1 >= 0 && x2 >= 0 && x3 >= 0)
                        {      
                            ConsoleInfo::SetConsoleColour(SpriteObject::AllSpriteObjects[z]->Color);
                            IsDraw = true;//Костыль
                            printf(&SpriteObject::AllSpriteObjects[z]->Texture);
                            break;
                        }
                        else if (x1 <= 0 && x2 <= 0 && x3 <= 0)
                        {
                            ConsoleInfo::SetConsoleColour(SpriteObject::AllSpriteObjects[z]->Color);
                            IsDraw = true;//Костыль
                            printf(&SpriteObject::AllSpriteObjects[z]->Texture);
                            break;
                        }
                    }
                }
                if (IsDraw == false)
                {
                    printf(" ");
                }
            }
        }
        return true;
    }
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Я перепробовал множество альтернатив команды printf

вызовы функции printf(…) в этом коде вообще выглядят чужеродно, правильно было бы заменить их на fputs(…, stdout).

Как я могу это ускорить?

думаю, что никак: консольный вывод под виндой нетороплив по своей природе.
Ответ написан
@Airog
Вам нужно копать в сторону WinApi, в частности использовать функцию WriteConsole.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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