MiniFB:创建用于绘制像素的帧缓冲区的小型跨平台库

2020-08-16 05:35:13

MiniFB(Mini FrameBuffer)是一个小型跨平台库,可以轻松地在窗口中渲染(32位)像素。示例是展示其工作原理的最佳方式:

Struct MFB_WINDOW*WINDOW=MFB_OPEN_EX(";MY DISPLAY";,800,600,WF_SIZABLE);IF(!Window)返回0;FOR(;;){INT STATE;//TODO:向大小为800*600 STATE=MFB_UPDATE(BUFFER);IF(STATE<;0)Break;}。

Void active(struct MFB_Window*Window,bool isActive){...}void resize(struct MFB_Window*Window,int width,int Height){...//您还可以选择更改视口大小mfb_set_viewport(window,x,y,width,high);}void keyboard(struct mfb_window*window,mfb_key key,mfb_key_mod mod,bool isPressed){...//记住如果(key==KB_key_ESCRIDE){mfb_close(Window);}fprintf(stdout,";%s&>;键盘:键:%s(按下:%d)[key_mod:%x]\n";,WINDOW_TITLE,MFB_GET_KEY_NAME(Key),isPressed,mod);}void char_input(struct MFB_Window*Window,unsign int charCode){...}void MICE_BTN(struct MFB_Window*Window,MFB_MOID_BUTTON,MFB_KEY_MOD MOD,bool isPressed){...}//明智地使用此事件。可能发送的频率太高了:void MOUSE_MOVE(struct MFB_Window*Window,int x,int y){...}//鼠标滚轮void MICE_SCROLL(struct MFB_Window*Window,MFB_Key_mod mod,Float deltaX,Float DeltaY){...}struct MFB_Window*Window=mfb_open_ex(";my display";My display";800,600,WF_Resizable);IF(!window。Mfb_set_resize_callback(窗口,调整大小);mfb_set_keyboard_callback(窗口,键盘);mfb_set_char_input_callback(窗口,char_input);mfb_set_ouse_button_callback(窗口,鼠标_btn);mfb_set_ouse_move_callback(窗口,鼠标移动);mfb_set_ouse_scroll_callback(窗口,鼠标_滚动);

Bool mfb_is_window_active(struct mfb_window*window);unsign mfb_get_window_width(struct mfb_window*window);unsign mfb_get_window_Height(struct mfb_window*window);int mfb_get_click_x(struct mfb_window*window);//最后一个鼠标位置X int mfb_get_鼠标_y(struct mfb_get_window*window)。当您调用此函数时,它会重置。FLOAT MFB_GET_MOUSE_SCROLL_Y(struct MFB_Window*Window);//鼠标轮Y作为总和。当您调用此函数时,它会重置。Const uint8_t*MFB_GET_MOUSE_BUTTON_BUFFER(struct MFB_Window*Window);//每个按钮一个字节。按(1),松开0键。(最多8个按钮)const uint8_t*MFB_GET_KEY_BUFFER(struct MFB_Window*Window);//每个键一个字节。按(1),松开0键。

首先,代码使用用于显示数据的MFB_OPEN调用创建窗口,然后由应用程序负责分配缓冲区(必须至少是窗口的大小,并且是32位的),接下来,当调用MFB_UPDATE函数时,缓冲区将被复制到窗口并显示。目前,如果按下Esc键,MFB_UPDATE将返回-1,但稍后它将支持返回按下按钮的按键代码。有关完整示例,请参见https://github.com/emoon/minifb/blob/master/tests/noise.c。

MiniFB已经在Windows、MacOSX和Linux上进行了测试,但当然可能会遇到问题,具体取决于您的设置。目前,如果不能创建正确的32位显示,代码将不会执行任何数据转换。

Struct MFB_TIMER*MFB_TIMER_CREATE();void mfb_Timer_Destroy(struct MFB_Timer*tmr);void mfb_Timer_Reset(struct mfb_Timer*tmr);DOUBLE MFB_TIMER_NOW(struct MFB_TIMER*tmr);DOUBLE MFB_TIMER_DELTA(struct MFB_TIMER*tmr);DOUBLE MFB_TIMER_GET_FREQUENCE();DOUBLE。

此外,您还可以为应用程序设置目标fps。默认值为每秒60帧。

这避免了快速处理器中窗口更新过快导致重绘折叠的问题。

Do{int i;MFB_UPDATE_STATE STATE;//TODO:在缓冲区状态=MFB_UPDATE(WINDOW,g_BUFFER);IF(STATE!=STATE_OK){WINDOW=0x0;Break;}}While(MFB_WAIT_SYNC(WINDOW));

请注意,如果有多个窗口在同一线程上运行,则等待所有这些窗口是没有意义的……。

MiniFB使用Tundra https://github.com/deplinenoise/tundra作为构建系统,需要按原样构建代码,但如果您希望在自己的代码中直接使用它,则不需要做太多更改。

假设系统上安装了COCOA和CLANG(下载最新的XCode+安装命令行工具),然后构建run:tundra2 MacOSX-clang-debug,您应该能够运行噪声示例(t2-output/MacOSX-clang-debug-default/noise)。

MacOS X Mojave不像预期的那样支持Cocoa框架。出于这个原因,现在您可以切换到Metal API。要启用它,只需编译并定义预处理器宏use_Metal_api即可。

如果您想通过故事板创建UIWindow,请记住将UIViewController设置为iOSViewController,将UIView设置为iOSView。

似乎您必须手动将&#tVOS部署目标';设置为小于13。

似乎您必须在项目>;可执行>;常规中手动设置';启动屏幕文件';才能获得真实的设备高度。

一些MiniFB功能在手机上没有意义。iOS的可用功能包括:

Struct MFB_WINDOW*MFB_OPEN(常量char*title,无符号宽度,无符号高度);struct MFB_Window*MFB_OPEN_EX(常量char*title,无符号宽度,无符号高度,无符号标志);//标志忽略mfb_update_state MFB_UPDATE(struct MFB_Window*Window,void*Buffer);void MFB_CLOSE(struct MFB_Window*Window);void MFB。Void*mfb_get_user_data(struct mfb_window*window);bool mfb_set_viewport(struct mfb_window*window,无符号偏移量_x,无符号偏移量_y,无符号宽度,无符号高度);void mfb_set_ouse_button_callback(struct mfb_window*window,mfb_ouse_button_func callback);void mfb_set_click_move_callback(struct mfb。Void mfb_set_resize_callback(struct mfb_window*window,mfb_resize_func callback);unsign mfb_get_window_width(struct mfb_window*window);unsign mfb_get_window_high(struct mfb_window*window);int mfb_get_ouse_x(struct mfb_window*window);//最后一个鼠标位置X int mfb_get_鼠标。

Struct MFB_TIMER*MFB_TIMER_CREATE(Void);void mfb_Timer_Destroy(struct MFB_Timer*tmr);void mfb_Timer_Reset(struct MFB_Timer*tmr);Double mfb_Timer_now(struct MFB_Timer*tmr);Double mfb_Timer_Delta(struct MFB_Timer*tmr);Double mfb_Timer_Get_Frequency(Void)。

-(BOOL)应用程序:(UIApplication*)应用程序didFinishLaunchingWithOptions:(NSDictionary*)LaunchOptions{if(g_window==0x0){g_width=[UIScreen mainScreen]。边界。大小。Width;g_high=[UIScreen main Screen]。边界。大小。高度;g_Window=MFB_OPEN(";Noise";,g_Width,g_Height);如果(g_Window!=0x0){g_Buffer=malloc(g_width*g_Height*4);}}返回YES;}-(void)applicationDidBecomeActive:(UIApplication*)应用程序{mDisplayLink=[CADisplayLink displayLinkWithTarget:Self选择器:@选择器(OnUpdateFrame)];[mDisplayLink addToRunLoop。}-(Void)application WillTerminate:(UIApplication*)application{[mDisplayLink INVALIATE];MFB_CLOSE(G_Window);}-(Void)OnUpdateFrame{if(g_Buffer!=0x0){//做您精彩的渲染工作}MFB_UPDATE_STATE=MFB_UPDATE(g_Window,g_Buffer);IF(STATE!=STATE_OK){FREE(G_Buffer);g_Buffer=0x0。

Visual Studio(2012 Express版已经过测试)构建run所需的工具(使用vcvars32.bat(32位)将设置环境):tundra2 win32-msvc-debug,您应该能够在t2-output/win32-msvc-debug-default/noise.exe中运行Noise。

如果使用CMake,将生成Visual Studio项目(2015、2017和2019年已测试)。

需要安装GCC和x11-dev库。要构建代码,请运行tundra2x11-GCC-DEBUG,您应该能够运行T2-OUTPUT/x11-GCC-DEBUG-DEFAULT/Noise