Havok物理引擎 关于错误报告的信息(Error Reporting)

来源:互联网 发布:刷钻软件免费版 编辑:程序博客网 时间:2024/05/21 18:35

作者: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>