场景编辑器 (二)
在场景中漫游时,总是发现在一些特定的地方,会突然卡一下,后来感觉应该是处于八叉树场景管理器对场景进行风格的分界线上,这时场景管理器需要对场景的数据进行一些处理从而导致的,一直不知道该如何解决,另外工作比较忙,这个学习的过程只能先放下了;
今天尝试了一些使用 RenderSystem_Direct3D10 , 结果创建 Direct3D10 设备直接失败了,难道是 DirectX SDK 的版本太旧?从微软网站上下载了最新的 DirectX SDK ( NOV2008 ),真叫那个大啊,安装完有 1G 多,运行了里面 DirectX 10 的例子程序,才发现我的显卡根本不支持,只能软件模拟,得,还是使用 RenderSystem_Direct3D9 吧,不过无意中看到一个 TEXCONV 程序,到网上查阅一番,发现了该程序可以将材质贴图转换为 DDS 文件格式,该格式是一个压缩的材质纹理格式,可以在一个文件里存储多个不同等级的材质问题贴图,GPU 能够根据物体在场景中离摄像机的距离自动挑选合适大小的贴图,这样可以加速 GPU 的渲染速度,更加重要的是该格式的贴图是显卡唯一能够识别的压缩格式的材质纹理贴图,就是说当你使用 JPG、PNG、TGA等格式的材质纹理贴图时,在显卡中缓存的实际是 BMP 格式的材质纹理贴图,这样就非常的消耗显存,而使用 DDS 格式的材质纹理贴图,那么在显存中直接就是存放的 DDS 格式的材质纹理贴图数据,可以减少显存的使用,同时在渲染场景时由 GPU 实时进行解压缩里面合适大小的材质纹理贴图数据使用,因为节约了显存避免了显存和系统内存交换材质纹理贴图的操作,并且同时提供了不同大小材质纹理贴图,当物体较小时,GPU 可以避免大量的插值运算(将材质纹理贴图进行缩小)所以渲染速度将会大大提升;
心中暗喜,立刻将所有的贴图文件转换为 DDS 格式,并把所有的材质中的贴图文件扩展名修改为 DDS ,然后启动程序,发现在场景中漫游再也没有卡的现象了,并且渲染速度也大幅度提升,最好帧速率从原来的120帧提高到180帧,平均帧速率也从20提高到40,看来材质压缩确实是很有必要的
意外之喜是加载场景的速度明显提升,加载时间大约是之前的三分之一,然后通过 GOOGLE 找到了答案,OGRE 在加载材质纹理贴图时,如果是硬件支持的格式就直接交付给硬件使用,否则先进行解码,然后交付给硬件使用,由于现在的 GPU 一般仅识别 DDS 和 BMP , 所以JPG、PNG、TGA等非 BMP、DDS 格式的材质纹理贴图需要解码为 BMP ,这个过程不但消耗 CPU 而且需要更多的内存操作,同时对显存也会造成压力,所以进行 DDS 压缩后,由于显卡直接支持 DDS ,加载速度也极大的提升了;
最后通过 OGRE 的日志文件发现 MESH 文件的格式比较旧,就编译 OgreMeshUpgrade 程序,然后将所有的 MESH 文件进行了升级,日志中也没有大堆的抱怨了;
现在在场景中漫游非常顺畅了!
源代码我已经打包放在空间里了,点击这里下载
请注意,编译该程序,需要首先编译 OGRE ,另外因为场景资源较大,很抱歉无法提供下载;
最后附上 Ogre_Includes.h
Ogre_Includes.h
//==================================================================================================
// Summary:
// OGRE ( Object-oriented Graphics Rendering Engine ) Headers and Automic import library
//
// Comment:
// <1> This header will be used for OGRE precomplier
// ---------------------------------------------------------------------------------------------
// Author: Arctos Date: 2011-04-29 Version: 1.7.2
//==================================================================================================
#ifndef __THIRDPARTY_OBJECT_ORIENTED_GRAPHICS_RENDERING_ENGINE_HEADERS__
#define __THIRDPARTY_OBJECT_ORIENTED_GRAPHICS_RENDERING_ENGINE_HEADERS__
//==================================================================================================
// OGRE ( Object-oriented Graphics Rendering Engine ) Headers
#include "Ogre/OgrePrerequisites.h"
#include "Ogre/OgreAnimation.h"
#include "Ogre/OgreAnimationState.h"
#include "Ogre/OgreAnimationTrack.h"
#include "Ogre/OgreAny.h"
#include "Ogre/OgreArchive.h"
#include "Ogre/OgreArchiveManager.h"
#include "Ogre/OgreAxisAlignedBox.h"
#include "Ogre/OgreBillboardChain.h"
#include "Ogre/OgreBillboardSet.h"
#include "Ogre/OgreBone.h"
#include "Ogre/OgreCamera.h"
#include "Ogre/OgreConfigFile.h"
#include "Ogre/OgreControllerManager.h"
#include "Ogre/OgreDataStream.h"
#include "Ogre/OgreEntity.h"
#include "Ogre/OgreException.h"
#include "Ogre/OgreFrustum.h"
#include "Ogre/OgreGpuProgram.h"
#include "Ogre/OgreGpuProgramManager.h"
#include "Ogre/OgreHardwareBufferManager.h"
#include "Ogre/OgreHardwareIndexBuffer.h"
#include "Ogre/OgreHardwarePixelBuffer.h"
#include "Ogre/OgreHardwareOcclusionQuery.h"
#include "Ogre/OgreHardwareVertexBuffer.h"
#include "Ogre/OgreHardwarePixelBuffer.h"
#include "Ogre/OgreHighLevelGpuProgram.h"
#include "Ogre/OgreHighLevelGpuProgramManager.h"
#include "Ogre/OgreKeyFrame.h"
#include "Ogre/OgreLight.h"
#include "Ogre/OgreLogManager.h"
#include "Ogre/OgreManualObject.h"
#include "Ogre/OgreMaterial.h"
#include "Ogre/OgreMaterialManager.h"
#include "Ogre/OgreMaterialSerializer.h"
#include "Ogre/OgreMath.h"
#include "Ogre/OgreMatrix3.h"
#include "Ogre/OgreMatrix4.h"
#include "Ogre/OgreMesh.h"
#include "Ogre/OgreMeshManager.h"
#include "Ogre/OgreMeshSerializer.h"
#include "Ogre/OgreOverlay.h"
#include "Ogre/OgreOverlayContainer.h"
#include "Ogre/OgreOverlayElement.h"
#include "Ogre/OgreOverlayManager.h"
#include "Ogre/OgreParticleAffector.h"
#include "Ogre/OgreParticleEmitter.h"
#include "Ogre/OgreParticleSystemManager.h"
#include "Ogre/OgrePass.h"
#include "Ogre/OgrePatchMesh.h"
#include "Ogre/OgrePatchSurface.h"
#include "Ogre/OgreProfiler.h"
#include "Ogre/OgreRadixSort.h"
#include "Ogre/OgreRenderQueueInvocation.h"
#include "Ogre/OgreRenderQueueListener.h"
#include "Ogre/OgreRenderSystem.h"
#include "Ogre/OgreRenderTargetListener.h"
#include "Ogre/OgreRenderTexture.h"
#include "Ogre/OgreRenderWindow.h"
#include "Ogre/OgreResourceBackgroundQueue.h"
#include "Ogre/OgreResourceGroupManager.h"
#include "Ogre/OgreRibbonTrail.h"
#include "Ogre/OgreRoot.h"
#include "Ogre/OgreSceneManager.h"
#include "Ogre/OgreSceneManagerEnumerator.h"
#include "Ogre/OgreSceneNode.h"
#include "Ogre/OgreSimpleRenderable.h"
#include "Ogre/OgreSkeleton.h"
#include "Ogre/OgreSkeletonInstance.h"
#include "Ogre/OgreSkeletonManager.h"
#include "Ogre/OgreSkeletonSerializer.h"
#include "Ogre/OgreStaticGeometry.h"
#include "Ogre/OgreString.h"
#include "Ogre/OgreStringConverter.h"
#include "Ogre/OgreStringVector.h"
#include "Ogre/OgreSubEntity.h"
#include "Ogre/OgreSubMesh.h"
#include "Ogre/OgreTechnique.h"
#include "Ogre/OgreTextureManager.h"
#include "Ogre/OgreTextureUnitState.h"
//#include "Ogre/OgreUserDefinedObject.h"
#include "Ogre/OgreVector2.h"
#include "Ogre/OgreViewport.h"
#include "Ogre/OgreCompositor.h"
#include "Ogre/OgreCompositorManager.h"
#include "Ogre/OgreCompositorChain.h"
#include "Ogre/OgreCompositorInstance.h"
#include "Ogre/OgreCompositionTechnique.h"
#include "Ogre/OgreCompositionPass.h"
#include "Ogre/OgreCompositionTargetPass.h"
#include "Ogre/OgreWindowEventUtilities.h"
#include "Ogre/OgreShadowCameraSetup.h"
#include "Ogre/OgreShadowCameraSetupFocused.h"
#include "Ogre/OgreShadowCameraSetupLiSPSM.h"
#include "Ogre/OgreShadowCameraSetupPlaneOptimal.h"
#include "Ogre/OgreShadowCameraSetupPSSM.h"
//==================================================================================================
#endif /* __THIRDPARTY_OBJECT_ORIENTED_GRAPHICS_RENDERING_ENGINE_HEADERS__ */


浙公网安备 33010602011771号