SDL रेंडरर क्या है?


103

मैं 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;
}

मैं ट्विंकलबियर ट्यूटोरियल (एसडीएल विकी पर सुझाव दिया गया था) का उपयोग कर रहा था और एसडीएल विकी डॉक्यूमेंटेशन और कुछ पुस्तकों पर भी ध्यान दिया। लेकिन वे सभी यह मानते हैं कि मैं इन परिभाषाओं को जानता हूं।

जवाबों:


196

SDL_Window

SDL_Window वह संरचना है जो विंडो के बारे में पूरी जानकारी रखती है: आकार, स्थिति, पूर्ण स्क्रीन, सीमाएं आदि।


SDL_Renderer

SDL_Rendererएक संरचना है जो सभी प्रतिपादन को संभालती है। यह एक बंधन से जुड़ा हुआ है SDL_Windowइसलिए यह केवल उसी के भीतर प्रस्तुत कर सकता है SDL_Window। यह रेंडरिंग से संबंधित सेटिंग्स को भी ट्रैक करता है। कई महत्वपूर्ण कार्य बंधे हैंSDL_Renderer

  • SDL_SetRenderDrawColor(renderer, r, g, b, a);
    यह आपके द्वारा स्क्रीन को साफ़ करने वाला रंग सेट करता है (नीचे देखें)

  • SDL_RenderClear(renderer);
    यह ऊपर दिए गए ड्रॉ कलर के साथ रेंडरिंग टारगेट को क्लियर करता है

  • SDL_RenderCopy(
    यह संभवतया वह फ़ंक्शन है जिसका आप सबसे अधिक उपयोग कर रहे हैं, इसका उपयोग 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_RendererRenders 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सॉफ्टवेयर रेंडरिंग (सीपीयू के माध्यम से) जबकि SDL_Textureहार्डवेयर रेंडरिंग (जीपीयू के माध्यम से) का उपयोग किया जाता है।


SDL_Rect

एसडीएल में सबसे सरल संरचना। इसमें केवल चार शॉर्ट्स होते हैं। x, yजो स्थिति रखता है और w, hजो चौड़ाई और ऊंचाई रखता है।

यह ध्यान रखना महत्वपूर्ण है कि 0, 0एसडीएल में ऊपरी-बाएं कोने है। तो एक उच्च स्तर का yमतलब कम है, और नीचे-दाएं कोने में समन्वय होगाx + w, y + h


आप मेरे ब्लॉग पर SDL2 के बारे में अधिक पढ़ सकते हैं


1
तो जब आप SDL_RenderPresent को कॉल करते हैं, तो उस रेंडर को उस सेटिंग और बनावट के साथ ले लिया जाता है, जो इसे अपलोड किया गया था और इसे विंडो पर इस informations को रेंडर करने के लिए बनाया गया था?
prcastro

3
@ होलवार्ड, शानदार जवाब। SDL_Texture और SDL_Surface के बीच अंतर को स्पष्ट करने के लिए, मैं इस बात पर जोर दूंगा कि SDL_Texture GPU का उपयोग करके रेंडर करता है और SDL_Surface सॉफ्टवेयर रिडरिंग का उपयोग करता है, जो कम कुशल है लेकिन आपको पिक्सेल जानकारी को स्वतंत्र रूप से हेरफेर करने देता है। इसके अलावा, महान ब्लॉग, मैं निश्चित रूप से इसे
पढ़ूंगा

बयान "यह ऊपर दिए गए ड्रॉ कलर के साथ रेंडरिंग टारगेट को क्लियर करता है" , मेरा मानना ​​है कि सही है लेकिन मैं स्टेटमेंट में वाक्यांश "क्लीयर" को समझने में असमर्थ हूं। दस्तावेज़ हमेशा इस वाक्यांश का उपयोग करता है। क्या आप बता सकते हैं कि वास्तव में "स्पष्ट" का क्या मतलब है? क्या इसका मतलब है "पेंट" (सॉर्ट-ऑफ) रेंडरर के वर्तमान ड्रॉ रंग के साथ?
नवाज

वहाँ का उपयोग करने के किसी भी कारण है SDL_Surfaceसे अधिक SDL_Renderer?
Stevoisiak

शीर्ष उत्तर में कुछ अशुद्धि है, SDL_Renderer सतह से भी जुड़ा हो सकता है, न केवल खिड़की से, कृपया लिंक की जाँच करें: wiki.libsdl.org/SDL_CreateSoftwareRenderer
droro

9

SDL_Windowभौतिक पिक्सेल के रूप में सोचो , औरSDL_Renderer सेटिंग्स / संदर्भ को संग्रहीत करने के लिए एक जगह है।

इसलिए आप संसाधनों का एक समूह बनाते हैं, और उन्हें रेंडरर से लटका देते हैं; और फिर इसके तैयार होने पर, आप रेंडरर से कहते हैं कि यह सब एक साथ रखें और परिणाम विंडो पर भेजें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.