Hello! as always I am struggling with performance with VR... so I just found something that increased my fps significantly... at least in one of my apps in particular.
So! I wanted to share it so you can test if it also works for you.
disclaimer: I haven't tested it too much myself (its too late now here) so maybe has some consequences. And maybe that's the way its suppose to be done and I just found out xD.
to the point!
before I was doing this:
Code: Select all
bool yOpenVR::frameStarted(const Ogre::FrameEvent& evt){
vr::VRCompositor()->WaitGetPoses( mTrackedDevicePose, vr::k_unMaxTrackedDeviceCount, NULL, 0);
for (int i = 0; i < vr::k_unMaxTrackedDeviceCount; ++i){
if (mTrackedDevicePose[i].bPoseIsValid){
Ogre::Matrix4 mat4DevicePose = convertSteamVRMatrixToOgreMatrix4(mTrackedDevicePose[i].mDeviceToAbsoluteTracking);
if( mHMD->GetTrackedDeviceClass(i) == vr::TrackedDeviceClass_HMD ){
mCurrentOrientation = mat4DevicePose.extractQuaternion();
mCurrentPosition = mat4DevicePose.getTrans();
mCameraNode->setPosition( mCurrentPosition );
mCameraNode->setOrientation( mCurrentOrientation );
}
if( mHMD->GetTrackedDeviceClass(i) == vr::TrackedDeviceClass_Controller ){
//controllers stuffs
}
}
}
return true;
}
bool yOpenVR::frameRenderingQueued(const Ogre::FrameEvent& evt){
return true;
}
bool yOpenVR::frameEnded(const Ogre::FrameEvent& evt){
vr::VRCompositor()->Submit(vr::Eye_Left, &mEyeTexture, &mTextureBounds[0]);
vr::VRCompositor()->Submit(vr::Eye_Right, &mEyeTexture, &mTextureBounds[1]);
return true;
}
Code: Select all
at init:
float fDisplayFrequency = mHMD->GetFloatTrackedDeviceProperty( vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_DisplayFrequency_Float );
mFrameDuration = 1.f / fDisplayFrequency;
--------------------------
bool yOpenVR::frameStarted(const Ogre::FrameEvent& evt){
float fSecondsSinceLastVsync;
mHMD->GetTimeSinceLastVsync( &fSecondsSinceLastVsync, NULL );
float fVsyncToPhotons = mHMD->GetFloatTrackedDeviceProperty( vr::k_unTrackedDeviceIndex_Hmd, vr::Prop_SecondsFromVsyncToPhotons_Float );
float fPredictedSecondsFromNow = mFrameDuration - fSecondsSinceLastVsync + fVsyncToPhotons;
mHMD->GetDeviceToAbsoluteTrackingPose( vr::TrackingUniverseSeated, fPredictedSecondsFromNow, mTrackedDevicePose, vr::k_unMaxTrackedDeviceCount );
for (int i = 0; i < vr::k_unMaxTrackedDeviceCount; ++i){
if (mTrackedDevicePose[i].bPoseIsValid){
Ogre::Matrix4 mat4DevicePose = convertSteamVRMatrixToOgreMatrix4(mTrackedDevicePose[i].mDeviceToAbsoluteTracking);
if( mHMD->GetTrackedDeviceClass(i) == vr::TrackedDeviceClass_HMD ){
mCurrentOrientation = mat4DevicePose.extractQuaternion();
mCurrentPosition = mat4DevicePose.getTrans();
mCameraNode->setPosition( mCurrentPosition );
mCameraNode->setOrientation( mCurrentOrientation );
}
if( mHMD->GetTrackedDeviceClass(i) == vr::TrackedDeviceClass_Controller ){
//controllers stuffs
}
}
}
return true;
}
bool yOpenVR::frameRenderingQueued(const Ogre::FrameEvent& evt){
vr::VRCompositor()->WaitGetPoses( 0, vr::k_unMaxTrackedDeviceCount, NULL, 0);
return true;
}
bool yOpenVR::frameEnded(const Ogre::FrameEvent& evt){
vr::VRCompositor()->Submit(vr::Eye_Left, &mEyeTexture, &mTextureBounds[0]);
vr::VRCompositor()->Submit(vr::Eye_Right, &mEyeTexture, &mTextureBounds[1]);
return true;
}
Please some of you dealing with VR test this and report, or let me know if you do something different/better
Saludos!!