2016-04-06 9 views
-1

Ich benutze SDL2 und versuchte, ihre Software-Rendering anstelle ihrer Hardware Rendering zu verwenden. Bisher habe ich ihr Hardware-Rendering benutzt und alles super dargestellt. Es ist sehr wichtig für mich, ein Software-Rendering zu haben.SDL-Software-Renderer funktioniert nicht, arbeitet in Hardware beschleunigt

Die große Frage ist: Warum verhalten sich Software-Renderer und Hardware-Renderer anders? und wie man es repariert?

Hier ist mein Problem:

Deshalb habe ich SDL_CreateSoftwareRenderer einen Renderer creat, die auf eine Oberfläche macht und ich diese Fläche dann angezeigt werden, die in der Tat ist die Fensterfläche. (Ich brauche eine Oberfläche aus irgendeinem Grund ...).

Die Rendering dann in einer Schleife gemacht wird:

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); 

Die beiden Rechteck hier mit SDL_RenderFillRect(f->get_screen_render(), &rect); ziehen in Ordnung, aber in ectangles[i]->draw(this); Wenn ich das gleiche es nicht funktioniert, rufen Sie machen gezeichnet Ich meine, ich nenne

  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); 

in ectangles[i]->draw(this); und das Rechteck nicht zeichnen.

Beachten Sie, dass die drei Rechtecke von unterschiedlicher Größe sind, um die Unterschiede zu sehen, die klare Farbe ist nicht das gleiche wie die Farbe zeichnen, f->get_screen_render() gibt den gleichen Zeiger auf den Renderer wie der in den beiden anderen Aufruf, und diesen Teil der Code wird ausgeführt (ich weiß dies dank der Konsole), und schließlich wird zwischen den beiden anderen Zügen ausgeführt.

Könnte das ein Grund sein, warum alles mit dem hardwarebeschleunigten Renderer funktioniert und nicht mit der Software?

Mein Code besteht aus Tausenden von Codezeilen, also wenn jemand möchte, dass es mir hilft, kann ich es ihm geben, aber ich kann es nicht hier setzen.

Dank für die Hilfe ^^

Antwort

0

Das Problem ist hier:

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

Sie sollten immer Anruf SDL_RenderPresent unabhängig von der Rendering-Treiber.

+0

Vielen Dank für diese Antwort, aber es funktioniert immer noch nicht (Ich habe das schon versucht) –

+0

Sie sollten Ihre Entwicklungsumgebung beschreiben und ein paar Minuten Zeit nehmen, um ein kleines C-Programm zu schreiben, das das falsche Verhalten reproduziert. Dann wird es viel einfacher sein, Ihnen zu helfen. –