Maison  >  Article  >  développement back-end  >  Présentation de RGFW : un cadre léger de fenêtrage à en-tête unique et une alternative à GLFW

Présentation de RGFW : un cadre léger de fenêtrage à en-tête unique et une alternative à GLFW

王林
王林original
2024-07-26 09:29:41908parcourir

Introducing RGFW: A lightweight Single Header Windowing framework & GLFW alternative

Introduction

RGFW est un framework multiplateforme à en-tête unique qui résume la création et la gestion des fenêtres. RGFW est simple à utiliser, vous permettant de vous concentrer sur la programmation de votre jeu ou de votre application plutôt que de gérer des API de fenêtrage complexes de bas niveau, des bibliothèques avec beaucoup de surcharge ou de prendre en charge des API spécifiques à la plate-forme. RGFW gère les API de bas niveau pour vous sans vous gêner. Il prend actuellement en charge X11 (Linux), Windows (XP+), Emscripten (HTML5) et MacOS.
Lors de la création d'une fenêtre, RGFW initialise un contexte graphique de votre choix. Les options incluent OpenGL (y compris les variantes), DirectX, le rendu logiciel direct ou aucune API graphique. Il existe également un en-tête distinct pour la prise en charge de Vulkan, bien qu'il soit recommandé de créer vous-même votre contexte Vulkan.

Conception

RGFW est également flexible de par sa conception. Par exemple, vous pouvez utiliser un système de boucle d'événements ou un système de rappel d'événements. (Voir plus dans examples/events/main.c et examples/callbacks/main.c dans le dépôt RGFW).

while (RGFW_window_checkEvent(win)) {
  switch (win->event.type) {
     case RGFW_quit:
       break;  
     case RGFW_keyPressed:
       break;
     case RGFW_mousePosChanged:
        break;
     ...
  }
}
void mouseposfunc(RGFW_window* win, RGFW_point point) {

} 
void keyfunc(RGFW_window* win, u32 keycode, char keyName[16], u8 lockState, u8 pressed) {

}

void windowquitfunc(RGFW_window* win) {

}

RGFW_setMousePosCallback(mouseposfunc);
RGFW_setKeyCallback(keyfunc);
RGFW_setWindowQuitCallback(windowquitfunc);

RGFW et GLFW

RGFW est conçu comme une alternative à GLFW. En effet, la base de code de GLFW n'est pas légère et manque de flexibilité.
Il existe un référentiel GitHub qui prend tout le code source de GLFW et le place dans une grande bibliothèque à en-tête unique. Ce fichier GLFW.h fait 10,7 Mo et ne peut pas être consulté sur GitHub. RGFW peut être consulté sur GitHub car il fait 244 kilo-octets et les binaires RGFW font également généralement environ un tiers de la taille des binaires de GLFW. RGFW a également tendance à utiliser moins de RAM que GLFW.
Si RGFW est nettement plus léger que GLFW, cela signifie-t-il que RGFW manque de fonctionnalités ? Non, RGFW a presque les mêmes fonctionnalités que GLFW. Si vous souhaitez connaître les différences, il existe un tableau inclus dans le référentiel RGFW qui compare RGFW à GLFW.

Utiliser/compiler RGFW

Pour utiliser RGFW, vous devez ajouter cette ligne à l'un de vos fichiers sources.
#define RGFW_IMPLEMENTATION
Cela permet d'inclure les définitions de la source RGFW. 
Vous pouvez également compiler RGFW comme n'importe quelle autre bibliothèque.

cc -x c -c RGFW.h -D RGFW_IMPLEMENTATION -fPIC -D 

RGFW_EXPORT
(Linux): 
cc -shared RGFW.o -lX11 -lXrandr -lm -lGL

(window mingw): 
cc -shared RGFW.o -lgdi32 -lopengl32 -lwinmm -lm

(macOS)
cc -shared RGFW.o -framework Foundation -framework AppKit -framework OpenGL -framework CoreVideo -lm 

Exemple RGFW

Pour créer une fenêtre et initialiser RGFW, si c'est la première fenêtre, vous utilisez RGFW_createWindow(const char* name, RGFW_rect, u16 args)
Par exemple, pour créer une fenêtre au centre de l'écran qui ne peut pas être redimensionnée

RGFW_window* win = RGFW_createWindow("Window", RGFW_RECT(0, 0, 200, 200) RGFW_CENTER | RGFW_NO_RESIZE);

... // do software stuff

RGFW_window_close(win); // close window now that we're done

Une fois le rendu terminé, vous devez échanger le tampon de la fenêtre.
RGFW_window_swapBuffers(RGFW_window* gagnant);
Si vous utilisez une API non prise en charge, vous devrez gérer la fonction vous-même.
Voici maintenant un exemple RGFW complet :

#define RGFW_IMPLEMENTATION
#include "RGFW.h"

u8 icon[4 * 3 * 3] = {0xFF, 0x00, 0x00, 0xFF,    0xFF, 0x00, 0x00, 0xFF,     0xFF, 0x00, 0x00, 0xFF,   0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFF,     0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF};

void keyfunc(RGFW_window* win, u32 keycode, char keyName[16], u8 lockState, u8 pressed) {
    printf("this is probably early\n");
}

int main() {
    RGFW_window* win = RGFW_createWindow("name", RGFW_RECT(500, 500, 500, 500), (u64)RGFW_CENTER);

    RGFW_window_setIcon(win, icon, RGFW_AREA(3, 3), 4);

    RGFW_setKeyCallback(keyfunc); // you can use callbacks like this if you want 

    i32 running = 1;

    while (running) {
        while (RGFW_window_checkEvent(win)) { // or RGFW_window_checkEvents(); if you only want callbacks
            if (win->event.type == RGFW_quit || RGFW_isPressed(win, RGFW_Escape)) {
                running = 0;
                break;
            }

            if (win->event.type == RGFW_keyPressed) // this is the 'normal' way of handling an event
                printf("This is probably late\n");
        }

        glClearColor(0xFF, 0XFF, 0xFF, 0xFF);
        glClear(GL_COLOR_BUFFER_BIT);

        RGFW_window_swapBuffers(win);
    }

    RGFW_window_close(win);
}

Notes finales

Une capture d'écran des exemples RGFW et PureDoom-RGFWPlus d'exemples de codes et d'informations sur RGFW peuvent être trouvés dans le référentiel. Les exemples peuvent également être exécutés avec HTML5 sur le site d'exemples RGFW. Si RGFW vous intéresse, n'hésitez pas à consulter le référentiel RGFW, à le mettre en vedette ou à me poser toutes vos questions sur RGFW. Je suis également ouvert à toutes critiques, conseils ou demandes de fonctionnalités que vous pourriez avoir.

Bien que RGFW soit nettement plus léger que GLFW, cela ne signifie pas que vous devriez le remplacer par GLFW. En fin de compte, le choix vous appartient. RGFW est plus léger mais il est également plus récent et possède une petite communauté. Il y a donc moins de support et il n'a pas encore été testé dans un projet prêt pour la production.

Si vous trouvez RGFW intéressant, veuillez consulter le référentiel. Une façon de soutenir RGFW est de le mettre en vedette.

https://github.com/ColleagueRiley/RGFW

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn