SDL oluşturucu nedir?


104

SDL2 ile başlıyorum ve SDL_Renderer'ın ne olduğunu anlamaya çalışırken bazı sorunlar yaşıyorum.

Bu ne? Bu ne işe yarıyor? SDL_Renderer, SDL_Window, SDL_Surface ve SDL_Texture arasındaki fark nedir ve nasıl ilişkilidir?

Bu giriş kodunu anlamaya çalışırken bununla ilgili sorunlar yaşadım:

#include <iostream>
#include <SDL2/SDL.h>

int main()
{
    /* Starting SDL */
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Create a Window */
    SDL_Window *window = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);
    if (window == nullptr) {
        std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Create a Render */
    SDL_Renderer *render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (render == nullptr) {
        std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Load bitmap image */
    SDL_Surface *bmp = SDL_LoadBMP("./Tutorial/res/Lesson1/hello.bmp");
    if (bmp == nullptr) {
        std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Upload surface to render, and then, free the surface */
    SDL_Texture *texture = SDL_CreateTextureFromSurface(render, bmp);
    SDL_FreeSurface(bmp);
    if (texture == nullptr){
        std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
        return 1;
    }

    /* Draw the render on window */
    SDL_RenderClear(render); // Fill render with color
    SDL_RenderCopy(render, texture, NULL, NULL); // Copy the texture into render
    SDL_RenderPresent(render); // Show render on window

    /* Wait 2 seconds */
    SDL_Delay(5000);

    /* Free all objects*/
    SDL_DestroyTexture(texture);
    SDL_DestroyRenderer(render);
    SDL_DestroyWindow(window);

    /* Quit program */
    SDL_Quit();
    return 0;
}

Twinklebear öğreticisini (SDL Wiki'de önerilen) kullanıyordum ve ayrıca SDL Wiki Belgelerine ve bazı kitaplara da baktım. Ama hepsi bu tanımları bildiğimi varsayıyor.

Yanıtlar:


197

SDL_Window

SDL_Window Pencerenin kendisi hakkındaki tüm bilgileri tutan yapıdır: boyut, konum, tam ekran, kenarlıklar vb.


SDL_Renderer

SDL_Renderertüm oluşturmayı işleyen bir yapıdır. A'ya bağlıdır, SDL_Windowböylece yalnızca bunun içinde render edebilir SDL_Window. Ayrıca, işleme ile ilgili ayarları da takip eder. Bağlı birkaç önemli işlev vardır.SDL_Renderer

  • SDL_SetRenderDrawColor(renderer, r, g, b, a);
    Bu, ekranı temizlediğiniz rengi ayarlar (aşağıya bakın)

  • SDL_RenderClear(renderer);
    Bu, oluşturma hedefini yukarıdaki çizim rengiyle temizler.

  • SDL_RenderCopy(
    Bu muhtemelen en çok kullanacağınız işlevdir, a oluşturmak için kullanılır SDL_Textureve aşağıdaki parametrelere sahiptir:

    • SDL_Renderer* renderer,
      Oluşturmak için kullanmak istediğiniz oluşturucu.
    • SDL_Texture* texture,
      İşlemek istediğiniz doku.
    • const SDL_Rect* srcrect, Tüm dokuyu işlemek istiyorsanız, işlemek istediğiniz dokunun kısmı NULL
    • const SDL_Rect* dstrect)
      Pencerede dokuyu oluşturmak istediğiniz yer. Bunun genişliği ve yüksekliği SDL_Rectdokunun kendisinin boyutlarından daha küçük veya daha büyükse, doku buna göre gerilecektir.SDL_Rect
  • SDL_RenderPresent(renderer);
    Diğer SDL_Render * işlevleri, gizli bir hedefe çeker. Bu işlev tüm bunları alacak ve oluşturucuya bağlı pencereye çizecektir.

SDL_Textures ve SDL_Surface

SDL_RendererKılan SDL_Texturebir elementin piksel bilgiyi saklayan,. Yeni versiyonu SDL_Surfacehemen hemen aynı. Aradaki fark çoğunlukla SDL_Surfacesadece bir structpiksel bilgisi içerirkenSDL_Texture , piksel verilerinin verimli, sürücüye özgü bir temsilidir.

Bir SDL_Surface * 'i kullanarak SDL_Texture'a dönüştürebilirsiniz:

SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
                                          SDL_Surface*  surface)

Bundan sonra, SDL_Surface kullanılarak serbest bırakılmalıdır.

SDL_FreeSurface( SDL_Surface* surface )

Bir diğer önemli fark, donanım oluşturmayı (GPU aracılığıyla SDL_Surface) kullanırken yazılım oluşturmayı (CPU SDL_Texturearacılığıyla) kullanmasıdır.


SDL_Rect

SDL'deki en basit yapı. Sadece dört şort içerir. x, yKonumu w, htutan ve genişliği ve yüksekliği tutan.

Bunun 0, 0SDL'de sol üst köşenin olduğuna dikkat etmek önemlidir . Dolayısıyla, daha yüksek bir değer daha ydüşük anlamına gelir ve sağ alt köşede koordinat olurx + w, y + h


Blogumda SDL2 hakkında daha fazla bilgi edinebilirsiniz .


1
Öyleyse, SDL_RenderPresent adını verdiğinizde, o oluşturucuyu kendisine yüklenen tüm ayarları ve dokularıyla alıp, bağlı olduğu Pencerede bu bilgileri işlemesini sağlamaktır?
prcastro

3
@olevegard, harika cevap. SDL_Texture ve SDL_Surface arasındaki farkı açıklığa kavuşturmak için, SDL_Texture'ın GPU kullanarak işlediğini ve SDL_Surface'in daha az verimli olan ancak piksel bilgilerini serbestçe değiştirmenize izin veren yazılım yeniden işleme kullandığını vurgulamak isterim. Ayrıca harika blog, kesinlikle okuyacağım :)
Fabio Picchi

İfadesi "Bu, yukarıda beraberlik renk seti ile render hedefi temizler" , inanıyorum, doğrudur ama açıklamada ifade "berraklaşır," anlamak için veremiyoruz. Doc her zaman bu cümleyi kullanır. Burada "açık" ın tam olarak ne anlama geldiğini açıklar mısınız? Oluşturucunun mevcut çizim rengiyle "boyama" (sıralama) anlamına mı geliyor?
Nawaz

Kullanmak için herhangi bir neden var mı SDL_Surfaceüzerinde SDL_Renderer?
Stevoisiak

En üstteki cevap bazı yanlışlıklar içeriyor, SDL_Renderer sadece pencereye değil, yüzeye de bağlanabilir, lütfen bağlantıyı kontrol edin: wiki.libsdl.org/SDL_CreateSoftwareRenderer
dmitro

9

SDL_WindowFiziksel pikseller ve SDL_Rendererayarları / bağlamı depolamak için bir yer olarak düşünün .

Böylece bir sürü kaynak oluşturup bunları oluşturucuya asarsınız; ve sonra hazır olduğunda, renderer'a hepsini bir araya getirmesini ve sonuçları pencereye göndermesini söylersiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.