首頁  >  文章  >  後端開發  >  RGFW 簡介:輕量級單頭視窗框架和 GLFW 替代方案

RGFW 簡介:輕量級單頭視窗框架和 GLFW 替代方案

王林
王林原創
2024-07-26 09:29:41805瀏覽

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 儲存庫中的 Examples/events/main.c 和 Examples/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 的所有原始程式碼並將其放入一個大型單頭庫中。此 GLFW.h 檔案大小為 10.7 MB,無法在 GitHub 上查看。 RGFW 可以在 GitHub 上查看,因為它有 244 KB,而且 RGFW 二進位檔案的大小通常也約為 GLFW 二進位檔案大小的三分之一。 RGFW 也往往比 GLFW 使用更少的 RAM。
如果 RGFW 比 GLFW 輕得多,是否意味著 RGFW 缺乏功能?不,RGFW 具有與 GLFW 幾乎相同的功能。如果您有興趣了解差異,RGFW 儲存庫中包含一個表格,用於比較 RGFW 和 GLFW。

使用/編譯 RGFW

要使用 RGFW,您需要將此行新增至您的原始檔案之一。
#定義 RGFW_IMPLMENTATION
這允許包含 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 的一種方法是為其加註星標。

https://github.com/ColleagueRiley/RGFW

以上是RGFW 簡介:輕量級單頭視窗框架和 GLFW 替代方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn