PhysX SDK 3.2 测试程序一例

        最近PhysX SDK 3.2 发布了,出于好奇,下载来看了看,发现还是很不错的。相比2.x,变化很大,功能也更加强大。3.1版本中有点让人混乱的库名称也得到了规范,同时还加了两个新的范例。一个是角色布料模拟,一个是自定义重力(这个和Havok中的那个例子基本上是一样的)。

        从3.x开始,SDK的范例都用一个Sample框架包装了,研究起来不是太方便,花了点时间写了个测试程序。(CSDN不会排版代码,丑了点,将就看吧)


#include <PxPhysicsAPI.h>
#include <extensions\PxDefaultSimulationFilterShader.h>
#include <extensions\PxExtensionsAPI.h>
#include <extensions\PxDefaultAllocator.h>
#include <extensions\PxDefaultErrorCallback.h>
#include <foundation/PxFoundation.h>
#include <pxtask/PxCudaContextManager.h>
#include <physxprofilesdk\PxProfileZoneManager.h>

#include <PxScene.h>

//3.x开始用命名空间了
using namespace physx;


bool recordMemoryAllocations = true;

//出错的回调函数,Havok也一样,大同小异
static PxDefaultErrorCallback gDefaultErrorCallback;

static PxDefaultAllocator gDefaultAllocatorCallback;
static PxSimulationFilterShader gDefaultFilterShader = PxDefaultSimulationFilterShader;


int main(int argc, char** argv)
{
PxFoundation* mFoundation = PxCreateFoundation(PX_PHYSICS_VERSION, gDefaultAllocatorCallback, gDefaultErrorCallback);
if(!mFoundation){
printf("PxCreateFoundation failed!");
return -1;
}

bool recordMemoryAllocations = true;


//PxProfileZoneManager用来做性能分析用的
PxProfileZoneManager* mProfileZoneManager = &PxProfileZoneManager::createProfileZoneManager(mFoundation);
if(!mProfileZoneManager){
printf("PxProfileZoneManager::createProfileZoneManager failed!\n");
return -1;
}

//检测并初始化CUDA模块,如果你有支持CUDA的显卡,这里就可以用到了。(建议装上最新的显卡驱动,再来测试本程序)。
pxtask::CudaContextManagerDesc cudaContextManagerDesc;
pxtask::CudaContextManager* mCudaContextManager = pxtask::createCudaContextManager(*mFoundation, cudaContextManagerDesc, mProfileZoneManager);
if(mCudaContextManager){
if(!mCudaContextManager->contextIsValid()){
mCudaContextManager->release();
mCudaContextManager = NULL;
}
}

if(mCudaContextManager){
printf("Device Name: %s\n", mCudaContextManager->getDeviceName());
printf("Driver Version: %d\n", mCudaContextManager->getDriverVersion());
printf("Total Bytes: %d\n", mCudaContextManager->getDeviceTotalMemBytes());
printf("core count: %d\n", mCudaContextManager->getMultiprocessorCount());
}

//PxTolerancesScale()是用来做Scale的,不过SDK说还没做出来,只是占个坑
PxPhysics* mPhysics = PxCreatePhysics(PX_PHYSICS_VERSION, *mFoundation,
PxTolerancesScale(), recordMemoryAllocations, mProfileZoneManager);


if(!mPhysics){
printf("PxCreatePhysics failed!\n");
return -1;
}


if(!PxInitExtensions(*mPhysics)){
printf("PxInitExtensions failed!\n");
return -1;
}


physx::PxCooking* mCooking = PxCreateCooking(PX_PHYSICS_VERSION, *mFoundation, PxCookingParams());
if(!mCooking){
printf("PxCreateCooking failed!\n");
return -1;
}


PxScene* mScene;
PxSceneDesc sceneDesc(mPhysics->getTolerancesScale());
sceneDesc.gravity = PxVec3(0.0f, -9.81f, 0.0f);


//创建CPU分发器(字面翻译,我的译法),PxDefaultCpuDispatcherCreate的参数是线程数
pxtask::CpuDispatcher* mCpuDispatcher;

if(!sceneDesc.cpuDispatcher){
mCpuDispatcher = PxDefaultCpuDispatcherCreate(4);
if(!mCpuDispatcher){
printf("PxDefaultCpuDispatcherCreate failed!\n");
return -1;
}
sceneDesc.cpuDispatcher = mCpuDispatcher;
}


if(!sceneDesc.filterShader){
sceneDesc.filterShader = gDefaultFilterShader;
}

//尝试使用GPU分发器
if(!sceneDesc.gpuDispatcher && mCudaContextManager){
sceneDesc.gpuDispatcher = mCudaContextManager->getGpuDispatcher();
}

//创建物理场景,上面搞那么多,其实就为了这一行
mScene = mPhysics->createScene(sceneDesc);
if(!mScene){
printf("createscene failed!\n");
return -1;
}else{
printf("createscene successful!\n");
}

//按顺序一个一个release,否则会提示警告
mPhysics->release();
mCooking->release();
mCudaContextManager->release();
PxCloseExtensions();
mFoundation->release();

return 0;
}

        以上就是全部的测试代码了。个人觉得3.2版本的PhysX已经非常成熟了,更加的专业,和他的Havok相比,不分伯仲。如果配合显卡加上CUDA强悍的硬件加速能力,可以说是更胜一筹。顺便说一下,Nvidia还提供了Linux和Android版本的SDK,跨平台做的很好。不像Havok免费版本只能使用两个组件,还必须限定死在Windows平台上。

你可能感兴趣的:(android,linux,windows,测试,CUDA,跨平台)