SDL renderer คืออะไร?


104

ฉันเริ่มต้นด้วย SDL2 และมีปัญหาในการพยายามทำความเข้าใจว่า SDL_Renderer คืออะไร

มันคืออะไร? มันทำอะไร? อะไรคือความแตกต่างระหว่าง SDL_Renderer, SDL_Window, SDL_Surface และ SDL_Texture และเกี่ยวข้องกันอย่างไร

ฉันมีปัญหากับสิ่งนี้เมื่อพยายามทำความเข้าใจรหัสเบื้องต้นนี้:

#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 (แนะนำใน SDL Wiki) และดูเอกสาร SDL Wiki และหนังสือบางเล่มด้วย แต่พวกเขาทั้งหมดคิดว่าฉันรู้คำจำกัดความเหล่านี้

คำตอบ:


197

SDL_Window

SDL_Window เป็นโครงสร้างที่เก็บข้อมูลทั้งหมดเกี่ยวกับหน้าต่าง: ขนาดตำแหน่งเต็มหน้าจอเส้นขอบ ฯลฯ


SDL_Renderer

SDL_Rendererเป็นโครงสร้างที่จัดการการแสดงผลทั้งหมด มันเชื่อมโยงกับ a SDL_Windowเพื่อให้สามารถแสดงผลภายในนั้นSDL_Windowได้เท่านั้น นอกจากนี้ยังติดตามการตั้งค่าที่เกี่ยวข้องกับการแสดงผล มีฟังก์ชันสำคัญหลายอย่างที่เชื่อมโยงกับไฟล์SDL_Renderer

  • SDL_SetRenderDrawColor(renderer, r, g, b, a);
    ตั้งค่าสีที่คุณล้างหน้าจอเป็น (ดูด้านล่าง)

  • SDL_RenderClear(renderer);
    วิธีนี้จะล้างเป้าหมายการแสดงผลด้วยสีวาดที่กำหนดไว้ด้านบน

  • SDL_RenderCopy(
    นี่อาจเป็นฟังก์ชันที่คุณจะใช้บ่อยที่สุดใช้สำหรับการแสดงผล a SDL_Textureและมีพารามิเตอร์ต่อไปนี้:

    • SDL_Renderer* renderer,
      ตัวแสดงผลที่คุณต้องการใช้สำหรับการเรนเดอร์
    • SDL_Texture* texture,
      พื้นผิวที่คุณต้องการแสดง
    • const SDL_Rect* srcrect, ส่วนของพื้นผิวที่คุณต้องการแสดงผลเป็น NULL หากคุณต้องการแสดงพื้นผิวทั้งหมด
    • const SDL_Rect* dstrect)
      ตำแหน่งที่คุณต้องการแสดงพื้นผิวในหน้าต่าง หากความกว้างและความสูงของสิ่งนี้SDL_Rectเล็กหรือใหญ่กว่าขนาดของพื้นผิวพื้นผิวจะยืดออกตามนี้SDL_Rect
  • SDL_RenderPresent(renderer);
    ฟังก์ชัน SDL_Render * อื่น ๆ จะดึงไปยังเป้าหมายที่ซ่อนอยู่ ฟังก์ชั่นนี้จะใช้เวลาทั้งหมดและวาดในหน้าต่างที่เชื่อมโยงกับตัวแสดงผล

SDL_Textures และ SDL_Surface

การSDL_RendererแสดงผลSDL_Textureซึ่งเก็บข้อมูลพิกเซลขององค์ประกอบหนึ่ง เป็นเวอร์ชันใหม่SDL_Surfaceที่เหมือนกันมาก ความแตกต่างส่วนใหญ่SDL_Surfaceเป็นเพียงstructข้อมูลพิกเซลที่มีในขณะที่SDL_Textureการแสดงข้อมูลพิกเซลเฉพาะไดรเวอร์ที่มีประสิทธิภาพ

คุณสามารถแปลง SDL_Surface * เป็น SDL_Texture โดยใช้ไฟล์

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

หลังจากนี้ SDL_Surface ควรเป็นอิสระโดยใช้

SDL_FreeSurface( SDL_Surface* surface )

ข้อแตกต่างที่สำคัญอีกประการหนึ่งคือการSDL_Surfaceใช้การเรนเดอร์ซอฟต์แวร์ (ผ่าน CPU) ในขณะที่SDL_Textureใช้การเรนเดอร์ฮาร์ดแวร์ (ผ่าน GPU)


SDL_Rect

โครงสร้างที่ง่ายที่สุดใน SDL ประกอบด้วยกางเกงขาสั้นสี่ตัวเท่านั้น x, yซึ่งดำรงตำแหน่งและw, hถือความกว้างและความสูง

สิ่งสำคัญที่ควรทราบ0, 0คือมุมซ้ายบนใน SDL ดังนั้นyค่าที่สูงกว่าหมายถึงต่ำกว่าและมุมล่างขวาจะมีพิกัดx + w, y + h


คุณสามารถอ่านเพิ่มเติมเกี่ยวกับ SDL2 ได้ในบล็อกของฉัน


1
ดังนั้นสิ่งที่คุณเรียกว่า SDL_RenderPresent คือใช้ตัวแสดงผลนั้นด้วยการตั้งค่าและพื้นผิวทั้งหมดที่อัปโหลดไปและทำให้มันแสดงข้อมูลนี้บนหน้าต่างที่เชื่อมโยงกับ?
prcastro

3
@olevegard คำตอบที่ดี เพื่อชี้แจงความแตกต่างระหว่าง SDL_Texture และ SDL_Surface ฉันขอเน้นว่า SDL_Texture แสดงผลโดยใช้ GPU และ SDL_Surface ใช้การเรียงลำดับซอฟต์แวร์ซึ่งมีประสิทธิภาพน้อยกว่า แต่ให้คุณจัดการข้อมูลพิกเซลได้อย่างอิสระ นอกจากนี้บล็อกที่ยอดเยี่ยมฉันจะอ่านอย่างแน่นอน :)
Fabio Picchi

ข้อความว่า "นี่เป็นการล้างเป้าหมายการแสดงผลด้วยชุดสีวาดด้านบน"ฉันเชื่อว่าถูกต้อง แต่ฉันไม่เข้าใจวลี "เคลียร์" ในข้อความนี้ docมักจะใช้วลีนี้ คุณช่วยอธิบายได้ไหมว่าที่นี่"ชัดเจน"หมายถึงอะไร หมายถึง "ระบายสี" (เรียงลำดับ) กับสีวาดปัจจุบันของตัวแสดงผลหรือไม่
Nawaz

มีเหตุผลอะไรที่ต้องใช้SDL_Surfaceมากกว่านี้SDL_Rendererหรือไม่?
Stevoisiak

คำตอบด้านบนมีความไม่ถูกต้องบางอย่าง SDL_Renderer สามารถเชื่อมโยงกับพื้นผิวได้เช่นกันไม่เพียง แต่กับหน้าต่างเท่านั้นโปรดตรวจสอบลิงก์: wiki.libsdl.org/SDL_CreateSoftwareRenderer
dmitro

9

คิดว่าSDL_Windowเป็นพิกเซลจริงSDL_Rendererและเป็นสถานที่สำหรับจัดเก็บการตั้งค่า / บริบท

คุณจึงสร้างทรัพยากรจำนวนมากและแขวนไว้จากตัวแสดงผล จากนั้นเมื่อพร้อมแล้วคุณจะบอกให้ renderer รวมทั้งหมดเข้าด้วยกันและส่งผลลัพธ์ไปที่หน้าต่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.