作者:CYM
因为在做地形管理,本来想自己写一个简单的物理引擎,但发现用现有的Havok物理引擎会更好,毕竟是世界一流的物理引擎,还是免费.但唯一的遗憾就是关于Havok的教程太少,少的可怜.只能硬着头皮看官方的英文SDK.这里先介绍一下最简单的Hello World,个人水平有限,难免会出错,所以写的不好不要喷
想要使用Havok物理引擎需要先到Havok官网去下载SDK,在下载之前先要注册,随便注册一下就可以了,下图:
官网地址:http://software.intel.com/sites/havok/
如果是美工的话就下载Havok Content Tools for Game Artists and Designer
程序的话就下载:Havok Physics and Havok Animation SDKs For Programmers
按自己需要选择自己需要的版本
HelloWorld的源码可以在官方的SDK中hk2011_1_0_r1\Demo\StandAloneDemos\StepByStep\MemoryUtilInit文件中找到,用VS2010打开
在编译之前先要配置好环境:如图
最好还要修改一下代码,在Main函数的末尾加上std::getchar(),,,这样可以避免程序一闪而过
程序的一开始会有三行关于内存方面的代码,由于没注释,所以先讲解一下
hkMallocAllocator baseMalloc;
//这段代码用于未解决器分配内存,因为这里只是简单的Helloworld所以分配给他的内存为0MB
hkMemoryRouter* memoryRouter = hkMemoryInitUtil::initDefault( &baseMalloc, hkMemorySystem::FrameInfo(0) );
hkBaseSystem::init( memoryRouter, errorReport );
上面三段代码用到了两个类:hkMallocAllocator 和hkMemoryRouter,简单的介绍下这两个类,如果想要获取更多信息可以看SDK
hkMallocAllocator:是最低级的接口,通过指定的块可以被申请和释放
hkMemoryRouter:是每个线程,hkMallocAllocator的集合,他包涵regular heap, temporary allocations 和 debug allocations的分配器器hkMemorySystem:最高级别的接口用于整个系统.创建新的线程 memory router(实在不知道这个怎么翻译,叫内存路由器?),通常包涵所有的分配器对于所有的线程
下面是这三个接口的关系图:
--------------------------------------------------以下是源码-----------------------------------------------------------
// 这个简单的控制台程序将演示如何使用 hkMemoryInitUtil去初始化内存,
// 以及Havok核心系统的启动和关闭.
#include <Common/Base/hkBase.h>
#include <Common/Base/Memory/System/Util/hkMemoryInitUtil.h>
#include <Common/Base/Memory/Allocator/Malloc/hkMallocAllocator.h>
#include <Common/Base/Fwd/hkcstdio.h>
#if defined(HK_PLATFORM_NGP)
unsigned int sceLibcHeapSize = 64*1024*1024;
#endif
//错误打印函数
static void HK_CALL errorReport(const char* msg, void* userContext)
{
using namespace std;
printf("%s", msg);
}
int HK_CALL main(int argc, const char** argv)
{
hkMallocAllocator baseMalloc;
hkMemoryRouter* memoryRouter = hkMemoryInitUtil::initDefault( &baseMalloc, hkMemorySystem::FrameInfo(0) );
hkBaseSystem::init( memoryRouter, errorReport );
{
//HK_WARN_ALWAYS(0x417ffd72, "Hello world!");
std::printf("%s","Hello World!~");
}
hkBaseSystem::quit();
hkMemoryInitUtil::quit();
//暂停,按任意键退出
std::getchar();
return 0;
}
//以下这几段代码现在也不是很了解,但大概猜一下应该是排除一些用不到的东西,来减小程序的大小和包涵一些配置
#include <Common/Base/keycode.cxx>
// we're not using anything product specific yet. We undef these so we don't get the usual
// product initialization for the products.
#undef HK_FEATURE_PRODUCT_AI
#undef HK_FEATURE_PRODUCT_ANIMATION
#undef HK_FEATURE_PRODUCT_CLOTH
#undef HK_FEATURE_PRODUCT_DESTRUCTION
#undef HK_FEATURE_PRODUCT_BEHAVIOR
#undef HK_FEATURE_PRODUCT_PHYSICS
// Also we're not using any serialization/versioning so we don't need any of these.
#define HK_EXCLUDE_FEATURE_SerializeDeprecatedPre700
#define HK_EXCLUDE_FEATURE_RegisterVersionPatches
#define HK_EXCLUDE_FEATURE_RegisterReflectedClasses
#define HK_EXCLUDE_FEATURE_MemoryTracker
// This include generates an initialization function based on the products
// and the excluded features.
#include <Common/Base/Config/hkProductFeatures.cxx>