ARTICLE DETAIL

资讯详情

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

Godot 操作系统测试(os_test)演示项目:用 OS 类读取系统信息并执行平台交互操作

Godot 操作系统测试(os_test)演示项目:用 OS 类读取系统信息并执行平台交互操作 示例工程【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址https://gitcode.com/GitHub_Trending/go/godot-demo-projects点击查看免费下载本文围绕 godot-demo-projects 仓库中的 misc/os_test 演示项目展开它是官方为 Godot 4 提供的一套「操作系统能力体检」工具通过 os_test.gd 在左侧面板罗列引擎从宿主系统采集到的几十项信息通过 actions.gd 在右侧提供 14 个可直接点击的系统交互按钮并可选择性地在 Mono/.NET 构建下通过 CSharpTest.cs 补充 C# 预处理器宏判定的平台信息。读完本文你将掌握OS、DisplayServer、Time、AudioServer、RenderingServer等跨平台 API 的具体用法并了解如何把它当作移植新平台或回归测试时的系统信息诊断工具。项目定位面向移植与回归验证的系统功能测试台README 开篇明确了这一演示的用途展示 Godot 中与操作系统相关的各种特性可用于把 Godot 移植到新平台时的功能验证也可用于检查引擎回归regressions。它本质上是一个「系统信息 系统操作」的双栏测试台左侧FeaturesRichTextLabel由 os_test.gd 驱动逐条采集并展示操作系统信息右侧ActionsVBoxContainer GridContainer由 actions.gd 驱动每个按钮对应一项系统级操作在启用 Mono 的 Godot 构建中还会加载 CSharpTest.cs把由 C# 预处理器宏推断出的平台信息追加到左侧面板。项目使用GDScript 为主、少量 C#Operating System Testing.csproj 中 TargetFramework 为 net472SDK 为 Godot.NET.Sdk/4.0.0-dev5并且运行该演示并不要求 .NET 构建——C# 部分只是可选增强。渲染器方面project.godot 中renderer/rendering_method与renderer/rendering_method.mobile均设置为gl_compatibility即使用兼容性渲染器OpenGL 管线。核心原理OS类作为平台无关的抽象层README 指出OS类为平台相关代码提供了一层抽象OS 封装了与宿主操作系统通信的最常用功能包括剪贴板、视频驱动、日期与时间、定时器、环境变量、二进制程序执行、命令行等。其典型用法是游戏逻辑只调用统一的OS.xxx()方法由引擎在 Windows、Linux、macOS、Android、iOS、Web 等平台上分别映射到各自的系统 API。在演示代码中「读取信息」主要由OS类承担同时辅以DisplayServer窗口、屏幕、剪贴板、全局菜单等显示服务器能力、Time系统日期时间、AudioServer音频设备与RenderingServer视频适配器信息等单例。换句话说这个 demo 是这些系统级 API 的一次「全覆盖冒烟测试」。项目结构与运行方式项目目录非常精简全部文件如下文件作用project.godot项目配置名称、主场景、渲染器、窗口拉伸策略os_test.tscn主场景双栏布局信息面板 按钮网格 空CSharpTest节点os_test.gd左侧信息采集逻辑挂载在根节点OSTest上actions.gd右侧按钮逻辑挂载在HBoxContainer/Actions上CSharpTest.csC# 平台判定脚本运行时可动态加载到CSharpTest节点Operating System Testing.csproj /.sln.NET 工程文件仅 Mono 构建需要screenshots/运行截图top-hidpi.png、mono.pngproject.godot中值得注意的配置项[application] config/nameOperating System Testing config/descriptionThis demo showcases various OS-specific features in Godot. ... config/tagsPackedStringArray(demo, official, porting) run/main_sceneres://os_test.tscn config/featuresPackedStringArray(4.7) run/low_processor_modetrue [display] window/stretch/modecanvas_items window/stretch/aspectexpand [rendering] renderer/rendering_methodgl_compatibility renderer/rendering_method.mobilegl_compatibility主场景为res://os_test.tscn直接用 Godot 打开 misc/os_test 目录即可运行如godot --path misc/os_testrun/low_processor_modetrue会让引擎在窗口未聚焦等场景下主动降低处理器占用可以推断是为长时间挂机诊断设计的省电选项canvas_items拉伸模式配合expand纵横比使双栏 UI 在不同分辨率下自适应缩放。os_test.tscn的场景树结构为根节点OSTestPanel挂os_test.gd→HBoxContainer→ 左侧FeaturesRichTextLabelbbcode_enabled true与右侧ActionsVBoxContainer挂actions.gd内含 2 列GridContainer的 14 个 Button以及一个独立的空节点CSharpTest。按钮的pressed信号全部通过场景连接connection绑定到actions.gd的_on_*_pressed方法。左侧信息面板os_test.gd 的系统信息采集os_test.gd在_ready()中按 15 个分类逐条填充左侧面板见 os_test.gd。输出到 RichTextLabel 的同时它还会用print_rich()把同样内容打印到终端——脚本注释明确说明这是为了便于复制粘贴以及 headless无头场景使用例如在 CI 中通过godot --path misc/os_test --headless跑一遍即可在终端拿到全部系统信息做回归比对。面板渲染层面有两个辅助函数add_header()以 24 号字体、蓝色#5cf输出分类标题add_line()按「key: value」格式输出奇数行/偶数行交替使用bgcolor#8883底纹以增强可读性布尔值会被着色绿true/ 红false空值显示为(empty)同时把对应行以终端友好颜色青色键、绿色/红色布尔值打印到标准输出。各分类及所用 API 汇总如下分类采集内容与调用方法Audio混音采样率AudioServer.get_mix_rate()输出延迟AudioServer.get_output_latency()×1000 转毫秒输出/采集设备列表get_output_device_list()、get_input_device_list()已连接的 MIDI 输入OS.get_connected_midi_inputs()配合OS.open_midi_inputs()/OS.close_midi_inputs()见下方说明Date and time本地/UTC 日期时间Time.get_datetime_string_from_system(utc, with_seconds)日期get_date_string_from_system()时间get_time_string_from_system()时区Time.get_time_zone_from_system()UNIX 时间戳Time.get_unix_time_from_system()。另提供datetime_to_string()把带year/month/day/hour/minute/second的字典格式化为YYYY-MM-DD HH:MM:SS含pad_zeros补零Display屏幕数量DisplayServer.get_screen_count()DPIscreen_get_dpi()缩放因子screen_get_scale()/screen_get_max_scale()起始屏幕位置/尺寸/刷新率screen_get_position()、screen_get_size()、screen_get_refresh_rate()安全区矩形get_display_safe_area()屏幕方向screen_get_orientation()脚本按枚举顺序映射为 Landscape / Portrait / Landscape (reverse) / Portrait (reverse) / Landscape (defined by sensor) / Portrait (defined by sensor) / Defined by sensorEngine引擎版本Engine.get_version_info()[string]架构Engine.get_architecture_name()命令行参数OS.get_cmdline_args()是否调试构建OS.is_debug_build()可执行文件路径OS.get_executable_path()用户数据目录OS.get_user_data_dir()用户文件系统是否持久OS.is_userfs_persistent()进程 PIDOS.get_process_id()主线程/调用线程 IDget_main_thread_id()、get_thread_caller_id()内存信息OS.get_memory_info()、静态内存用量与峰值get_static_memory_usage()、get_static_memory_peak_usage()Environment环境变量OS.get_environment(PATH)与OS.get_environment(path)——同时查询大小写两种写法用于跨平台探测环境变量是否大小写敏感Hardware设备型号OS.get_model_name()处理器型号OS.get_processor_name()逻辑核数OS.get_processor_count()设备唯一 IDOS.get_unique_id()Input是否有触摸屏DisplayServer.is_touchscreen_available()是否支持虚拟键盘DisplayServer.has_feature(DisplayServer.FEATURE_VIRTUAL_KEYBOARD)若支持则读取虚拟键盘高度virtual_keyboard_get_height()Localization区域OS.get_locale()如en_US语言OS.get_locale_language()如enMobile已授予权限列表OS.get_granted_permissions()Android 等平台.NET (C#)通过ResourceLoader.exists(res://CSharpTest.cs)检测 Mono 模块是否启用启用则set_script()动态加载脚本并调用OperatingSystem()、PlatformType()详见下文 C# 小节Software系统名OS.get_name()如 X11、Windows版本OS.get_version()发行版名OS.get_distribution_name()是否支持/启用深色模式DisplayServer.is_dark_mode_supported()、is_dark_mode()系统强调色DisplayServer.get_accent_color()系统字体数量OS.get_system_fonts()具体字体路径OS.get_system_font_path(sans-serif)以及get_system_font_path_for_text()分别用英文Hello、中文你好、日文こんにちは测试多语言字体回退Security是否沙箱环境OS.is_sandboxed()随机熵OS.get_entropy(8)8 字节随机数系统 CA 证书OS.get_system_ca_certificates()有/无及字节数Engine directories数据目录OS.get_data_dir()配置目录OS.get_config_dir()缓存目录OS.get_cache_dir()System directoriesOS.get_system_dir()配合SYSTEM_DIR_DESKTOP / DCIM / DOCUMENTS / DOWNLOADS / MOVIES / MUSIC / PICTURES / RINGTONES枚举读取桌面、相册、文档、下载、影片、音乐、图片、铃声等系统目录VideoGPU 适配器名/厂商RenderingServer.get_video_adapter_name()、get_video_adapter_vendor()适配器类型get_video_adapter_type()Other/Integrated/Discrete/Virtual/CPU——仅在非 Compatibility 渲染器下查询脚本用get_current_rendering_method() ! gl_compatibility做了守卫图形 API 版本get_video_adapter_api_version()驱动名与版本OS.get_video_adapter_driver_info()返回数组的[0]、[1]元素其中scan_midi_inputs()包含一个平台细节若DisplayServer.get_name() headless直接返回空字符串这是对 godotengine/godot#52821 一类问题的规避headless 下打开 MIDI 输入可能异常——注释中保留了对上游 issue 的引用。从源码结构看这也再次印证该 demo 被设计为可在无头环境运行。右侧操作面板actions.gd 的 14 项系统操作actions.gd的 14 个按钮覆盖了「与操作系统交互」的常见诉求actions.gd按钮实现要点Open Shell (web)OS.shell_open(https://example.com)用系统默认浏览器打开 URLOpen Shell (folder)先读HOMEWindows 回退USERPROFILE环境变量macOS 下加file://前缀再调用OS.shell_show_in_file_manager(path)在文件管理器中显示Change Window TitleDisplayServer.window_set_title()标题内嵌多字节 Unicode 字符é € × Ù ¨用于测试标题编码Change Window Icon先检查DisplayServer.has_feature(DisplayServer.FEATURE_ICON)不支持则OS.alert()提示支持时用Image.create(128, 128, false, Image.FORMAT_RGB8)fill(Color(1, 0.6, 0.3))生成橙色纯色图再DisplayServer.set_icon(image)Move Window to Foregroundawait get_tree().create_timer(5).timeout延迟 5 秒后DisplayServer.window_move_to_foreground()随后把标题恢复为ProjectSettings.get_setting(application/config/name)——为测试留出「先切走窗口」的时间Request Attention同样延迟 5 秒后DisplayServer.window_request_attention()任务栏闪烁等并恢复标题Vibrate Device (200 ms)Input.vibrate_handheld(200)Vibrate Device (1000 ms)Input.vibrate_handheld(1000)Add Global Menu Items先检查FEATURE_GLOBAL_MENU向主菜单栏_main与 Dock 右键菜单_dock注入子菜单/菜单项global_menu_add_submenu_item()、global_menu_add_item()含点击/快捷键回调 lambda、KEY_MASK_META \| KEY_1快捷键、global_menu_add_separator()Remove Global Menu Item按索引逆序global_menu_remove_item()清空_main、_dock下刚添加的菜单项Get Clipboard Contents检查FEATURE_CLIPBOARD后DisplayServer.clipboard_get()用OS.alert()弹窗展示剪贴板内容Set Clipboard ContentsDisplayServer.clipboard_set(Modified clipboard contents. ...)写入含 Unicode 的剪贴板文本Display AlertOS.alert(Hello from Godot! ...)弹出模态系统对话框Kill Current ProcessOS.kill(OS.get_process_id())——直接结束当前进程是压力测试进程管理能力的按钮Web 平台的兼容性处理actions.gd的_ready()专门针对 Web 导出做了一次「能力裁剪」当OS.has_feature(web)为真时以下 8 个按钮会被置灰并追加(not supported on Web)提示OpenShellFolder文件管理器、MoveWindowToForeground、RequestAttention、VibrateDeviceShort、VibrateDeviceLong、AddGlobalMenuItems、RemoveGlobalMenuItem、KillCurrentProcess。这是展示「先用OS.has_feature()/DisplayServer.has_feature()探测平台能力再决定是否调用」这一跨平台最佳实践的典型范例——OS.alert()也在多处充当不支持时的用户提示手段。Mono/.NET 扩展CSharpTest.cs 与预处理器宏README 说明在启用 Mono 的 Godot 版本中Godot 会把 C# 脚本加载进对应节点然后由 C# 预处理器宏判定的信息会追加到左侧面板。README 中描述为MonoTest节点当前仓库的实际实现为CSharpTest.cs与CSharpTest节点。检测与加载逻辑位于 os_test.gd用ResourceLoader.exists(res://CSharpTest.cs)判断 Mono 模块是否启用显示Mono module enabled: Yes/No若存在则通过csharp_test.set_script(load(res://CSharpTest.cs))动态挂脚本再调用两个公开方法OperatingSystem()用GODOT_WINDOWS / GODOT_LINUXBSD / GODOT_MACOS / GODOT_ANDROID / GODOT_IOS / GODOT_WEB / GODOT / else宏链返回Windows / Linux/*BSD / macOS / Android / iOS / Web / Other / UnknownPlatformType()用GODOT_PC / GODOT_MOBILE / GODOT_WEB / GODOT宏链返回PC / Mobile / Web / Other / Unknown。由于这些宏只在对应目标平台编译时被定义因此它们能反映「当前构建产物」的真实平台属性与运行时通过OS.get_name()拿到的信息互为印证。这也解释了为何 demo 特意保留.csproj/.sln工程文件Godot.NET.Sdk/4.0.0-dev5、net472需要 C# 信息时用 .NET 版 Godot 打开即可纯 GDScript 运行完全不受影响。回归测试价值与扩展方向从源码结构可以梳理出该 demo 的两种典型用法移植验证把 Godot 移植到一个新平台后运行本 demo 逐一核对左侧 15 个分类的输出是否合理、14 个按钮是否生效即可快速发现该平台上未实现或行为异常的OS/DisplayServer能力回归检查由于所有信息同时通过print_rich()输出到终端可以无头运行并抓取终端文本做 diff自动比对不同版本、不同平台间的行为差异脚本注释亦明确指向这一用途。若要在自己的项目里复用只需把OS.get_*()、DisplayServer.*、Time.*等调用模式照搬到对应业务逻辑中并沿用has_feature()/OS.has_feature()的「先探测、后调用」写法即可保证跨平台健壮性——这正是 os_test 作为一个「官方、porting 标签」演示项目最值得借鉴的工程范式。延伸阅读项目级说明根目录 README2D/3D/音频/计算/GUI 等各分类演示索引与 CONTRIBUTING.md本演示的配置与场景project.godot、os_test.tscn核心实现os_test.gd信息采集、actions.gd操作按钮、CSharpTest.csC# 宏判定仓库中其他与系统/平台能力相关的演示misc/window_management窗口管理、misc/multiple_windows多窗口、misc/joypads手柄输入可作交叉参考。赞分享示例工程【免费下载链接】godot-demo-projectsDemonstration and Template Projects项目地址https://gitcode.com/GitHub_Trending/go/godot-demo-projects点击查看免费下载相关推荐掌控操作系统Youre the OS掌控操作系统Youre the OS 在计算机世界中扮演一个至关重要的角色是什么感觉想象一下你是整个操作系统的灵魂负责管理进程、内存和输入输出事件。上一篇Mastra 文档审计评分标准RUBRIC全面解析verdicts、五大审计维度与可复现的证据链要求下一篇balenaEtcher 快速烧录指南安全制作 SD 卡与 U 盘启动盘创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表