#代码功能简述与规范

关于 GN 开发文档, 所有开发资料都集合在头文件里, 每个头文件里都有相应的功能调用解释. 输入参数说明等.
你可以在 GN.h 文件底部看到每个头文件里都包含实现了那些功能内容, 您可以当它为一个目录索引来方便查找到相关功能调用的详细用法.
并可以在这里了解到每个功能头文件的依赖关系结构, 详细看那里的注释!

GN 库的代码编写规范:
---------------------------------------------------------------- < 全局范围内 > ---------------------------------------------------------------------------------

全局函数和全局变量: 均以大写字母开头, 且用驼峰式编写 比如: GlobalValue, GlobalFuntion

数据类型
结构体 : 以小写s加全大写表示 如: sCOLOR
类 : 以c加全大写表示 如: cMODEL 通常带有 ★ 越多的代表实用性越高
常量 : 全大写表示 如: GN_VERSION
举枚标志: 以e加全大写表示 如: eAM_LOOP 当标志的值是按2的倍数递增的 比如 1,2,4,8,16,32... 通常可以用运算符 | 组合在一起

!!各大实用功能通常包含在对应的命名空间里 例如以下:

GNg:: 包含了2D图形与23D都通用的相关功能
最常用的 sIMAGE, cVIEW2D, cTEXT_ART 和 ImageLoad, ImageDraw等

GN3d:: 包含了3D图形,渲染,3D编辑控制等相关功能
最常用的 cSCENE cMODEL cLIGHT cCAMERA cOBJ3D

GNu:: 包含了界面 布局等相关功能
最常用的 cSCROLL_RECTEX, cSELECT_LIST_TEXT, cTEXT_INPUT, cSIM_DIALOG NearCx, NearTy, Near???等

GN:: 包含了常规的通用处理计算所用到的相关功能 例如: 时间 多线程 操作控制 输入输出 运行记录等
最常用的 Key[GK_A] 按键状态 Mouse[GM_LEFT] 鼠标按键状态 RunRec 运行记录 TimeGet??????时间相关函数等

GNio:: 包含了一些特殊不通用的信号输入输出功能等
最常用的 InFv[GI_WX] 重力感应器

GNf:: 包含了文件操作相关的功能
最常用的 sFILE Open Close Read Write 等类以C语言的函数 但这个能方便地定位到读取压缩包内文件或网上服务器文件

GNn:: 包含了网络通讯等相关的功能
最常用的 cCLIENT_HTTP cDTP cSOC_TCP cSOC_UDP

GNa:: 包含了声音处理播放等相关的功能
最常用的 sSOUND cSOUND_SRC cBGM_MUSIC

GNm:: 包含了视频播放等多媒体相关功能
最常用的 cVIDEO

GNd:: 包含数据加密 转码, 转换为引擎专属格式等相关功能

另外还有比如 GNg_?????? GN3d_?????? GN_?????? 这样命名的函数或类, 这些一般不是应用层常用的 但也可以使用的功能
一般是底层API的跨平台转换代替函数 主要是给引擎系统模块开发 插件开发或特别注重性能时的开发用
这些功能通常不进行过多的调用安全检测和对象引用参数的只读保护, 调用时请务必认真看清各参数说明细节! 使用起来比较繁琐

还有如 GT_?????? 开头的功能不建议使用 那些是引擎内部开发时用到的功能 引擎以后的新版本有可能会移除或更变这些 为了保证您所开发程序的兼容性应避免
但您在调试程序便于发现问题时允许您以只读方式查看它的值

-------------------------------------------------------------- < 函数局部范围内 > ------------------------------------------------------------------------------

局部变量和函数参数均以全小写加下划线书写 变量名前带有 _ 的通常为裸指针 例如 char *_pstr;
函数内静态变量 以首个单词小写然后以驼峰式接上其它单词 如: static char *supportExtNames = "png,bmp,tga,hdr";

--------------------------------------------------------------- < 类或结构体内 > --------------------------------------------------------------------------------

z?????? 带z开头的变量或函数都不建议使用, 也是引擎内部开发时用到的功能 在新版本有可能会移除或更变这些 但您在调试程序便于发现问题时允许您以只读方式查看它的值
a?????? 带a开头的可交给用户直接设置它值的属性
??????? 其它以大写开头的成员函数为提功给用户控制该类的方法接口
________ 全小写加下划线的属性一般为结构体的属性 您也可以随便修改这些值

另外由于类会有较多私有属性, 一般在使用前都要调用.Init 设置一些初始值和加载数据, 对于会在初始化加载数据时分配动态内存的函数名里都带"ToData",
或包含"Data"! 如果你已确定该对象已经无用时, 就应该销毁它或调用它的方法.Release释放内部空间, 对于.Init调用一般只是简单设置初值而已, 并不会分配内存

对于有些结构体 为了性能 没有定义它的构造函数 但当您想构造它时, 通常会有一个和结构体同名的全局变量为它的常用值,
您可以方便地用=赋值给它 (因为在结构里我不想用自动的构造函来赋值, 如果遇到一次要分配几千个以上变量这个CPU开销还挺多)

----------------------------------------------------------------- < 其他说明 > -----------------------------------------------------------------------------------

在数学功能的调用参数里带有 Nz 的:
表示这个参数必须是已标准化好的向量, 因为明确这点, 引擎在内部就无需再进行标准化计算, 以节省计算开销, 无显式标记这个的, 引擎在内部会花费计算标准化向量

在取值函数Get????? 通常标注为"获得"表示直接在对象里返回出来而无需计算 标注为"获取"表示返回值要通过一点计算才能得到! 性能会略差一点

函数参数多问题?
主要为实现功能多和便于以后扩展用,但这情况下大多都是把最常用的参数放在前面, 后面的参数都有常用默认值,
一般情况下不必填满所有参数, 当希望得到更详细的控制时才填后面的参数。对于初始化特多参数的调用一般建议在引擎编辑器设置这些, 再通过加载文件来初始化

其它属性变量信息和类型标志信息详情请参看定义它的头文件! 一般在该类用到的标志都在定义该类的头文件那里靠近该类定义的地方, 标志定义通常以 e?????? 这样开头

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

了解了以上这些套路, 您将可以更容易理解引擎逻辑, 引擎并没有强行要求使用者也按这个规范编写代码,
但按这个规范编写的有机会享受到之后的可视化蓝图节点接口自动映射功能! 从而省去编写接口暴露给蓝图的代码!