Я использую sdl2 и пытаюсь использовать их рендеринг программного обеспечения istead их аппаратного рендеринга. До сих пор я использовал их аппаратное рендеринг, и все выглядело отлично. Для меня очень важно иметь программный рендеринг.sdl программный рендерер не работает, работает в аппаратном ускоренном режиме
Большой вопрос: почему программный рендерер и аппаратный рендеринг ведут себя по-другому? и как это исправить?
Вот моя проблема:
Поэтому я использовал SDL_CreateSoftwareRenderer
создающие рендерер, который визуализирует на поверхность, а затем отобразить эту поверхность, которая на самом деле поверхность окна. (Мне почему-то нужна поверхность ...).
Рендеринг Затем выполняется в цикле:
SDL_SetRenderDrawColor(gRenderer, 0XFF, 0XFF, 0X00, 0XFF);
SDL_RenderClear(gRenderer);
SDL_SetRenderDrawColor(gRenderer, 0X0F, 0X00, 0XF0, 0XFF);
SDL_SetRenderDrawColor(gRenderer, 0X0F, 0X00, 0XF0, 0XFF);
SDL_Rect rect;
rect.x = 0;
rect.y = 5;
rect.w = 10;
rect.h = 2;
SDL_RenderFillRect(gRenderer, &rect);
std::cout << "begin" << std::endl;
for (auto& i : zIndexOrder) {
//Rectangles[i]->get_x();
Rectangles[i]->updat_move_fnct();
if (Rectangles[i]->everyframe_fct != NULL)Rectangles[i]->everyframe_fct(Rectangles[i]);
//Rectangles[i]->index_th = i;
}
for (auto u : Underwindows)u->Refresh();
for (auto& i : zIndexOrder)Rectangles[i]->draw(this);
SDL_SetRenderDrawColor(gRenderer, 0X0F, 0X00, 0XF0, 0XFF);
rect.x = 0;
rect.y = 5;
rect.w = 5;
rect.h = 5;
SDL_RenderFillRect(gRenderer, &rect);
std::cout << "true RENDERER " << gRenderer << std::endl;
if (SOFTWARE_RENDERING) SDL_UpdateWindowSurface(gWindow);
else SDL_RenderPresent(gRenderer);
Два прямоугольника обращается здесь с SDL_RenderFillRect(f->get_screen_render(), &rect);
рисовать хорошо, но, в ectangles[i]->draw(this);
Если я сделать то же самое называют это не работает, я имею в виду я называю
SDL_SetRenderDrawColor(f->get_screen_render(), 0X0F, 0X00, 0XF0, 0XFF);
SDL_Rect rect;
rect.x = 6;
rect.y = 5;
rect.w = 10;
rect.h = 55;
SDL_RenderFillRect(f->get_screen_render(), &rect);
в ectangles[i]->draw(this);
и прямоугольник не рисует.
Обратите внимание, что три прямоугольника имеют разный размер, чтобы увидеть различия, четкий цвет не совпадает с цветом ничьей, f->get_screen_render()
дает тот же указатель на средство визуализации, что и один из двух других вызовов, а эта часть кода (я знаю это благодаря консоли), и, наконец, он выполняется между двумя другими ничьей.
Может ли это быть причиной, почему все работает с аппаратным ускорителем рендеринга, а не с программным обеспечением?
Мой код состоит из тысяч строк кода, поэтому, если кто-то хочет, чтобы он мне помог, я могу дать его ему, но я не могу его здесь поместить.
Спасибо за помощь ^^
Благодарим за этот ответ, но он все еще не работает (я уже пробовал это) –
Вы должны описать свою среду разработки и немного времени, чтобы написать небольшую программу на C, которая воспроизводит неправильное поведение. Тогда вам будет намного легче помочь. –