作者:CYM
先说明一下.由于本人也是Havok物理引擎的初学者(什么?初学者还敢来这里误人子弟,下面鸡蛋像我砸来),因为现在网上关于Havok的中文教程实在是太少,我只找到了一片中文教程,而且也只是简单的介绍了一下,并没有太多的内容,再加上我的记性不是很好,所以我每学到一些东西就把它记录下来,当以后来回顾的时候就不需要再去看官方的SDK,直接看自己写的教程回忆起来就容易多啦.
前言:Havok库中有自带的错误信息检查,可以被用于去帮助调试问题,Havok支持三种错误类型分别是:警告信息(waring),维护信息(assert),和错误信息(error). Havok为我们提供了宏(Macros)去收集这些错误.这样意味着他们能被更容易的编译出来而不使用CPU cycles.
注意:需要注意的是维护信息(asserts) 和警告信息(warnings)是不能在Release配置下被收集到的.所以要确定你连接到得是Debug版本的库.
1.首先先介绍一下hkError类:hkError是一个单态类hkSingleton类提供了错误报告函数去获得警告信息,维护信息,和错误信息.hkError的默认实现是hkDefaultError类,可以为每个error,assert,waring输出相关的信息.在整个hkBaseSystem的初始化中hkErrorReportFunction(错误报告函数)必须被指定.这个函数被用来打印错误信息,但你也可以用自定义的错误处理对象来打印错误信息.
下面是关于错误类型的信息表
以下是一段关于收集错误信息的代码
#include <Common/Base/System/Error/hkerror.h>
//使用宏来收集错误信息
HK_WARN(1, "You haven't initialised the memory manager!" );
HK_ERROR( 2,"Null object passed as parameter." );
HK_ASSERT2(3, (pRigidBody != HK_NULL), "Null body passed as parameter" );
//当然也可以不使用宏,
hkError::getInstance().message(hkError::MESSAGE_ERROR, 4, "Directly accessing the error handler.", __FILE__, __LINE__);
//The file and line number are output in addition to the type of message (warning, assert, error) and a descriptive string that indicates the reason for the error.
上面的getInstance()和message()两个函数这里介绍一下
getInstance():是获取这个单态类的实例函数,这个实例在初始化内存系统的时候被创建也就是当你成功调用hkBaseSystem::init方法后,这个方法继承自hkSingleton< hkError >
message():获取错误信息函数,同时也返回一个整型(int),用来判断是否为error和asserts触发一个断点
另外我们也可以通过s_instance这个成员来获取错误信息.例如:
hkError::s_instance->message(hkError::MESSAGE_WARNING,3,"错误三!~",__FILE__,__LINE__);
这里简单介绍一下s_instance
s_instance:s_instance也是继承自hkSingleton< hkError >的成员变量,他代表一个单态类的实例,是一个指针,他的前缀"s_"代表他是单态类的成员
2.禁用/启用errors, warnings 和 asserts
有时候当我们需要忽略某型错误信息室就可以把它禁用,从而使我们的程序能够继续运行下去,而当我们需要时在把它启用.需要注意的是当你禁用一些错误信息时需要谨慎.因为Havok收集到的asserts通常情况下都意味着这是根本性的错误,说通常情况下不要去禁用一些错误信息.
禁用一个错误信息可以使用setEnabled()函数.
setEnabled():t通过错误信息的id将它启用或者禁用
下面一段代码就演示了如何禁用/启用一个错误信息
hkError::getInstance().setEnabled(3,false); //禁用id为3的错误信息
hkError::getInstance().setEnabled(3,truefalse); //启用id为3的错误信息
这期就到这里了,以下是关于错误信息报告的全部代码,
----------------------------------华丽分割线-------------------------------------------------------------------------
#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( 1,"You haven't initialised the memory manager!" );
//HK_ERROR( 2,"Null object passed as parameter." );
//HK_WARN_ALWAYS(0x417ffd72, "Hello world!");
//std::printf("%s","Hello World!~");
//hkError::getInstance().setEnabled(3,false);
hkError::s_instance->message(hkError::MESSAGE_WARNING,3,"错误三!~",__FILE__,__LINE__);
}
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>