以前在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 &...
閱讀全文