我所遭遇过的游戏中间件---nvDXTLib
我所遭遇过的游戏中间件---nvDXTLib
nvDXTLib是Nvidia提供的一套用于DXT纹理压缩SDK.接口十分简洁,就是提供了几个纹理压缩的函数,其中我使用最多的函数是:
DXTLIB_API NV_ERROR_CODE nvDXTcompress(
const unsigned char * srcImage,
size_t width,
size_t height,
size_t byte_pitch,
nvPixelOrder pixelOrder,
nvCompressionOptions * options,
DXTWriteCallback fileWriteRoutine, // call to .dds write routine
const RECT * rect = );
其含义是输入一套未压缩的纹理图像数据,在回调函数DXTWriteCallback中会输出压缩后的图像数据.pixelOrder为像素格式,byte_pitch这个东西我始终不太明白它存在的意义,它是图像中每行数据的内存大小,也就等于图像的宽度width乘以每个像素的大小,即byte_pitch == width * sizeof(pixel).除非有byte_pitch != width * sizeof(pixel)的可能,否则没有必要再传个byte_pitch进去,而实际上我下过断点,从没碰到过不相等的情况.
nvDXTLib最大的特点是线程安全,这也是我使用它的理由.否则Direct3D本来就有DXT纹理生成的方法,没必要再搞另一套压缩库.其算法压缩效率不算太高,之前测试过,但具体的性能数值已经不见了,记得大概512*512的图像压缩时间为3秒左右,1024*1024的图像压缩时间为15秒左右,2048*2048的约为1分钟.这个时间是异步处理下的时间,同步处理下的时间没有测.而且我也不记得这是在DEBUG下做的测试还是在RELEASE下做的测试.好在是异步处理,所以压缩时间长点也能接收.在游戏中的逻辑是,混合生成一张纹理,将其提交压缩任务.在压缩完成之前,使用未压缩的纹理进行渲染,当压缩完成后,使用压缩后的纹理渲染,并释放未压缩的纹理.
前几天碰到一个崩溃的问题,头疼了很久,调用nvDXTcompress时崩溃了,这套代码我已经写了很久了,突然莫名其妙的崩了,而且是小概率的难以重现的崩溃.查这种崩溃最头疼,这也是使用中间件的一个弊端,崩溃后无法跟入它的代码中,不知道崩在何处,有种束手无策的感觉.最后通过打LOG的方式发现,崩溃时正在压缩的纹理是2048*2048大小,应该是nvDXTcompress中申请了一块比较大的内存失败了导致的.
我没有找到nvDXTLib的源码,应该是它没有开源.而且这套库已经成为Nvidia历史,Nvidia现在有另一套纹理处理的SDK是nvidia-texture-tools(NVTT),开源的,比nvDXTLib要强大很多.我想以后再有纹理压缩的需求,我会用NVTT.多提一句:nvDXTLib没有获得压缩后数据大小的方法,所以在为输出数据申请内存时,不好确定,我使用的办法是按输入数据大小的一半申请输出数据内存.NVTT提供了一个接口是Compressor::estimateSize(),但estimate是估算的意思,这也不太好确定,希望其返回值永远比实际值大,否则没办法使用它.
nvDXTLib的下载地址:
https://developer.nvidia.com/sites/default/files/akamai/tools/files/DDS_Utilities_8.31.1127.1645.exe
NVTT的下载地址:
http://code.google.com/p/nvidia-texture-tools/
我所遭遇过的游戏中间件---nvDXTLib的更多相关文章
- 我所遭遇过的游戏中间件---SpeedTree
我所遭遇过的游戏中间件---SpeedTree SpeedTree是一个专门用于渲染植被的中间件,并提供了一套完善的植物编辑工具.在它官方提供的DEMO中,你会看到高度逼真的树木和植物,在风的影响下树 ...
- 我所遭遇过的游戏中间件---HumanIK
我所遭遇过的游戏中间件---HumanIK Autodesk HumanIK游戏中间件,为游戏创建更加可信.真实的角色动画.该中间件的全身逆向运动(FBIK)系统支持角色真实地与所在环境及其它角色进行 ...
- 我所遭遇过的游戏中间件--Kynapse
我所遭遇过的游戏中间件--Kynapse Autodesk Kynapse游戏中间件是一款面向游戏开发.非玩家控制角色实时模拟的领先的人工智能解决方案.Kynapse具有先进的路径查找功能,比如三维路 ...
- 我所遭遇过的游戏中间件--Scaleform
我所遭遇过的游戏中间件---Scaleform Scaleform帮助开发人员利用现代系统的三维硬件加速性能创建电影品质的菜单.游戏内HUD,动画纹理.迷你游戏以及移动游戏与应用.Scaleform作 ...
- 我所遭遇过的游戏中间件---Redux
我所遭遇过的游戏中间件---Redux 一.关于Redux Substance Redux 是一款纹理处理软件加中间件,专门用于纹理生成和压缩.具其用户指南介绍,它能够对纹理集进行优化,可以将现有压缩 ...
- 我所遭遇过的游戏中间件--Apex
我所遭遇过的游戏中间件--Apex Apex是PhysX的扩展中间件,它是在PhysX的基础上封装了一层.用于实现布料,粒子,破碎这三种物理效果.我只研究其布料处理.使用Apex做物理最大的好处是:它 ...
- 我所遭遇过的游戏中间件--PhysX
我所遭遇过的游戏中间件--PhysX PhysX现在是Nvidia的物理中间件.其特点是简练且功能强大.当我最初拿到PHYSX的SDK时,就发现这个物理中间件比Havok要小很多,但该有的功能都有,甚 ...
- 我所遭遇过的游戏中间件--Havok
我所遭遇过的游戏中间件--Havok Havok是我接触的第一款游戏中间件,那是在五,六年前,我刚刚毕业,对游戏开发还是个菜鸟.我记得先是对游戏场景中的地形和其他静态物体生成刚体,然后做角色的Ragd ...
- 我所遭遇过的游戏中间件--FlashOcx
使用Flash做游戏界面的另一种方式是通过Abode提供flash.ocx处理Flash界面.将Flash图像通过GDI绘制出来后,再将图像数据拷贝到一个D3D的纹理结构中,最后由引擎的D3D接口进行 ...
随机推荐
- JSP的学习二(指令与标签)
一:page指令 1.JSP的指令 放在<%@ 指令 属性=“值”%> 主要有page,include,tablib. 2.page指令 用于定义JSP页面的各种属性,作用于是JSP的整个 ...
- win7下docker环境搭建nginx+php-fpm+easyswoole开发环境
基础的环境已在文章nginx.php-fpm.swoole HTTP/TCP压测对比中搭建了,现在是在这个基础上在搭建easyswoole开发环境 主要要修改的地方是dnmp包里面的docker-co ...
- hdoj1102 Constructing Roads(Prime || Kruskal)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1102 题意 有n个村庄(编号1~n),给出n个村庄之间的距离,开始时n个村庄之间已经有了q条路,现在需 ...
- php实现微信分享朋友圈
class JSSDK { private $appId; private $appSecret; public function __construct($appId, $appSecret) ...
- JAVA 9 新特性
Oracle已将JAVA 9的开发提上日程.OpenJDK上已经出现了关于下一个主版本JAVA 9的改进建议(JEP).与以往不同,Oracle在这次谈及了一些真正的特性.而早期对于JDK9的声明仅 ...
- with上下文管理器
术语 要使用 with 语句,首先要明白上下文管理器这一概念.有了上下文管理器,with 语句才能工作. 下面是一组与上下文管理器和with 语句有关的概念. 上下文管理协议(Context Mana ...
- python pip 不能用报错: ImportError: No module named _internal
使用python pip安装包的时候报错: Traceback (most recent call last): File "/usr/local/bin/pip", line 7 ...
- 单链表之一元多项式求和C++实现
单链表之一元多项式求和 一元多项式求和单链表实现伪代码 1.工作指针 pre.p.qre.q 初始化2.while(p 存在且 q 存在)执行下列三种情况之一: 2.1.若 p->exp < ...
- spring---aop(3)---Spring AOP的拦截器链
写在前面 时间断断续续,这次写一点关于spring aop拦截器链的记载.至于如何获取spring的拦截器,前一篇博客已经写的很清楚(spring---aop(2)---Spring AOP的JDK动 ...
- C++反汇编-虚函数
学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 在C++中,使用关键字virtual声明为虚函数. 虚函数地址表(虚表) 定义:当类中定义有虚函数时,编译器会把 ...