以前在codeproject上看到过一篇关于内存池的文章(http://www.codeproject.com/KB/cpp/MemoryPool.aspx)
下载下来试了试,感觉有点问题
想给引擎加入内存池,考虑到当前业余时间在看Loki
就索性使用其SmallObject了
对于内存池当然要求之一那就是速度
其次对我来说我比较关系以下的这类问题
一句话概括就是
Base* ptr = new SubClass;
索性我就根据Loki库和Boost的Object_Pool
设计了如下的引擎内存池(当然问题还很多以后慢慢修改)
#ifdef LOKI_EXT_LIB
#include <GEngine/Loki/Loki.hpp>
#else
#error 需要包含Loki库
#endif
namespace core
{
////////////////////////////////////////////////////////////
/// 定义盖莫引擎2.1.2内存池对象
////////////////////////////////////////////////////////////
struct MemoryPool
{
public:
////////////////////////////////////////////////////////
/// 获取,释放指定大小的内存
////////////////////////////////////////////////////////
template<class T>
static T* Malloc(size_t size)
{
return (T*)MEMORY_POOL.Allocate(size,false);
}
template<class T>
static void Free(T* ptr,size_t size)
{
MEMORY_POOL.Deallocate(ptr,size);
}
////////////////////////////////////////////////////////
/// 构造无参数的对象类型并返回指针
////////////////////////////////////////////////////////
template<class T>
static T* Construct()
{
void* ptr = MEMORY_POOL.Allocate(OBJECT_SIZE(T),false);
if(ptr == NULL)
return NULL;
new(ptr)T();
return (T*)ptr;
}
////////////////////////////////////////////////////////
/// 构造带有1个参数的对象类型并返回指针
////////////////////////////////////////////////////////
template<class T,class P1>
static T* Construct(const P1 &p1)
{
void* ptr = MEMORY_POOL.Allocate(OBJECT_SIZE(T),false);
if(ptr == NULL)
return NULL;
new(ptr)T(p1);
return (T*)ptr;
}
////////////////////////////////////////////////////////
/// 构造带有2个参数的对象类型并返回指针
////////////////////////////////////////////////////////
template<class T,class P1,class P2>
static T* Construct(const P1 &p1,const P2 &p2)
{
void* ptr = MEMORY_POOL.Allocate(OBJECT_SIZE(T),false);
if(ptr == NULL)
return NULL;
new(ptr)T(p1,p2);
return (T*)ptr;
}
////////////////////////////////////////////////////////
/// 构造带有3个参数的对象类型并返回指针
////////////////////////////////////////////////////////
template<class T,class P1,class P2,class P3>
static T* Construct(const P1 &p1,const P2 &p2,const P3 &p3)
{
void* ptr = MEMORY_POOL.Allocate(OBJECT_SIZE(T),false);
if(ptr == NULL)
return NULL;
new(ptr)T(p1,p2,p3);
return (T*)ptr;
}
////////////////////////////////////////////////////////
/// 构造带有4个参数的对象类型并返回指针
////////////////////////////////////////////////////////
template<class T,class P1,class P2,class P3,class P4>
static T* Construct(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4)
{
void* ptr = MEMORY_POOL.Allocate(OBJECT_SIZE(T),false);
if(ptr == NULL)
return NULL;
new(ptr)T(p1,p2,p3,p4);
return (T*)ptr;
}
////////////////////////////////////////////////////////
/// 构造带有5个参数的对象类型并返回指针
////////////////////////////////////////////////////////
template<class T,class P1,class P2,class P3,class P4,class P5>
static T* Construct(const P1 &p1,const P2 &p2,const P3 &p3,const P4 &p4,const P5 &p5)
{
void* ptr = MEMORY_POOL.Allocate(OBJECT_SIZE(T),false);
if(ptr == NULL)
return NULL;
new(ptr)T(p1,p2,p3,p4,p5);
return (T*)ptr;
}
////////////////////////////////////////////////////////
/// 给定对象的析构(size为对象大小)
////////////////////////////////////////////////////////
template<class T>
static void Destruct(T* ptr, size_t size)
{
if(ptr == NULL || size <= 0)
return;
ptr->~T();
MEMORY_POOL.Deallocate(ptr,size);
}
////////////////////////////////////////////////////////
/// 获取可分配的最大对象大小
////////////////////////////////////////////////////////
static int GetMaxObjSize()
{
return MEMORY_POOL.GetMaxObjectSize();
}
////////////////////////////////////////////////////////
/// 获取字节对齐字节数
////////////////////////////////////////////////////////
static int GetAlignment()
{
return MEMORY_POOL.GetAlignment();
}
};
静态的Malloc和Free是分配和释放原生态的内存
而Construct,Destruct则是构造和析构对象形式的内存
这里提供了6个版本的Construct函数
分别对应0-5个构造函数参数
记得以前遇到的一个问题
那就是假如有一个对象 她没有默认构造函数(只有带参数构造函数)
如果现在需要分配N个她该如何操作?
那就是placement new 了
发布最新版本的盖莫游戏引擎2.1.1
首先说明当前内置demo列表:
1.字体测试 +
2.图形测试 +
3.粒子测试-喷泉测试 +
4.音频测试 +
5.输入输出测试 +
6.引擎框架 +
7.3d音效测试 +
8.视频播放 +
9.BoingBall +
10.粒子火焰测试 +
11.立方体绘制测试 +
12.隧道进度仿真 +
13.天空盒测试 +
14.天空面测试 +
15.天空顶测试 +
16.地形测试 +
17.物理测试1 +
18.物理测试2 +
19.物理测试1 +
20.物理测试2 +
21.md2模型测试 +
22.3ds模型测试 +
23.线程渲染 +
24.光源测试 +
25.立方体纹理 +
26.球面纹理 +
27.多线程资源载入 +
.....
下面是下次修改要点
2.1.2版本计划加入或更新功能
1.音频引擎(内置盖莫音频引擎1.2.8版本)
1.支持audio capture
2.支持midi音乐格式
2.
文件系统 1.对7z压缩格式的支持
2.支持
xml配置文件
3.插件系统
1.引入插件系统
4.GLSL
1.对GLSL的支持
5.渲染引擎
1.对各类广告牌的支持
2.支持水面渲染
3.支持动态天空
4.支持lod地形
5.支持md3模型
6.支持环境映射
7.加入渲染到纹理
8.加入体积雾
9.支持深度纹理
10.支持压缩纹理
11.支持屏幕图形捕获
12.支持投影纹理
6.内存池
1.初步使用内存池(考虑Loki)
7.数学库
1.完善数学库并作全面的优化处理
8.多线程
1.加入引擎专用多线程计算器(用于求值计算)
9.框架
1.修改InitDevice函数减少参数个数
9.其它
1.加入
GEngine水印
2.支持设置,加载游标图形(内置3种常见游标形状图标)
3.加入一个新3D仿真程序
4.others
下面是盖莫QQ群列表:
盖莫QQ群列表
1.盖莫3群 超级群-高端技术:81836528
2.盖莫0群 引擎讨论:20997748
3.盖莫玩家交流群:23376710
4.盖莫新人集中营:49749954
5.盖莫
游戏开发群:58970936
6.其他盖莫非技术群列表:...
再者是当前版本编译
当前编译版本为win32下的gcc版本
可使用codeblock,devc++设计游戏
下面是当前功能
盖莫游戏引擎2.1.1功能描述
1.音频引擎:内置盖莫音频引擎1.1.2版本
支持wav,mp3,
ogg3种音频格式,
基于流式多线程音频播放
真3d音效
支持低通,次级音效(本模块可独立出售)
2.视频系统:支持mp4,mpg等视频格式(可替换为vlc模块)
3.图形处理:
支持bmp,jpg,png,gif等28种图形格式的载入,切割,翻转,旋转等常见操作
4.文件系统:
简便易用-支持zip,pk3等几种压缩格式(可加入对7z的解压支持)
5.3d模型支持
静态模型:3ds,ase(做为仿真之用)
动态模型:md2
6.天空:支持天空盒,天空面,天空顶3种渲染模式
7.地形:支持地形纹理细节渲染
8.支持镜头光功能
9.支持从脚本载入材质,雾,光配置(当前为lua脚本)
10.支持动态光照,雾,材质渲染
11.内置数学库包含矩阵,四元数,欧拉角等基本数据结构
12.支持
truetype字体
13.支持多线程渲染
14.内置快速的三角函数求值和数学随机数
15.内置Lua/LuapLua脚本引擎
16.基于ode物理引擎
17.支持对简单的几何对象渲染
18.支持日志文件
19.支持输入输出系统
20.支持3d坐标查询
21.支持2d纹理,球面纹理和立方体纹理
22.支持2d动画
23.支持多重纹理
24.支持粒子系统(可基于脚本配置)
25.支持多线程资源载入
26.另外还有一个游戏demo(资料在这里:http://www.gaimo.net/viewthread.php?tid=2705&extra=page%3D1)
关于盖莫音频引擎更新记录:
盖莫音频引擎更新概要
1.2版本-支持midi格式--支持audio capture
1.3版本-支持ape格式 --支持从内存中播放音频 提供ptf文档
1.4版本-无需安装
openal 即可使用支持更多音效
1.5版本-支持vc,c#,python语言,支持linux操作系统
1.6版本-
当前盖莫音频引擎为1.1.6版本
盖莫音频引擎可免费使用于非商业用途
使用于商业用途只需少许许可费即可(为了继续开发)!
如果程序不能运行
则需要安装openal
盖莫游戏引擎2.1.1使用的第三方库列表
1.视频库ffmpeg
2.线程库zthread
3.插槽sigc++/sigslot
4.gl扩展glew
5.lua封装luaplus
6.物理引擎ode
下载在这里
1.csdn
http://download.csdn.net/source/2257934
http://download.csdn.net/source/2257248
http://download.csdn.net/source/2257104
2.pudn 下载本sdk free!
http://www.pudn.com/downloads243/sourcecode/game/detail1132418.html
从csdn站点下载需要merge下载文件!
关于盖莫软件技术工作室
关于成都盖莫软件技术工作室
成都盖莫软件技术工作室成立于2010年1月份
主要从事游戏引擎设计和3d仿真业务
如果有任何疑问和建议请致函:ccsdu2010@gmail.com
这是使用盖莫游戏引擎2.1.1设计的射击类小游戏
题材源于SpaceInvader Game.
当前仅设计了一个关卡
以后每发布一次游戏引擎
本游戏会升级一个版本
本游戏提供源码
使用devc++,codeblock可编译之
截图1:
截图2:
截图3:
截图4:
关于代码的下载
在这里:
当前提供2个下载站点:
SpaceInvader.
http://www.pudn.com/downloads243/sourcecode/game/detail1132305.html
http://download.csdn.net/source/2257020
摘要: 以前大致看过模板元编程但是并没有深入进去现在就拿比较小的Loki库研究了本文主要涉及的是其头文件TypeMapIP.h1.根据给定常量生成对等枚举变量
////////////////////////////////////////////////////////////////////////////////// class template Int2Type//...
阅读全文
摘要: 接上文下面看看TypeList的类型删除功能相关源码为:
/**/////////////////////////////////////////////////////////////////////////////////// class template Erase// Erases the first occurenc...
阅读全文
接上篇
本文主要涉及rapidxml读文件的操作
基本的步骤为
首先获取xml文件数据
然后分析数据
获取节点
获取属性
获取名字
获取值
...
代码如下:
#include <iostream>
#include <rapidxml/rapidxml.hpp>
#include <rapidxml/rapidxml_utils.hpp>
#include <rapidxml/rapidxml_print.hpp>
using namespace rapidxml;
int main()
{
file<> fdoc("config.xml");
std::cout<<fdoc.data()<<std::endl;
xml_document<> doc;
doc.parse<0>(fdoc.data());
std::cout<<doc.name()<<std::endl;
//! 获取根节点
xml_node<>* root = doc.first_node();
std::cout<<root->name()<<std::endl;
//! 获取根节点第一个节点
xml_node<>* node1 = root->first_node();
std::cout<<node1->name()<<std::endl;
xml_node<>* node11 = node1->first_node();
std::cout<<node11->name()<<std::endl;
std::cout<<node11->value()<<std::endl;
//! 修改之后再次保存
xml_node<>* size = root->first_node("size");
size->append_node(doc.allocate_node(node_element,"w","0"));
size->append_node(doc.allocate_node(node_element,"h","0"));
std::string text;
rapidxml::print(std::back_inserter(text),doc,0);
std::cout<<text<<std::endl;
std::ofstream out("config.xml");
out << doc;
system("PAUSE");
return EXIT_SUCCESS;
}
生成的xml为:
<?xml version='1.0' encoding='utf-8' ?>
<config>
<color>
<red>0.1</red>
<green>0.1</green>
<blue>0.1</blue>
<alpha>1.0</alpha>
</color>
<size>
<x>640</x>
<y>480</y>
</size>
<mode fullscreen="false">screen mode</mode>
</config>
需要说明的是rapidxml明显有一个bug
那就是append_node(doc.allocate_node(node_element,"h","0"));的时候并不考虑该对象是否存在!
经过这2篇 基本上就可以使用xml了
当然这里并没有涉及异常处理
盖莫游戏引擎1.x版本是采用libxml操作xml文件的
这个库弄得太复杂了
现在计划从2.1.2开始使用rapidxml操作xml
首先上一个简单的xml写文件
如下:
#include <iostream>
#include <rapidxml/rapidxml.hpp>
#include <rapidxml/rapidxml_utils.hpp>
#include <rapidxml/rapidxml_print.hpp>
using namespace rapidxml;
int main()
{
xml_document<> doc;
xml_node<>* rot = doc.allocate_node(rapidxml::node_pi,doc.allocate_string("xml version='1.0' encoding='utf-8'"));
doc.append_node(rot);
xml_node<>* node = doc.allocate_node(node_element,"config","information");
xml_node<>* color = doc.allocate_node(node_element,"color",NULL);
doc.append_node(node);
node->append_node(color);
color->append_node(doc.allocate_node(node_element,"red","0.1"));
color->append_node(doc.allocate_node(node_element,"green","0.1"));
color->append_node(doc.allocate_node(node_element,"blue","0.1"));
color->append_node(doc.allocate_node(node_element,"alpha","1.0"));
xml_node<>* size = doc.allocate_node(node_element,"size",NULL);
size->append_node(doc.allocate_node(node_element,"x","640"));
size->append_node(doc.allocate_node(node_element,"y","480"));
node->append_node(size);
xml_node<>* mode = doc.allocate_node(rapidxml::node_element,"mode","screen mode");
mode->append_attribute(doc.allocate_attribute("fullscreen","false"));
node->append_node(mode);
std::string text;
rapidxml::print(std::back_inserter(text), doc, 0);
std::cout<<text<<std::endl;
std::ofstream out("config.xml");
out << doc;
system("PAUSE");
return EXIT_SUCCESS;
}
生成的xml文件为:
<?xml version='1.0' encoding='utf-8' ?>
<config>
<color>
<red>0.1</red>
<green>0.1</green>
<blue>0.1</blue>
<alpha>1.0</alpha>
</color>
<size>
<x>640</x>
<y>480</y>
</size>
<mode fullscreen="false">screen mode</mode>
</config>
说实话 感觉这个比较不错
希望更多的人使用它!
这是ode物理引擎中的关节类型和图例
对于关节类型上图是很直观的了
1.球窝关节(Ball Socket)
2.合页关节(Hinge)
3.插销关节(Slider)
4.万向轮关节(Univeersal)
5.Hinge2关节
6.PR关节
PR关节即A prismatic and rotoide joint
是插销关节和荷叶关节的组合形式
7.PU关节
PU关节即A prismatic-Universal joint (JointPU)
他是插销关节和万向轮关节的组合形式
8.Piston joint 关节
Piston joint 关节类似于插销关节但是她可以绕轴转动
9.接触面关节
物理受重力落体过程中就需要使用到接触面关节
10.A Motor关节
该关节可以控制对象之间的相对角速度
11.另外还有LMotor关节,plane-2d 关节
下面是关机的生成函数列表,其销毁函数是相同的
dJointID dJointCreateBall (dWorldID, dJointGroupID);
dJointID dJointCreateHinge (dWorldID, dJointGroupID);
dJointID dJointCreateSlider (dWorldID, dJointGroupID);
dJointID dJointCreateContact (dWorldID, dJointGroupID, const dContact *);
dJointID dJointCreateUniversal (dWorldID, dJointGroupID);
dJointID dJointCreateHinge2 (dWorldID, dJointGroupID);
dJointID dJointCreatePR (dWorldID, dJointGroupID);
dJointID dJointCreatePU (dWorldID, dJointGroupID);
dJointID dJointCreatePiston (dWorldID, dJointGroupID);
dJointID dJointCreateFixed (dWorldID, dJointGroupID);
dJointID dJointCreateAMotor (dWorldID, dJointGroupID);
dJointID dJointCreateLMotor (dWorldID, dJointGroupID);
dJointID dJointCreatePlane2d (dWorldID, dJointGroupID);
参考文献:http://opende.sourceforge.net/wiki/index.php/Manual_%28Joint_Types_and_Functions%29
关于ode物理引擎的时候可参考ode库自带demo
当然也可以参考盖莫游戏引擎sdk上面附有3个基于ode的物理模拟
这是使用盖莫游戏引擎(2.1.1)设计的天空顶小例
天空顶比较类似天空面
具体代码和图片如下:
#include <GEngine/Gaimo.hpp>
using namespace std;
using namespace core;
int Main()
{
//! 初始化引擎设备并得到设备指针
RefPtr<Device> device = InitDevice("天空顶测试");
//! 得到引擎场景指针
RefPtr<SceneManager> scenemanager = device->GetSceneManager();
//! 得到引擎资源指针
RefPtr<ResourceManager> resourcemanager = device->GetResourceManager();
//! 获取图形管理器指针
RefPtr<ImageManager> imagemanager = resourcemanager->GetImageManager();
//! 得到视频驱动器指针
RefPtr<VideoDriver> videodriver = device->GetVideoDriver();
//! 得到天空图形和纹理
RefPtr<Image> image = imagemanager->CreateObject("sky","..\\image\\sky\\top.jpg");
RefPtr<Texture> texture = resourcemanager->GetTextureManager()->CreateTexture("sky",image);
//! 得到天空盒指针
SkyDomeDesc desc;
desc.texture = texture;
RefPtr<Renderable> sky = scenemanager->CreateSkyDome(desc);
//! 获取摄像机指针
RefPtr<Camera> camera = scenemanager->GetCameraManager()->CreateCamera("camera",
Vector3f(),
Vector3f(100,60,0));
camera->SetViewPort(Recti(0,0,640,480));
camera->SetPerspective(45.0f,640.0f/480.0f,0.1f,600.0f);
//! 获取雾指针
RefPtr<Fog> fog = resourcemanager->GetFog("..\\script//fog.lua","fog");
fog->Render();
BEGIN_LOOP(device)
videodriver->SetClearBuffer(ENGINE_CLEAR_COLOR | ENGINE_CLEAR_DEPTH);
camera->Render();
sky->Render();
END_LOOP(device)
return 0;
}
摘要: Loki中的TypeList这块是Loki中比较基础的部分其主要涉及类型链表(TypeList)相关功能有1.模板化得类型链表-最打提供18个类型参数2.获取类型链表的长度3.获取给定索引位置的参数类型4.当索引越界时获取设定的参数类型5.类型链表的类型增加和剔除6.其他下面是makeTypeList的代码
1 &...
阅读全文