底层功能说明
对于任何C++框架, 健壮和稳定的底层是非常重要的. VOL::core是在参考了现在流行的多个商用游戏引擎的底层库的基础上, 重新按使用习惯全新实现的C++通用库.
类说明
VOL::core整体框架设计是支持32位(x86)和64位(IA64和X64)CPU的多平台C++通用库, 按设计层级, 大致可以划分成一下的功能实现:
一. 实现的通用支持:
- 容器 : [common.h & common.inl]可变数组, 双向链表, 栈, 队列和映射表, 红黑树(待定)
- 编码及加密 : [codec.h & codec.inl-可逆编码及加密]
[crypto.h & crypto.inl-不可逆编码及加密]
MD5, (SHA, AES, RC4, RC5, RC6, BASE64和blowfish)(待定)
- 异常基类 : [exception.h & exception.inl]
- 句柄基类 : [handle.h & handle.inl]
- 线性代数 : (待定)
- 动态库加载 : [module.h & module.inl]
- 随机算法 : [rand.h]
- 智能指针 : [refcount.h & refcount.inl]
- 运行类型信息(RTTI) : [rtti.h & rtti.inl]
- 单件封装: [singleton.h & singleton.inl]
- 串行化 : [stream.h & stream.inl]
- 缓存串行化支持 : [streambuf.h & streambuf.inl]
- 文件串行化支持 : [streamfile.h & streamfile.inl]
- 同步/异步对象 : [sync.h & sync.inl]
- 类型特征(字符串操作封装) : [traits.h & traits.inl]
- 字符串 : [tstring.h & tstring.inl]
- UUID(通用唯一识别码) : [uuid.h & uuid.inl]
二. 实现的通用单件:
- 硬件和平台信息 : [platform.h]
解析启动命令行参数, 确定调试信息输出级别
调试版本开启crt内存申请跟踪
获取CPU和内存信息
保存VOL::core运行状态信息
- 哈希 : [hash.h] 基于CRC算法的哈希实现
- 内存管理器 : [mobject.h]内存申请和释放管理, 追踪内存使用情况
- 局部内存管理 : [memaid.h] 局部作用域级的动态内存管理,
可以在特定作用域内申请动态内存而不需要释放,
同时管理大量固定大小缓存重复使用
- 共享数据表 : [keyvalue.h]将数据按名字保存在表中共享
- 文件路径管理 : [filepath.h]文件和目录的创建, 复制, 移动, 查找操作, 以及路径变量的保存
- 线程池 : [thread.h]线程管理及线程任务维护
- 事件管理 : [event.h]异步事件管理
- 对象管理器 : [object.h]实体对象管理
框架说明
例子说明
VOL::core 现在使用的版本是32位(x86)Windows平台动态链接库版本, 下面我们按一个一个例子来逐步学习使用底层库.
Hello World例子
和开始学习计算机编程一样, 我们从”Hello World!”开始.
1. 创建C++Win32项目, 控制台程序或者标准程序都可以, 创建完成以后, 开始配置项目参数, 先将SVN中的三个目录复制到解决方案文件保存的目录里
点击testcore0的属性, 进入属性对话框
- 调试选项 –DevLevel:XXXX[数值由def.h中调试信息输出组成]
enum
LOG_LEVEL
{
LOGL_TRACE = 0x00000020,
//32 – 内存申请/释放信息, 及线程和事件中间状态信息LOGL_DEBUG = 0x00000010,
//16 – 调试中间状态信息LOGL_INFO = 0x00000008,
//8 - standard informationLOGL_DUMP = 0x00000004,
//4 - dump informationLOGL_WARN = 0x00000002,
//2 - warnning informationLOGL_ERROR = 0x00000001,
//1- error informationLOGL_DEVMODE = 0x00001000,
// OutDebugString
};
在VC输出窗口或者DbgView查看调试输出, 加上4096值, 图中的4159就是输出全部调试信息, 4127就是输出除去TRACE信息的其他全部信息
- 工作目录 : $(TargetDir)[表示编译最终执行文件所在目录]
没有加上4096作为日志文件输出时, 日志默认路径就是执行文件所在目录, 而不是默认的testcore0的项目文件vcproj所在的目录
- 配置改成所有配置, 然后再C++常规à附加包含目录点开的对话框中加上两项:
.和..\include[testcore0的项目文件vcproj所在的目录的相对路径]
- 连接器常规à附加库目录点开的对话框中加上两项:
.和..\lib[testcore0的项目文件vcproj所在的目录的相对路径]
- 连接器输入à附加依赖项:[可以不用填写, 在代码中使用命令行包含]
Debug : coreD.lib
Release :core.lib
2. 项目使用VOL::core, 需要包含头文件, 项目的stdafx.h中
// stdafx.h :
标准系统包含文件的包含文件,
//
或是经常使用但不常更改的
//
特定于项目的包含文件
//
#pragma
once
#include
"inc.h"
//
包换以他需要用到的类的头文件
//
上面如果链接库配置没有加依赖项的, 可以用下面的命令行增加
#ifdef _DEBUG
#pragma comment(lib,
"coreD.lib")
#else
#pragma comment(lib, "core.lib")
#endif
3. 我们在源文件的main中增加一句调试信息输出语句
[调试信息每次调用会自动加上回车换行符, 除特殊需要, 输出信息不需要加回车换行]
// testcore.cpp :
定义控制台应用程序的入口点。
#include
"stdafx.h"
using
namespaceVOL; // VOL::core属于VOL命名空间
int _tmain(intargc, _TCHAR* argv[])
{
DEV_INFO(TF("Hello World!"));
// 在调试信息中输出Hello World!,
return 0;
}
4. 运行例子程序
直接在VC调试运行, 会出现以下错误
缺少DLL文件, 现在将DLL目录里的core.dll和coreD.dll复制到编译生成的目录里[默认是解决方案文件实在目录的Debug目录]
下面就可以运行程序了, 由于调试信息输出前面加上了4096, 所以输出是在VC的输出窗口里的
[DEBUG]-->>>Static Platform Build[Jul 8 2012, 16:53:37] Debug Memory Leak Trace Ready<<<---
[DEBUG]Load coreD.dll --- DLL_PROCESS_ATTACH
[INFO] * Static CRC Table init okay
[INFO] * Memory manager singleton[520] init okay
[INFO] Hello World!
[DUMP] * CMemManager singleton Leak Report [Total Leak Chunk 0]
[DUMP] * Report Chunk 0, Block 0
[DUMP] *---CMemManager singleton Stats Report---
[DUMP] | Cur Used Size : 0.0[MB]
[DUMP] | Max Used Size : 0.0[MB]
[DUMP] | Cur Cache Size : 0.0[MB]
[DUMP] | Max Cache Size : 0.0[MB]
[DUMP] | Total Used Time : 0.000[S]
[DUMP] | Alloc Used Time : 0.000[S]
[DUMP] | Realloc Used Time : 0.000[S]
[DUMP] | Free Used Time : 0.000[S]
[INFO] *---Memory manager singleton exit okay---
[DUMP] *---CRC Table Stats Report---
[DUMP] | Used Count : 0
[DUMP] | Used Time : 0.000[S]
[INFO] *---Static CRC Table exit okay---
[DEBUG]Unload coreD.dll --- DLL_PROCESS_DETACH
[DEBUG]-->>>Static Platform Debug Memory Leak Trace Exit<<<---
这就是VOL::core的调试信息输出的结果, 你也可以直接点击编译出来的执行程序, 这样默认输出是日志文件, 我们编译一个Release版本看看输出情况
直接双击Release版本的执行程序, 默认生成日志文件[Release版本没有TRACE和DEBUG级别的输出信息, 这两种只有在Debug版本下才会输出信息]
如果需要控制输出信息, 可以创建一个快捷方式, 增加参数
这样直接运行快捷方式, 按运行参数, 调试信息是由OutDebugString输出, 可以用DbgView工具监视输出