IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> FlaxEngine学习笔记(七):CommandLine模块 -> 正文阅读

[C++知识库]FlaxEngine学习笔记(七):CommandLine模块

2021SC@SDUSC

这一次我们来观察CommandLine模块的代码,顾名思义这一模块的内容是对命令行的命令进行解析。

首先来看CommandLine.h:

struct OptionsData
    {
        /// <summary>
        /// The command line.
        /// </summary>
        const Char* CmdLine = nullptr;

        /// <summary>
        /// -widowed (use windowed mode)
        /// </summary>
        Nullable<bool> Windowed;

        /// <summary>
        /// -fullscreen (use fullscreen)
        /// </summary>
        Nullable<bool> Fullscreen;

        /// <summary>
        /// -vsync (enable vertical synchronization)
        /// </summary>
        Nullable<bool> VSync;

        /// <summary>
        /// -novsync (disable vertical synchronization)
        /// </summary>
        Nullable<bool> NoVSync;

        /// <summary>
        /// -nolog (disable output log file)
        /// </summary>
        Nullable<bool> NoLog;

        /// <summary>
        /// -std (redirect log to standard output)
        /// </summary>
        Nullable<bool> Std;

#if !BUILD_RELEASE

        /// <summary>
        /// -debug !ip:port! (Mono debugger address)
        /// </summary>
        Nullable<String> DebuggerAddress;

        /// <summary>
        /// -debugwait (instructs Mono debugger to wait for client attach for 5 seconds)
        /// </summary>
        Nullable<bool> WaitForDebugger;

稍微解释上面定义的变量:

1.CmdLine:即命令行,是个指针

2.Windowed:是否在使用窗口模式

3.Fullscreen:是否使用全屏模式

4.VSync:是否使用垂直同步

5.NoLog:是否使用输出日志文件

6.Std:是否重定向日志至标准输出

显然都是和设置、模式有关的变量。


        Nullable<bool> D3D12;//DirectX 12状态的模式使用
        Nullable<bool> D3D11;//DirectX 11
        Nullable<bool> D3D10;//DirectX 10
        Nullable<bool> Null;//
        Nullable<bool> Vulkan;//
        Nullable<bool> NVIDIA;//
        Nullable<bool> AMD;//
        Nullable<bool> Intel;//
        Nullable<bool> MonoLog;//
        Nullable<bool> Mute;//
        Nullable<bool> LowDPI;//

这部分的变量大多与硬件和软件兼容配置有关。对于游戏引擎来说,需要考虑用户电脑配置能力并适配大多数用户。


        String Project;//项目路径
        Nullable<bool> NewProject;//创建新项目文件
        Nullable<bool> GenProjectFiles;//创建项目脚本文件,与上面不同是创建脚本文件
        Nullable<bool> ClearCache;//情况项目缓存
        Nullable<bool> ClearCookerCache;//清空游戏缓存
        Nullable<String> Build;//运行游戏项目,对游戏项目进行操作
        Nullable<bool> SkipCompile;//跳过脚本编译
        Nullable<bool> ShaderDebug;//渲染模式debug
        Nullable<String> Play;//场景游玩

到了这一部分就是我们常见的游戏引擎命令。

/// <summary>
    /// Parses the input command line.
    /// </summary>
    /// <param name="cmdLine">The command line.</param>
    /// <returns>True if failed, otherwise false.</returns>
    static bool Parse(const Char* cmdLine);

Parse是非常重要的方法,它能够解析命令行输入的命令语义,数据类型是bool类型,值得注意的是当成功解析时返回的是false。

接下来我们进入CommandLine.cpp看代码的具体实现:

parseArg()函数,在后面parse()函数中会调用该函数

bool ParseArg(Char* ptr, Char*& start, Char*& end)
{
    // Skip leading whitespaces
    while (*ptr && StringUtils::IsWhitespace(*ptr))
        ptr++;

    bool isInComma = false;
    bool isUglyQuote = false;
    start = ptr;
    while (*ptr)
    {
        Char c = *ptr;
        if (StringUtils::IsWhitespace(c) && !isInComma)
        {
            // End
            end = ptr;
            return false;
        }
        else if (c == '\"' || c == '\'')
        {
            if (isInComma)
            {
                // End comma
                end = ptr;
                if (isUglyQuote)
                {
                    ptr += 2;
                    end -= 2;
                }
                return false;
            }
            else
            {
                // Special case (eg. Visual Studio Code adds soo many quotes to the args with spaces)
                isUglyQuote = StringUtils::Compare(ptr, TEXT("\"\\\\\""), 4) == 0;
                if (isUglyQuote)
                {
                    ptr += 3;
                }

                // Start comma
                isInComma = true;
                start = ptr + 1;
            }
        }

        ptr++;
    }
    return true;
}

其函数逻辑十分清晰,对参数ptr指针进行遍历,若为空格则指针加一,相当于跳过空格。

isInComma和isUglyQuote这两个变量作为语法判断的变量,初始化为false。

对ptr再次遍历,对指针是否为逗号或引用进行判断,并相应修改,对ptr指针的内容进行修改,修改成机器能够理解的字符串。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-16 18:39:12  更:2021-11-16 18:40:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:35:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码