十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

V 语言 gg 图形模块完全指南:从 2D 绘制到多窗口应用

V 语言 gg 图形模块完全指南:从 2D 绘制到多窗口应用 V 语言 gg 图形模块完全指南从 2D 绘制到多窗口应用【免费下载链接】vSimple, fast, safe, compiled language for developing maintainable software. Compiles itself in 1s with zero library dependencies. Supports automatic C V translation. https://vlang.io项目地址: https://gitcode.com/GitHub_Trending/v/vgg是 V 语言官方自带的简单图形模块当前基于sokolsapp/sgl/gfx实现用于快速创建需要绘制 2D 图形并响应键盘、鼠标输入的应用。本文以 vlib/gg/README.md 为骨架结合gg模块源码、x.multiwindow底层实现、examples/gg与vlib/gg测试用例系统讲解单窗口gg.Context绘图 API、多窗口gg.App门面facade、事件/服务/读回readback体系与 Troubleshooting 极限调优帮助读者掌握从画一个多边形到管理多个原生窗口的完整能力。一、gg是什么gg是 V 语言的简单图形模块Simple Graphics Module其定位在 vlib/gg/README.md 开头即已明确只需一种方式绘制简单 2D 形状、并对用户键盘/鼠标输入做出反应的应用。它目前基于sokol实现——具体为sapp应用/窗口/事件循环、sgl简单 2D 绘图、gfx底层图形接口三件套可在 C、JSWebAssembly等多个后端编译。从源码看gg的核心是 gg.c.v 中的Config结构体约 105-168 行它定义了窗口尺寸、标题、背景色、帧回调、事件回调、字体、采样率、交换间隔、拖放等几乎所有单窗口配置项。gg还提供gg.js.v中的Config用于浏览器后端。Event结构体gg.c.v封装了 sokol 事件类型sapp.EventType并携带frame_count、key_code、char_code、key_repeat、modifiers、mouse_button、鼠标坐标、触摸点等字段。一个典型的单窗口gg应用生命周期是module main import gg fn main() { mut context : gg.new_context( bg_color: gg.rgb(174, 198, 255) width: 600 height: 400 window_title: Polygons frame_fn: frame ) context.run() } fn frame(mut ctx gg.Context) { ctx.begin() // ... draw calls ... ctx.end() }new_contextgg.c.v返回Contextcontext.run()启动事件循环ctx.begin()会先用bg_color清空整个缓冲见 gg.c.v 中bg_color的注释ctx.end()提交本帧绘制命令。frame_fn每帧被调用约 60 次/秒取决于swap_interval。二、绘制 2D 形状Context绘图 APIgg的Context提供丰富的 2D 绘图方法覆盖多边形、三角形、圆形、椭圆、圆角矩形、弧形、线条、像素与文字等。这些方法定义在 draw.c.v、image.c.v、text_rendering.c.v 等文件中并通过draw_fns_api_test.v等测试验证 API 行为。README 给出的经典示例同时演示了三种绘图调用fn frame(mut ctx gg.Context) { ctx.begin() ctx.draw_convex_poly([f32(100.0), 100.0, 200.0, 100.0, 300.0, 200.0, 200.0, 300.0, 100.0, 300.0], gg.blue) ctx.draw_poly_empty([f32(50.0), 50.0, 70.0, 60.0, 90.0, 80.0, 70.0, 110.0], gg.black) ctx.draw_triangle_filled(450, 142, 530, 280, 370, 280, gg.red) ctx.end() }draw_convex_poly(vertices, color)以扁平[f32]数组x0, y0, x1, y1, …绘制实心凸多边形draw_poly_empty(vertices, color)绘制空心多边形轮廓draw_triangle_filled(x1, y1, x2, y2, x3, y3, color)绘制实心三角形。完整的绘图方法家族源码确认包括draw_rect/draw_rect_filled/draw_rect_empty、draw_rounded_rect_filled/draw_rounded_rect_empty/draw_rounded_rect_border、draw_circle/draw_circle_filled、draw_ellipse/draw_ellipse_filled、draw_arc/draw_arc_sector、draw_line、draw_triangle/draw_triangle_filled、draw_convex_poly/draw_poly_empty、draw_pixel、draw_text等。vlib/gg/testdata下的draw_*.vv文件正是这些绘图原语的可视化回归测试。除了绘图Context还支持键盘/鼠标事件回调、图像image.v含create_image、create_image_from_file、draw_image等支持纹理过滤、文字渲染text_rendering.v、帧率显示show_fps()等。颜色由color.v中的Color结构体表示gg.rgb(r, g, b)、gg.rgba(r, g, b, a)与gg.blue/gg.red/gg.black等内置色板均可使用。三、单窗口Config配置项全解Configgg.c.v是单窗口gg应用的核心配置默认值已在源码中给出配置项默认值说明width/height800 / 600窗口初始尺寸window_titleA GG Window. Set window_title: to change it.窗口标题resizabletrue是否允许用户调整窗口大小bg_color黑色背景色begin()时用它清屏init_fnnilSokol 初始化完成后调用一次部分 gg/Sokol 函数必须在此时或之后调用frame_fnnil每帧调用约 60 次/秒受swap_interval影响cleanup_fnnil应用关闭时调用一次用于清理update_fnnil每帧开头调用参数dt为距上次更新的秒数event_fn/on_eventnil每个用户事件回调on_event参数顺序相反计划弃用keydown_fn/keyup_fn/char_fnnil按键按下/释放/字符UTF-8 rune回调move_fn/click_fn/unclick_fn/scroll_fnnil鼠标移动/按下/释放/滚轮回调leave_fn/enter_fnnil鼠标离开/进入窗口回调resized_fnnil窗口尺寸变化回调fullscreenfalse启动即全屏适合游戏/演示/屏保scale1.0缩放因子sample_count0采样数越大抗锯齿越好但性能开销越大2通常足够texture_filter.linear新建图像默认纹理过滤像素画建议.nearestswap_interval1160fps、230fpsWindows/macOS/Linux/iOS/HTML5 生效ui_modefalse仅事件触发时刷新节省 CPUenable_dragndropfalse是否启用文件拖放max_dropped_files1处理的最大拖放文件数max_dropped_file_path_length2048拖放 UTF-8 路径最大字节数min_width/min_height0窗口最小尺寸font_path/custom_bold_font_path/font_bytes_*—字体路径或内嵌字体字节native_renderingfalsemacOS/iOS 用 Cocoa、Windows 用 GDIborderless_windowfalse无原生装饰边框icon/html5_canvas_name—图标与 HTML5 canvas 名按键代码在 enums.v 中以KeyCode枚举形式定义escape256、enter257、方向键left/right/up/down、f1~f25、数字小键盘kp_*等鼠标按键MouseButtonleft/right/middle、组合键Modifiershift/ctrl/alt/superflag 枚举、线型PenLineTypesolid/dashed/dotted也在同文件中。四、多窗口应用gg.App门面从-d gg_multiwindow编译开关开始gg提供了增量式additive多窗口门面gg.App同一进程可管理多个原生窗口且不破坏既有单窗口gg.ContextAPI 与行为。4.1 开启方式v -d gg_multiwindow run examples/gg/multiwindow.vgg.App仅在-d gg_multiwindow时编译。普通import gggg.new_context()的程序不会加载原生多窗口实现未开此开关时gg.AppAPI 面退化为非渲染兼容桩stub误用会得到清晰的compile with -d gg_multiwindow错误而不会引入x.multiwindow或原生后端代码。vlib/gg/multiwindow_notd_gg_multiwindow.v正是该桩实现的源码证据。4.2 底层分层与后端选择用户通常只import ggx.multiwindow是底层生命周期/窗口/渲染表面层供需要直接控制的后端调用者使用。gg.App通过x.multiwindow管理原生窗口与 owner 队列仅持有渲染初始化后的sokol.gfx/sokol.sgl状态见 multiwindow_d_gg_multiwindow.v 中App结构体。原生应用使用backend: .auto在运行时/编译时选择合适的平台后端仅当原生后端不可用时才回退Linux X11 原生窗口需显式-d x_multiwindow_x11Wayland 需显式-d sokol_wayland测试与无头工具可显式请求backend: .mock其依赖轻、默认不链接 X11/EGL/OpenGL。4.3 基本生命周期示例README 给出的最小多窗口生命周期import gg fn main() { mut app : gg.new_app(backend: .auto)! defer { app.stop() or {} } main_window : app.create_window( title: Main width: 800 height: 600 )! app.run( event_fn: fn (event gg.WindowEvent, mut app gg.App) ! { match event.kind { .window_close_requested { app.destroy_window(event.window)! } .window_destroyed { if app.window_ids()!.len 0 { app.stop()! } } else {} } } )! _ main_window }要点gg.new_app(backend: .auto)!创建应用app.stop()建议用defer兜底。create_window返回WindowId配置项在WindowConfig中见下。app.run(event_fn: …)启动事件循环仅生命周期的应用可只用event_fn无需渲染器。frame_fn/draw_window()需要已具备渲染能力的应用它们不会重新执行.auto后端选择需要渲染的程序应使用gg.new_app(require_renderer: true)或渲染前先验证app.capabilities().explicit_swapchain。在 Xvfb 下做 Linux X11 渲染需要两个开关xvfb-run -a v -d gg_multiwindow -d x_multiwindow_x11 run examples/gg/multiwindow.v4.4AppConfig与WindowConfigAppConfigmultiwindow_d_gg_multiwindow.v字段默认值说明backend.auto后端策略.auto/.mock等queue_size128事件队列大小require_rendererfalse是否要求渲染器就绪app_id原生应用标识当前用于 Waylandxdg_toplevelapp idWindowConfigmultiwindow_d_gg_multiwindow.v字段默认值说明titleA GG Window窗口标题width/height800 / 600窗口尺寸min_width/min_height0最小尺寸resizabletrue可调整大小visibletrue初始可见high_dpitrue高分屏borderless/fullscreenfalse无边框/全屏clear_color透明每窗口清屏色sample_count1多窗口渲染目标仅支持 1有渲染回调时其他值会被拒绝err_multiwindow_render_sample_count_unsupported见 multiwindow_d_gg_multiwindow.vredraw_mode.on_demand重绘模式init_fn/frame_fn/cleanup_fnnil窗口级回调回调上下文提供不可变指标、目标快照、有界的帧/通道权限与窗口作用域资源 IDowner/modal—模态窗口必须命名同一应用中存活owner无主模态窗口在原生分配前即被拒绝。销毁 owner 会按子优先顺序销毁其完整拥有窗口树另外RunConfigmultiwindow_d_gg_multiwindow.v提供frame_fn、event_fn、input_fn、window_service_fn、readback_fn、app_resource_init_fn/frame_fn/cleanup_fn跨窗口共享资源以及max_pending_jobs默认 64。五、多窗口事件体系gg.App.run()按全局顺序分发四类事件族回调事件类型覆盖内容event_fngg.WindowEvent生命周期窗口创建、缩放、关闭请求、销毁input_fngg.WindowInputEvent输入普通gg.Event附加目标gg.WindowId保留键/鼠标/滚轮/焦点/窗口状态字段的 gg 侧类型window_service_fngg.WindowServiceEvent原生服务结果剪贴板、portal 等readback_fn—读回终结结果关键契约幂等性四个回调中任一个返回错误run()会将当前事件及后续未处理事件按原顺序重新入队因此四个处理器都必须是幂等的不只有 readback 处理器。frame_count原生多窗口事件中gg.Event.frame_count由底层多窗口 owner 轮询周期赋值同一app.poll_events()调用收集的事件共享同一帧计数。手工 owner 循环调用app.poll_events()后用drain_window_queued_events()或专用 drain按精确全局接收顺序消费四类信封drain_events()、drain_input_events()、drain_window_service_events()各自只消费本族连续前缀若队首是其他族则返回空且不跳过没有独立的 gg 读回 drain——经readback_fnrun()内或规范 drain 的.readback条目消费。能力驱动输入使用前先查app.capabilities()input_events、mouse_events、keyboard_events、text_events、focus_events、drop_events、touch_events报告后端实际可投递的能力cursor_shapes报告app.set_window_cursor(id, shape)是否可更新原生悬停光标interactive_move_resize报告begin_window_move/begin_window_resize(id, edge)所需原生句柄native_decorations报告原生/服务端装饰是否生效。能力探测不一定打开显示因此运行时全局量只在gg.new_app()之后经app.capabilities()才权威。后端必须把不支持的能力类保持为false不得模拟部分支持。Wayland 细节touch 需wl_touch、drop 需wl_data_device、交互式移动/缩放需 seat、原生装饰经 xdg-decoration 协商configure(mode)决定server_side/client_side被拒时可画客户端回退光标形状需wp_cursor_shape_manager_v1无则cursor_shapes false未实现wl_cursor_theme客户端回退fractional-scale-v1 仅在同时存在 viewporter 时使用否则帧缓冲度量跟随整数wl_outputscale。X11 文本用 XIM/XIC Xutf8LookupStringX11 文件拖放接受内联或有界 1 MiB ICCCM INCR XDNDtext/uri-list传输仅在进度时刷新超时、绝不发布部分拖放、源窗口消失也能安全结束。Wayland 文本用 xkb keymap/state 生成按键字符拖放用wl_data_device/wl_data_offertext/uri-list两条 Linux 文本路径均尚未实现完整 IME/组合文本。Win32 报告WM_TOUCH的 began/moved/ended 状态AppKit 还报告touchesCancelledWithEvent:的取消触摸。剪贴板粘贴以事件信号报告WindowInputEvent不携带剪贴板内容。六、窗口服务与原生借用6.1 服务查询capability-first对可选操作应先查询window_operation_capability(window, operation)运行时答案是权威的.conditional仍可能要求合成器支持、窗口配置或近期用户动作.asynchronous调用不同步权威也不承诺后续有排队结果.state_observable等待状态观测前先检查它。Wayland 最小化是异步且state_observable false不保证有最小化状态观测。用window_state()取最新观测状态monitor_ids()monitor_info()取带代际校验的显示器快照。完整观测可权威清除成员资格部分状态观测保留最后已知 id。显示器名称是描述性的不是稳定身份。X11 root 工作区/当前桌面变化会刷新完整显示器投影失败时保留最后快照Win32 即使无托管窗口也保持应用级显示器投影最新并在下一个首窗口前刷新。窗口成员观测只含当前可用公共显示器快照中的 id暂存的原生显示器与度量更新一起可见。6.2 剪贴板、portal 与原生标识剪贴板读写返回ClipboardRequestId需与终结.clipboardWindowServiceEvent匹配portal 导出返回PortalParentRequestId就绪事件含不透明标识符与PortalParentLeaseId外部消费者使用期间保持 lease 存活之后显式release_portal_parent()。原生 X11 标识以x11:开头Wayland xdg-foreign-v2 以wayland:开头前缀之后全部视为不透明。Wayland 剪贴板用 seat 数据设备、写入需近期输入 serialportal 导出需 xdg-foreign-v2若替换源在提交选择前失败先前发布的剪贴板值保持不变已被接受的合成器剪贴板发送使用自有有界文本快照可在替换或取消后完成。X11 每个活动剪贴板读都有独立原生转换请求方迟到的 inline/failure/INCR 回复不能完成后来的请求对外部 X11 请求方含 INCR 分块的回复使用受检连接过期请求方只失败该传输而不影响后续剪贴板工作。X11 INCR 读的广告长度是下界实际增长仅在每请求与聚合剪贴板字节限制内接受。排队剪贴板终结负载跨后端共享16 MiB、64 操作上限直到服务事件送达或被丢弃前持续计费。6.3 原生窗口借用with_native_window()with_native_window()是回调式的。回调内须调用与app.capabilities().backend匹配的访问器后端访问器句柄Win32with_win32HWNDAppKitwith_appkitNSWindow 指针X11with_x11Display 指针 X11 WindowWaylandwith_waylandwl_display wl_surface 指针NativeWindowLease在外层with_native_window()回调返回时过期后端句柄更早过期——其嵌套lease.with_*回调返回即过期。严禁在各自回调生命周期之外存储、返回或使用这些授权。6.4 读回Readback窗口与托管图像读回是异步的WindowReadbackConfig{}捕获完整目标rect请求帧缓冲坐标中的正且完全包含的区域。每次请求准入并排入一个终结结果.ready/.cancelled/.failed但回调失败会重放同一排队结果直到确认处理器必须幂等。.ready结果拥有左上角 RGBA8 字节、显式 stride、尺寸与产生帧submitted_frame取消/失败不携带像素。待处理与排队读回共享256 MiB、64 操作上限生产者先预留紧凑 RGBA8 大小再分配或捕获存储持续计费直到终结事件送达或被丢弃待处理请求在窗口/应用拆除时取消。app.capabilities().readback只是当前渲染器的后端级可用性汇总Mock 有确定性窗口路径AppKit 需就绪 Metal 渲染器window_readback_capabilities()报告逐窗口路径可用性。请求仍会校验 app/window 所有权、同窗口图像范围、单采样 2D 渲染目标资格与矩形边界。端到端示例v -d gg_multiwindow run examples/gg/multiwindow_services.v它以运行时能力为门槛执行操作、查询状态与显示器、关联剪贴板/portal 请求 id、释放 portal lease、使用作用域原生借用并仅在可用时请求读回。6.5 后端服务矩阵后端服务摘要Mock确定性状态、显示器、剪贴板、portal 与读回供测试不支持原生借用。X11原生状态/显示器、剪贴板、portalx11:、作用域借用与原生窗口捕获焦点仅当存活服务器通告 EWMH_NET_ACTIVE_WINDOW时可用、请求异步、权威状态来自FocusIn/FocusOut。位置与受支持的 WM 最小化/最大化/全屏/恢复请求也异步ConfigureNotify触发的 root 坐标观测与原生 WM 状态属性事件是权威的。鼠标锁定中心在 resize 后刷新。其他 EWMH、鼠标锁定与渲染图像支持依赖存活服务器/渲染器。Wayland运行时全局驱动状态/显示器、剪贴板、portalwayland:、作用域借用与鼠标锁定焦点/raise/位置不支持。隐藏/显示重映射保留已配置元数据、所有权、约束、装饰与最大化/全屏意图无新合成器 configure 时 show 失败且可重试。显示/最小化/最大化/恢复/全屏/鼠标锁定异步但最小化不可状态观测。渲染读回需活动 GL 路径。AppKit原生状态/显示器、作用域借用、剪贴板、窗口操作与实时桥报告的标题栏外观portal 不支持读回需活动 Metal。Win32原生状态/显示器含零窗口观测、作用域借用、剪贴板与标准窗口操作焦点/鼠标锁定有条件。焦点丢失事务性释放鼠标锁定清理失败时保留错误并重试而不产生假的未锁定观测。最大化依赖窗口配置原生全屏状态未知时全屏/恢复变为不支持。portal/读回当前不支持。该表仅作方向性参考始终优先使用逐窗口的实时能力查询而非后端名假设例如 Wayland 相对鼠标锁定需 relative-pointer 与 pointer-constraints 两个 global。6.6 与旧版gg.Context的关系多窗口事件队列与旧版gg.Context回调完全分离普通单窗口程序继续使用event_fn、keydown_fn、move_fn、scroll_fn等gg.Context回调且不 import/初始化x.multiwindow。创建、运行、停止与渲染都应在 owner 线程进行后台线程用app.post()/app.try_post()调度 owner 侧工作由 run 循环排空。一个gg.App渲染 owner 不能与同进程的活动旧版gg.Context渲染 owner 共存但旧版gg.ContextAPI 对普通单窗口程序仍可用。公开门面将gg.App/WindowId、WindowEvent、WindowInputEvent、WindowServiceEvent、WindowReadbackResult、WindowQueuedEvent映射到x.multiwindow的对应类型window_state、monitor_ids、window_operation_capability、drain_window_queued_events映射到低层的service_*查询与drain_queued_events。应用代码应留在 gg 侧不透明 id、lease 与原生句柄不能跨门面互换。七、逐窗口渲染 API-d gg_multiwindow下WindowConfig提供逐窗口清屏色、重绘模式、采样数与 init/frame/cleanup 回调回调上下文提供不可变指标与目标快照、有界帧/通道权限、app 与窗口作用域托管资源 ID、通道方法与WindowSglContext记录子集。RunConfig提供跨窗口共享资源的 app 资源生命周期回调。采样数多窗口渲染目标只支持sample_count: 1渲染器必需或激活时其他采样数会被拒绝源码在 multiwindow_d_gg_multiwindow.v。窗口捕获X11/Wayland GL 渲染器激活时request_window_capture()在绘制后读取gg拥有的帧缓冲且仅在生产帧提交后发布request_image_readback()读取托管单采样 2D 渲染目标。无活动 X11 渲染器时窗口捕获回退到原生XGetImage路径反映 X server drawableXWayland 下不能保证帧精确合成器呈现。两者都不是桌面/合成器捕获。结果经RunConfig.readback_fn投递为左上角 RGBA8 值、支持有界像素区域操作前先查询window_readback_capabilities()。AppKit 在 Metal 渲染器与私有 pre-present 钩子激活时暴露相同异步契约GLCore33 与无渲染器 AppKit 构建报告不支持。Win32 读回在该批次仍不支持。托管 ID作用域限定于各自 app及适用时的窗口。过期、外来或失效 ID 与回调 lease 返回错误而不是暴露原始gfx.Environment、gfx.Swapchain、原生 drawable、命令缓冲或呈现权限。渲染使用 owner 线程批次、后端签发就绪信用、延迟目标获取、有序定稿与每提交批次一次全局提交。CI 验证渲染器行为在专用 X11、Wayland、AppKit、Win32 CI lane 中验证设置VGG_MULTIWINDOW_RUNTIME_PROBES1、VGG_MULTIWINDOW_RUNTIME_BACKEND、V_MULTIWINDOW_PROBE_BACKEND并以匹配原生 flag 编译经进程树 watchdog 运行测试与探针覆盖多窗口提交、资源清理与替换、过期 lease、回调驱动拆除、恢复与原生故障路径。普通旧版gg.Contextimport 与x.multiwindow及原生多窗口后端依赖保持隔离。实现遵循 V 内置 Sokol 修订版及固定sokol_gfx.h/sokol_gl.h契约。examples/gg/multiwindow_render_runtime.v是无值守 CI 探针而非交互启动目标后端 lane 以-d gg_multiwindow加-d x_multiwindow_x11、-d sokol_wayland、-d sokol_metal或-d sokol_d3d11编译经V_MULTIWINDOW_PROBE_BACKEND选择匹配后端进程树 watchdog 提供私有父门、执行截止并检查进程清理。所有窗口与渲染器清理成功后探针输出{example:multiwindow_render_runtime,status:PASS,cleanup:complete}。八、Troubleshooting顶点/命令上限与性能调优8.1 症状与默认上限在同一帧中绘制大量图元时程序可能超过sokol施加的顶点数与命令数上限症状是帧在变复杂后突然变黑。Sokol 顶点默认上限131072Sokol 命令默认上限327688.2 方案一编译期提高上限在程序顶部添加两行 flag 即可#flag -D_SGL_DEFAULT_MAX_VERTICES4194304 #flag -D_SGL_DEFAULT_MAX_COMMANDS65536该方案有完整可运行示例many_thousands_of_circles_overriding_max_vertices.v。其注释源码确认提醒不加 flag 时max_circles 5040就会只显示蓝屏而无任何圆提高_SGL_DEFAULT_MAX_VERTICES也会提高默认 RAM 占用示例在 Ubuntu 20.04 上从约 40MB 升至约 140MB。README 中的示例值4194304顶点 /65536命令可直接套用具体数值可按需调整。8.3 方案二分多个绘制通道使用多个绘制通道draw passes并限制每次通道的绘制调用数见 many_thousands_of_circles.v。8.4 方案三流式纹理单命令上传把所有绘制先画进一个流式纹理streaming texture再将该纹理作为单条绘制命令上传给 GPU见 random.v 与 random_stars.v。8.5 方案四把计算与绘制搬到 GPU 着色器只向 GPU 上传变化的输入所有计算与绘制都在着色器中进行——对大量同质粒子/像素类效果最彻底。九、示例与测试索引单窗口入门minimal.v、polygons.v、rectangles.v、moving_square.v、bouncing_balls.v渲染技巧draw_pixels.v、draw_unicode_text_with_gg.v、rotating_textured_quad.v、sample_count.v、cursor.v、drag_n_drop.v多窗口multiwindow.v交互示例、multiwindow_services.v服务端到端、multiwindow_render_runtime.vCI 探针测试draw_fns_api_test.v、color_test.v、image_test.v、text_rendering_test.v、multiwindow_api_d_gg_multiwindow_test.v、multiwindow_services_contract_test.v、multiwindow_render_runtime_contract_test.v、legacy_import_multiwindow_isolation_test.v绘图原语可视化测试数据vlib/gg/testdata/draw_*.vv十、小结gg以极低门槛覆盖“简单 2D 图形 键盘/鼠标输入”的全部需求单窗口用gg.new_context() 绘图 API 即可需要多原生窗口时-d gg_multiwindow启用增量门面gg.App配以能力驱动的四类事件族、服务查询、原生借用与异步读回底层由x.multiwindow承载。遇到顶点/命令上限导致的突然黑屏按序尝试提高_SGL_DEFAULT_MAX_VERTICES/_SGL_DEFAULT_MAX_COMMANDS、多绘制通道、流式纹理或 GPU 着色器方案。无论是教学演示、游戏原型还是多窗口工具gg都是 V 生态中上手最快、文档与示例最完整的图形起点。【免费下载链接】vSimple, fast, safe, compiled language for developing maintainable software. Compiles itself in 1s with zero library dependencies. Supports automatic C V translation. https://vlang.io项目地址: https://gitcode.com/GitHub_Trending/v/v创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表