ホームページ  >  記事  >  バックエンド開発  >  RGFW の紹介: 軽量のシングル ヘッダー ウィンドウ フレームワークと GLFW の代替品

RGFW の紹介: 軽量のシングル ヘッダー ウィンドウ フレームワークと GLFW の代替品

王林
王林オリジナル
2024-07-26 09:29:41942ブラウズ

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

イントロ

RGFW は、ウィンドウの作成と管理を抽象化するクロスプラットフォームのシングルヘッダー フレームワークです。 RGFW は使い方が簡単なので、複雑な低レベルのウィンドウ API、オーバーヘッドの多いライブラリ、またはプラットフォーム固有の API のサポートを扱うのではなく、ゲームやアプリケーションのプログラミングに集中できます。 RGFW は、邪魔にならずに低レベル API を処理します。現在、X11 (Linux)、Windows (XP +)、Emscripten (HTML5)、および MacOS をサポートしています。
ウィンドウの作成中に、RGFW は選択したグラフィックス コンテキストを初期化します。オプションには、OpenGL (バリアントを含む)、DirectX、ダイレクト ソフトウェア レンダリング、またはグラフィックス API なしが含まれます。 Vulkan サポート用の別のヘッダーもありますが、Vulkan コンテキストを自分で作成することをお勧めします。

デザイン

RGFW は設計上も柔軟です。たとえば、イベント ループ システムやイベント コールバック システムを使用できます。 (詳細については、RGFW リポジトリの example/events/main.c および example/callbacks/main.c を参照してください)。

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 vs GLFW

RGFW は GLFW の代替として設計されています。これは、GLFW のコードベースが軽量ではなく、柔軟性が欠けているためです。
GitHub リポジトリがあり、GLFW のすべてのソース コードを 1 つの大きな単一ヘッダー ライブラリに配置します。この GLFW.h ファイルは 10.7 MB あるため、GitHub では表示できません。 RGFW は 244 キロバイトであり、RGFW バイナリのサイズも通常 GLFW バイナリの約 3 分の 1 であるため、GitHub で表示できます。また、RGFW は GLFW よりも RAM の使用量が少ない傾向があります。
RGFW が GLFW よりも大幅に軽量である場合、それは RGFW には機能が欠けていることを意味しますか?いいえ、RGFW には GLFW とほぼ同じ機能があります。違いを知りたい場合は、RGFW と GLFW を比較する表が RGFW リポジトリに含まれています。

RGFWの使用/コンパイル

RGFW を使用するには、この行をソース ファイルの 1 つに追加する必要があります。
#define RGFW_IMPLEMENTATION
これにより、RGFW ソース定義を含めることができます。 
他のライブラリと同様に RGFW をコンパイルすることもできます。

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 

RGFWの例

ウィンドウを作成して RGFW を初期化するには、最初のウィンドウの場合は、RGFW_createWindow(const char* name, RGFW_rect, u16 args) を使用します
たとえば、画面の中央にサイズ変更できないウィンドウを作成する場合

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

レンダリングが終了したら、ウィンドウ バッファを交換する必要があります。
RGFW_window_swapBuffers(RGFW_window* win);
サポートされていない API を使用している場合は、関数を自分で処理する必要があります。
ここで完全な RGFW の例を示します:

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

最終メモ

RGFW サンプルのスクリーンショットと PureDoom-RGFW RGFW に関するその他のサンプル コードと情報は、リポジトリにあります。この例は、RGFW サンプル サイトで HTML5 を使用して実行することもできます。 RGFW に興味があれば、お気軽に RGFW リポジトリをチェックしたり、スターを付けたり、RGFW について質問したりしてください。また、批判、アドバイス、機能のリクエストもお待ちしております。

RGFW は GLFW よりも大幅に軽量ですが、それは GLFW よりも優れているという意味ではありません。最終的には、選択はあなた次第です。 RGFW はより軽量ですが、新しいものでもあり、小さなコミュニティがあります。そのため、サポートは少なく、本番環境に対応したプロジェクトではまだテストされていません。

RGFW に興味がある場合は、リポジトリをチェックしてください。 RGFW をサポートする方法の 1 つは、RGFW にスターを付けることです。

https://github.com/ColleagueRiley/RGFW

以上がRGFW の紹介: 軽量のシングル ヘッダー ウィンドウ フレームワークと GLFW の代替品の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。