nvtrisrip是NVIDIA提供的一个开源优化库,这个库可以将三角形顶点索引数组转换为三角形带索引数组。可以极大的提高渲染速度。

NVIDIA这个库的官方地址是:
http://www.nvidia.com/object/nvtristrip_library.html

不过这里代码不全也不够新,推荐从GitHub上下载:
https://github.com/turbulenz/NvTriStrip

下载完毕后,我们把下面文件夹中的源代码加入到项目中:
/NvTriStrip/include
/NvTriStrip/src

一共为6个文件

需要注意的是VertexCache类有个非常奇怪的设计,在.h和.cpp中同时有两套实现代码。这会导致重定义,我们可以把.h中的代码注释起来。另外还需要修改entries变量为unsign short类型。

#ifndef VERTEX_CACHE_H#define VERTEX_CACHE_H#include <string.h>class VertexCache
{public:VertexCache(int size);
//  {
//      numEntries = size;
//
//      entries = new int[numEntries];
//
//      for(int i = 0; i < numEntries; i++)
//          entries[i] = -1;
//  }VertexCache();// { VertexCache(16); }~VertexCache();// { delete[] entries; entries = 0; }bool InCache(int entry);
//  {
//      bool returnVal = false;
//      for(int i = 0; i < numEntries; i++)
//      {
//          if(entries[i] == entry)
//          {
//              returnVal = true;
//              break;
//          }
//      }
//
//      return returnVal;
//  }int AddEntry(int entry);
//  {
//      int removed;
//
//      removed = entries[numEntries - 1];
//
//      //push everything right one
//      for(int i = numEntries - 2; i >= 0; i--)
//      {
//          entries[i + 1] = entries[i];
//      }
//
//      entries[0] = entry;
//
//      return removed;
//  }void Clear();
//  {
//      memset(entries, -1, sizeof(int) * numEntries);
//  }void Copy(VertexCache* inVcache) ;
//  {
//      for(int i = 0; i < numEntries; i++)
//      {
//          inVcache->Set(i, entries[i]);
//      }
//  }int At(int index);// { return entries[index]; }void Set(int index, int value);// { entries[index] = value; }private://  int *entries;//此处修改为unsigned shortunsigned short *entries;int numEntries;};#endif

我们看一下在SIO2中的使用,其他引擎中的用法,大同小异

void ObjMod::optimize_mesh(unsigned int mesh_index, unsigned int vertex_cache_size) {ObjMesh *objmesh = &this->objmesh[ mesh_index ];unsigned int i = 0,s = 0;unsigned short n_group = 0;//设置顶点缓存大小,顶点缓存越大,优化时间越长,优化效果越好,但是成边界递减关系if( vertex_cache_size )SetCacheSize( vertex_cache_size );while( i != objmesh->n_objtrianglelist ){PrimitiveGroup *primitivegroup;//通过三角形索引创建//四个参数依次:被优化的三角形索引数组,三角形索引元素数量,优化后的三角形带数组,优化后的三角形带元素个数if( GenerateStrips( objmesh->objtrianglelist[ i ].indice_array,objmesh->objtrianglelist[ i ].n_indice_array,&primitivegroup,&n_group,true ) ){if( primitivegroup[ 0 ].numIndices < objmesh->objtrianglelist[ i ].n_indice_array ){objmesh->objtrianglelist[ i ].mode = GL_TRIANGLE_STRIP;//渲染模式修改为三角形带objmesh->objtrianglelist[ i ].n_indice_array = primitivegroup[ 0 ].numIndices;//重置数据数量//重新申请内存//s = primitivegroup[ 0 ].numIndices * sizeof( unsigned short );//这块使用realloc有点浪费空间,因为优化后的三角形带占用内存比原先的三角形索引要小objmesh->objtrianglelist[ i ].indice_array = ( unsigned short * ) realloc( objmesh->objtrianglelist[ i ].indice_array,s );//复制数据memcpy( &objmesh->objtrianglelist[ i ].indice_array[ 0 ],&primitivegroup[ 0 ].indices[ 0 ],s );}//删除优化后的临时数据delete[] primitivegroup;}++i;}
}

我们这里调用库的函数有两个:
SetCacheSize为设置优化库使用的缓存大小并非越大越好。而是根据模型精细度来考量的。
GenerateStrips就是核心的三角形优化算法了。

然后保存输出的数据删掉临时数据即可。

下面是一个测试报告,画面数为4726个三角形的静态模型。重复绘制模型200次,在iPad mini2上面的结果是:

未开三角形带优化时的FPS:

开启三角形带优化之后的FPS:

FPS提高了70%,效果还是非常明显的。

在这里为了方便,我们使用的是在线优化方式(模型数据加载进内存后再优化)。而实际开发中,往往多使用离线优化,预先处理好模型数据,然后直接调用渲染就可以了,这样没有缓存和时间限制,效果更好。

这个库是平台无关,也没有第三方依赖,可以很方便的集成到自己的工具中去。

三角形带优化库nvtrisrip的使用相关推荐

  1. 常见的10大超参数优化库

    Skopt https://scikit-optimize.github.io/ 是一个超参数优化库,包括随机搜索.贝叶斯搜索.决策森林和梯度提升树.这个库包含一些理论成熟且可靠的优化方法,但是这些模 ...

  2. 超参数调优河伯、组合优化器CompBO,华为诺亚开源贝叶斯优化库

    视学算法报道 编辑:陈萍.杜伟 华为诺亚开源了一个贝叶斯优化的库,该库包含三个部分:河伯.T-LBO.CompBO. 贝叶斯优化可以说是一种黑盒优化算法,该算法用于求解表达式未知函数的极值问题.因其具 ...

  3. Android 自带图标库 android.R.drawable

    在xml文件中调用. android:title="@string/secure_connect" android:orderInCategory="100" ...

  4. 树莓派:交叉编译,以及带wiringPi库的如何交叉编译

    1.交叉编译是什么?为什么要交叉编译? 交叉编译  是在一个平台上生成另一个平台上的可执行代码             编译:在一个平台上生成该平台上的可执行代码     ============== ...

  5. 华为诺亚开源贝叶斯优化库:超参数调优河伯、组合优化器CompBO

    ©作者 | 陈萍.杜伟 来源 | 机器之心 华为诺亚开源了一个贝叶斯优化的库,该库包含三个部分:河伯.T-LBO.CompBO. 贝叶斯优化可以说是一种黑盒优化算法,该算法用于求解表达式未知函数的极值 ...

  6. buildroot自带程序(库)编译并安装

    前几天情绪有点低落,经过周末的调整重新恢复状态,谢谢有爱的朋友们留言和点赞,有你们的陪伴我会更加努力,让我们一起开心写程序..... buildroot简介: 引用官方的简述: Buildroot是一 ...

  7. 10倍!微软开源深度学习优化库DeepSpeed,可训练1000亿参数模型

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟  报道  | 公众号 CVLianMeng 转载于 :微软 AI博士笔记系列推荐 ...

  8. 微软开源深度学习优化库 DeepSpeed,可训练 1000 亿参数的模型

    人工智能的最新趋势是,更大的自然语言模型可以提供更好的准确性,但是由于成本.时间和代码集成的障碍,较大的模型难以训练.微软日前开源了一个深度学习优化库 DeepSpeed,通过提高规模.速度.可用性并 ...

  9. oracle设置缓冲区大小设置,描述Oracle优化库高速缓冲区

    Oracle经过长时间的发展,很多用户都很了解Oracle优化库高速缓冲区了,这里我发表一下个人理解,和大家讨论讨论.日志缓冲区也称为重做日志缓冲区,它包含所有变化了的数据块.这些变化的数据块通过Or ...

最新文章

  1. Hadoop的存储架构介绍
  2. 【错误记录】Android 分区存储 错误 ( 文件格式不匹配 )
  3. jquery 选项卡插件
  4. pfSense修改PPPoE拨号总数
  5. C与C++的内存机制的比较
  6. php中使用hash_hmac函数实现HMAC-SHA1签名算法的来龙去脉
  7. 用cookie实现叶卡的记忆功能
  8. ASP.NET的分页方法(一)
  9. RFM模型的理解和python案例分析
  10. 长肥管道(LFT)中TCP的艰难处境与打法
  11. openssl证书相关
  12. AlwaysOn业务IP和高可用IP分开使用(四)
  13. 快速掌握用python写并行程序设计_Python中的并行编程速度
  14. html compiler注册机,XXX计算器1.8注册分析和注册机代码
  15. 证券交易1-交易系统简介
  16. 高数符号大全及其读法
  17. MATLAB--基本绘图函数
  18. android libpng16,Android NDK 开发之 CMake 编译 libpng
  19. numpy.loadtxt() 详细用法
  20. statusbar 纯白色的解决方案 android:fitsSystemWindows

热门文章

  1. JAVA中通过时间格式来生成唯一的文件名
  2. Java中abstract与interface
  3. python处理网络文字流,设置为utf8编码
  4. 【Vegas原创】ASP 0131 不允许父路径的解决
  5. WiFi网络编程(带OTA功能)
  6. 网页搜索怎么显示排名_深圳seo搜索排名优化效果怎么样
  7. mysql报错5_mysql5.5 启动报错:ERROR!_MySQL
  8. Spring事物的实现方式和原理以及隔离级别
  9. java.lang.NoClassDefFoundError:org/apache/commons/io/Charsets (jsoup配合htmlunit 爬取异步加载的网页遇到的)
  10. Qt QObject::connect: Parentheses expected错误原因