void optimize_index_buffer(
  const Eigen::MatrixXi& F, 
  const bool silent,
  Eigen::MatrixXi& OF)
{
  const int numTris = F.rows();
  std::vector<int> triBuf;
  for (int t=0; t<numTris; t++) 
  {
    triBuf.push_back(F(t,0));
    triBuf.push_back(F(t,1));
    triBuf.push_back(F(t,2));
  }
  VertexCache vertex_cache;
  int misses = vertex_cache.GetCacheMissCount(&triBuf[0], numTris);

  if (!silent)
  {
    printf("*** Before optimization ***\n");
    printf("Cache misses\t: %d\n", misses);
    printf("ACMR\t\t: %f\n", (float)misses / (float)numTris);
  }

  VertexCacheOptimizer vco;
  if(!silent)
  {
    printf("Optimizing ... \n");  
  }
  // vco.draw_list is the new order
  VertexCacheOptimizer::Result res = vco.Optimize(&triBuf[0], numTris);  
  if (res)
  {
    printf("Error in vertex cache optimization...\n");    
  }

  misses = vertex_cache.GetCacheMissCount(&triBuf[0], numTris);

  if (!silent)
  {
    printf("*** After optimization ***\n");
    printf("Cache misses\t: %d\n", misses);
    printf("ACMR\t\t: %f\n", (float)misses / (float)numTris);
  }

  for (int t=0; t<numTris; t++) 
  {
    OF(t,0) = triBuf[3*t];
    OF(t,1) = triBuf[3*t + 1];
    OF(t,2) = triBuf[3*t + 2];
  }
}
Exemple #2
0
int main(int argc, char **argv)
{
	// generate the plane
	std::vector<int> pl = GeneratePlane(PLANE_SIZE);
	int tri_count = 2 * (PLANE_SIZE-1) * (PLANE_SIZE-1);

	printf("Mesh triangle count: %d\n", tri_count);

	VertexCache vertex_cache;
	int misses = vertex_cache.GetCacheMissCount(&pl[0], tri_count);

	printf("*** Before optimization ***\n");
	printf("Cache misses\t: %d\n", misses);
	printf("ACMR\t\t: %f\n", (float)misses / (float)tri_count);

	VertexCacheOptimizer vco;
	printf("Optimizing ... \n");
	unsigned int time = GetMSec();
	VertexCacheOptimizer::Result res = vco.Optimize(&pl[0], tri_count);
	time = GetMSec() - time;
	if (res)
	{
		printf("Error\n");
		return 0;
	}

	printf("Optimized in %f seconds (%d ns/triangle)\n",
		time / 1000.0f, (time * 1000) / tri_count);

	misses = vertex_cache.GetCacheMissCount(&pl[0], tri_count);

	printf("*** After optimization ***\n");
	printf("Cache misses\t: %d\n", misses);
	printf("ACMR\t\t: %f\n", (float)misses / (float)tri_count);

	return 0;
}
Exemple #3
0
void NzOptimizeIndices(NzIndexIterator indices, unsigned int indexCount)
{
	VertexCacheOptimizer optimizer;
	if (optimizer.Optimize(indices, indexCount) != VertexCacheOptimizer::Success)
		NazaraWarning("Indices optimizer failed");
}
	int optimizeVertexIndices(int* indices, int triCount)
	{
		VertexCacheOptimizer vco;
		return (int) vco.Optimize(indices, triCount);	
	}