2016-04-06 2 views
-1

Я использую 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() дает тот же указатель на средство визуализации, что и один из двух других вызовов, а эта часть кода (я знаю это благодаря консоли), и, наконец, он выполняется между двумя другими ничьей.

Может ли это быть причиной, почему все работает с аппаратным ускорителем рендеринга, а не с программным обеспечением?

Мой код состоит из тысяч строк кода, поэтому, если кто-то хочет, чтобы он мне помог, я могу дать его ему, но я не могу его здесь поместить.

Спасибо за помощь ^^

ответ

0

Проблема здесь:

if (SOFTWARE_RENDERING) SDL_UpdateWindowSurface(gWindow); 
else SDL_RenderPresent(gRenderer); 

Вы должны всегда вызов SDL_RenderPresent независимо от рендеринга драйвера.

+0

Благодарим за этот ответ, но он все еще не работает (я уже пробовал это) –

+0

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

Смежные вопросы