我所遭遇过的游戏中间件---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的更多相关文章

  1. 我所遭遇过的游戏中间件---SpeedTree

    我所遭遇过的游戏中间件---SpeedTree SpeedTree是一个专门用于渲染植被的中间件,并提供了一套完善的植物编辑工具.在它官方提供的DEMO中,你会看到高度逼真的树木和植物,在风的影响下树 ...

  2. 我所遭遇过的游戏中间件---HumanIK

    我所遭遇过的游戏中间件---HumanIK Autodesk HumanIK游戏中间件,为游戏创建更加可信.真实的角色动画.该中间件的全身逆向运动(FBIK)系统支持角色真实地与所在环境及其它角色进行 ...

  3. 我所遭遇过的游戏中间件--Kynapse

    我所遭遇过的游戏中间件--Kynapse Autodesk Kynapse游戏中间件是一款面向游戏开发.非玩家控制角色实时模拟的领先的人工智能解决方案.Kynapse具有先进的路径查找功能,比如三维路 ...

  4. 我所遭遇过的游戏中间件--Scaleform

    我所遭遇过的游戏中间件---Scaleform Scaleform帮助开发人员利用现代系统的三维硬件加速性能创建电影品质的菜单.游戏内HUD,动画纹理.迷你游戏以及移动游戏与应用.Scaleform作 ...

  5. 我所遭遇过的游戏中间件---Redux

    我所遭遇过的游戏中间件---Redux 一.关于Redux Substance Redux 是一款纹理处理软件加中间件,专门用于纹理生成和压缩.具其用户指南介绍,它能够对纹理集进行优化,可以将现有压缩 ...

  6. 我所遭遇过的游戏中间件--Apex

    我所遭遇过的游戏中间件--Apex Apex是PhysX的扩展中间件,它是在PhysX的基础上封装了一层.用于实现布料,粒子,破碎这三种物理效果.我只研究其布料处理.使用Apex做物理最大的好处是:它 ...

  7. 我所遭遇过的游戏中间件--PhysX

    我所遭遇过的游戏中间件--PhysX PhysX现在是Nvidia的物理中间件.其特点是简练且功能强大.当我最初拿到PHYSX的SDK时,就发现这个物理中间件比Havok要小很多,但该有的功能都有,甚 ...

  8. 我所遭遇过的游戏中间件--Havok

    我所遭遇过的游戏中间件--Havok Havok是我接触的第一款游戏中间件,那是在五,六年前,我刚刚毕业,对游戏开发还是个菜鸟.我记得先是对游戏场景中的地形和其他静态物体生成刚体,然后做角色的Ragd ...

  9. 我所遭遇过的游戏中间件--FlashOcx

    使用Flash做游戏界面的另一种方式是通过Abode提供flash.ocx处理Flash界面.将Flash图像通过GDI绘制出来后,再将图像数据拷贝到一个D3D的纹理结构中,最后由引擎的D3D接口进行 ...

随机推荐

  1. Bootstrap进阶七:LESS语法详解

    1.变量 2.混合 3.带参数混合 4.模式匹配和导引表达式 5.嵌套规则 6.运算 7.Color函数 8.Math函数 9.命名空间 10.作用域 11.注释 12.Importing 13.字符 ...

  2. caffe for python

    导言 本教程中,我们将会利用Caffe官方提供的深度模型——CaffeNet(该模型是基于Krizhevsky等人的模型的)来演示图像识别与分类.我们将分别用CPU和GPU来进行演示,并对比其性能.然 ...

  3. 基于 Laravel 开发博客应用系列 —— 设置 Linux/Mac 本地开发环境

    1.不同 Linux 发行版本的区别 不同的 Linux 发行版本之间有一些细微区别,尤其是包管理器:CentOS 和 Fedora 使用 yum 作为包管理器,而Ubuntu 使用  apt,在 O ...

  4. web到service简单原理例子

    这是目前的理解 附上服务端源码 package com.lsw.server; import java.io.*; import java.net.*; import java.util.HashMa ...

  5. 洛谷P2707 Facer帮父亲 [优先队列,数学]

    题目传送门 Facer帮父亲 题目背景 Facer可是一个孝顺的孩纸呦 题目描述 Facer的父亲是一名经理,现在总是垂头丧气的. Facer问父亲,怎么啦?父亲说,公司出了点问题啊. 公司管理着N个 ...

  6. Mac 上关于TFTP Server 软件的使用

    软件下载地址 http://ww2.unime.it/flr/tftpserver/ 软件下载后进行安装,打开软件, 如果出现如下图所示情况 然后当你点击蓝色的Fix 按钮时,如果又出现如下提示 这时 ...

  7. [ 原创 ]学习笔记- 数据在Activity之间的传递的情况

    情况一:一个Activity跳转到另一个Activity时,将第一个Activity的数据传递到第二个Activity里面. 分析:当一个界面跳转到另一个界面的同时还要讲数据传递过去,这种情况需要用I ...

  8. 分分钟搞定Python之排序与列表

    排序时程序中用得比较多的方法了.在Python中,最简单的排序方法摸过与使用内置的sorted(list)这个函数了,该函数一一个列表作为参数返回一个新的列表,只不过是把旧列表中的元素排过序了.原列表 ...

  9. Django Q对象

    使用Q 对象进行复杂的查询¶ filter() 等方法中的关键字参数查询都是一起进行“AND” 的. 如果你需要执行更复杂的查询(例如OR 语句),你可以使用Q 对象. Q 对象 (django.db ...

  10. thinkphp的_STORAGE_WRITE_ERROR_问题

    今天服务器突然报这个问题(上图所示),在thinkphp的官网上也发现有朋友碰到这个问题,定位到应该是Runtime目录没有写权限,然后试着给Application下的Runtime目录 chmod ...