您的位置:首页 > 理论基础 > 计算机网络

fancy2D 源码解析 1 TestCpp

2015-07-13 19:40 597 查看
fancy2D 源码解析 1 TestCpp

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

如果你成功编译了项目并成功运行的话,单步执行,一切一定是从TestCpp工程中的Main.cpp开始的

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

引用的项

// 如果需要引入fcyStream则必须在f2d之前引入
#include <fcyIO/fcyStream.h>
#include <fcyFile/fcyModelMeshFile.h>
#include <fcyFile/fcyModelMeshExporter.h>
#include <fcyOS/fcyDebug.h>
#include <fcyOS/fcyMultiThread.h>

// UI库
#include <fcyUIBase/fuiPage.h>
#include <fcyUIBase/fuiFactory.h>
#include <fcyUIBase/fuiPropBlock.h>

// f2d头文件
#include <f2d.h>

#include <iostream>
#include <string>
#include <vector>

using namespace std;


引用了fancy2D的大量头文件与C++标准库。作者同时提醒用户“如果需要引入fcyStream则必须在f2d之前引入”。

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

main函数

接着从main函数开始看起

//int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
int main()
{
#ifdef _DEBUG
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);
// _CrtSetBreakAlloc(5351);
<pre name="code" class="cpp">#endif
MyApp tApp;

// system("pause");
return 0;
}


乍一看,什么?!main函数竟然如此简短?!没错,就是这么简短,接下来我们就来细细品味一下这一代码块。

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

注释的代码

在这12行代码中,一共有3行被注释的代码。

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)

众所周知,WIN32的mian函数,在使用WinMain时并不会产生一个控制台窗口,而fancy2D中有大量自己定义的异常输出,故作者使用了main函数。若不需要控制台窗口了只需要将行注释放到int main()那行即可,十分方便。

_CrtSetBreakAlloc(5351);

在5351内存被分配时中断。大约是比较严重的问题,作者将次行代码注释而不是删除。

_CrtSetBreakAlloc的用法可参考:https://msdn.microsoft.com/en-us/library/4wth1ha5.aspx

system("pause");

众所周知,在次以上的代码运行完毕后暂停,而不是控制台的关闭。

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

_CrtSetDbgFlag

我第一次看这代码时吃了个闭门羹,竟不知_CrtSetDbgFlag为何物,做什么用。

这个函数大致上可以解释为内存泄漏的检测

详细用法:https://msdn.microsoft.com/en-us/library/aa246761%28v=vs.60%29.aspx

_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)一句用来获取当前的状态,并用位操作符 | 添加_CRTDBG_LEAK_CHECK_DF状态,最终设置状态。

注:#ifdef _DEBUG使用的原因

由于_CrtSetDbgFlag只能在debug模式下使用,故作者定义在_DEBUG定义的情况(即debug模式下)下调用此函数。

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

MyApp tApp

在Main.cpp中定义类的对象,因为一切都在MyApp类的构造函数中办好了,故只需这句语句。

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

MyApp类

注:由于MyApp全部代码较长,不贴了。

MyApp公共继承自f2dEngineEventListener,其目的是为了重写接口OnUpdate与OnRender。

private:
// 必要组件
fcyRefPointer<f2dEngine> m_pEngine;
f2dFileSys* m_pFileSys;
f2dRenderer* m_pRenderer;
f2dRenderDevice* m_pDev;
f2dSoundSys* m_pSoundSys;

// 渲染器
fcyRefPointer<f2dGraphics2D> m_pGraph2D;

// 测试用
fuiResProviderImpl tProvider;
fcyRefPointer<fuiPage> m_pRootUIPage;

fcyRefPointer<f2dGeometryRenderer> m_pGRender;
成员如上所示。

大部分成员从字面意思就能知道是做什么的,然而这里有两处我乍一看也没弄懂的来分析一下。

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

fcyRefPointer

这是fancy2D中定义的引用计数模板类,点击f12可以查看定义。

在这个模板类的定义中,作者重载了指针操作的一些操作符,与基本的引用计数方法。

注:这个类是线程安全的

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

fuiResProviderImpl

fancy2D UI控件资源提供类

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

showSelfInfo

打印fancy2D版本信息,本机cpu信息,显卡名称,分辨率,抗锯齿等级。通过阅读代码就可知。

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

至此,TestCpp还剩下MyApp重写的OnUpdate与OnRender与其构造函数。

今天累了,昨晚没睡好。╯︿╰明天继续吧

未完待续
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: