由于我不想重新发明轮子,我正在寻找一个好的数据结构,可以帮助我为3D渲染引擎提供一个非常基本的3D编辑器,我基本上在寻找一种能够存储的数据结构.必要的数据,在我的情况下仅限于:
现在这是我第一个使用3D渲染的方法,但是我有一个很好的基础,关于光栅化器如何工作,GPU如何处理三角形,点和线以产生图像,我的问题是现在我没有得到这个新的"基于体素"的数据结构是即使这个OpenVDB对我来说是正确的结构.
我认为这个引擎的大多数"输入"都来自obj类文件,所以基本上是三角形和点,但我仍然不想错过最新和最好的,所以我想,OpenVDB和OpenVDB之间有什么真正的区别.一个包含三角网格的通用数据结构?OpenVDB有哪些可能的实际应用?
#include <tbb/concurrent_vector.h>
#include <tbb/parallel_for.h>
#include <random>
#define N 1000000
int main()
{
tbb::concurrent_vector<u_int32_t> v(N);
std::mt19937 mt;
std::uniform_int_distribution<u_int32_t> dist(0,499);
tbb::parallel_for( tbb::blocked_range<tbb::concurrent_vector<u_int32_t>>(v.begin(),v.end()),[&]{return dist(mt);});
return(0);
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么这不起作用,据我了解,此接口parallel_for应包括容器的起点、终点以及应在循环的每次迭代中执行的步骤的大小,最后一次参数是将要执行的函数。
现在tbb::blocked_range它用于分割容器(对吗?),所以在这种情况下它应该很有用,我无法让它工作,而且我不明白为什么这不能以更简单的方式与迭代器一起工作。 ..
我对两个用来自梅森扭曲器的伪随机整数填充给定向量的程序进行了一些比较,重点是 TBB 版本非常慢,当 TBB 需要时,std 版本在大约 0.6 秒内执行任务至少1.1秒。
我还注意到 TBB 并没有真正提供优化的算法来处理容器,但它只提供通用构造(parallel_for、parallel_for_each 和类似的)来处理通用任务,其中 std 提供的在这种情况下std::generate是一个更好、更干净的解决方案。
你可以在这里下载我的小测试,其中包含 2 个小源文件 + gcc 的 Makefile http://www.sendspace.com/file/ew73h8
我在这里做错了什么?我增加这个向量的大小越多,TBB 就越慢,我使用的是 Ubuntu 13.04 64 位和 Intel Q6600。
TBB 版本在某些方面可以做得更好吗?
编辑:这两个文件的完整源代码
配置文件
#define N 10000000
Run Code Online (Sandbox Code Playgroud)
标准cpp
#include <random>
#include <iostream>
#include <vector>
#include <algorithm>
#include "config.hpp"
int main() {
std::vector<u_int32_t> v(N);
std::mt19937 mt;
std::uniform_int_distribution<u_int32_t> dist(0,499);
std::generate(v.begin(),v.end(),[&]{return dist(mt);});
return(0);
}
Run Code Online (Sandbox Code Playgroud)
待定.cpp
#include <tbb/concurrent_vector.h>
#include <tbb/parallel_for_each.h>
#include <random>
#include <iostream>
#include "config.hpp"
int main()
{
tbb::concurrent_vector<u_int32_t> v(N);
std::mt19937 …Run Code Online (Sandbox Code Playgroud) parallel_reduce 提供2个接口,lambdas的一个可以像上一个链接中显示的那样使用
#include "tbb/parallel_reduce.h"
#include "tbb/blocked_range.h"
using namespace tbb;
float ParallelSum( float array[], size_t n ) {
return parallel_reduce(
blocked_range<float*>( array, array+n ),
0.f,
[](const blocked_range<float*>& r, float init)->float {
for( float* a=r.begin(); a!=r.end(); ++a )
init += *a;
return init;
},
[]( float x, float y )->float { // what this lambda does ?
return x+y;
}
);
}
Run Code Online (Sandbox Code Playgroud)
第二个lambda符合const Reduction& reduction签名,我正在研究这个lambda试图改变身体或价值观,但它确实没有做任何事情(即使我把一个cout内部,没有任何事情发生),看起来它完全没有任何理由.
这是什么目的Reduction?与此有关0f?我得到的0f是一个用于检测可以跳过的值的谓词,但我仍然无法弄清楚lambda的作用...
我想尝试编写自己的容器,就像练习一样,我的目标是生成一些符合C++ 11标准的东西,而且我也试图避免像一个简单而低效的实现.链表.
我想要一个关于什么是最简单和更简洁的容器的输入,在C++ 11标准的哪个部分我可以找到标准本身所需的功能的描述.
如果我写这个
std::vector<std::string> v{"one","two","three"};
Run Code Online (Sandbox Code Playgroud)
推断到关联std::initializer_list模板的类型是什么?换句话说,当char *字符串文字转换为std::string?
声明它是一个更好的主意
std::vector<std::string> v{std::string("one"),
std::string("two"),
std::string("three")};
Run Code Online (Sandbox Code Playgroud)
避免与涉及的模板的类型推导机制相关的问题?我会对此保持相同的优化吗?
什么之间的区别--x的x-1?我有一个方法,计算我尝试100的前n个数字的总和,结果如下:
int sumaRec(int _suma){
if (_suma > 0)
{
return _suma + sumaRec(--_suma);
}
else
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我把--_suma 结果是4950,当我把_suma -1结果是5050
有谁能解释为什么?请.
有时候我会尝试遵循一些规则的逻辑,有时候为什么事情发生的逻辑会违反我所知道的任何法律.
通常,模板被描述为仅在编译阶段存在的东西,它完全等同于foo为任何给定类型手写一些函数T.
那么,为什么这个代码不编译(我使用C++ 11 gcc和clang的时刻,但我不认为这是在这种情况下相关的)?
#include <iostream>
#include <cstdint>
#include <cstdlib>
extern "C" {
template <typename T>
T foo(T t)
{
return t;
}
}
int main()
{
uint32_t a = 42;
std::cout << foo(a) << '\n';
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
击败所有逻辑的事情是抱怨是关于链接,而隐含的消息是这个代码不生成函数,它生成其他东西,在编译后它不适合C风格的链接.
这段代码无法编译的技术原因是什么?
假设我想用异步行为实现函数或者我只想使用函数指针,调用函数指针是否被授予导致相关函数的调用,紧接着是下一条指令?
例
#include <iostream>
#include <cstdint>
int triple(int a) { return a * 3; }
void foo() { std::cout << "executing foo()" << '\n'; }
using fptrT = int (*)(int);
int main()
{
fptrT p = triple;
p(3);
foo();
}
Run Code Online (Sandbox Code Playgroud)
两个标准都说明了表达式p(3)得到评估时foo()会发生什么以及何时执行?
我在推理如何编写和设计几个应该处理特定文件格式的函数,这些函数可能有不同的实现和不同的版本,每个函数需要一种不同的方法来解码文件中的这些信息.
我像往常一样浏览标准库,我得到了一个std::function存在的余数,但问题是我无法弄清楚为什么我可能有兴趣使用std::function,在C和C++编程时的第一个规则之一是如果你不必引用你不一定要命名的东西,你可以获得未命名的数据结构和未命名/ lambda函数,但函数通常有一个名称,而lambda的类型仍然是实现根据我的记忆定义,那么需要std::function什么?
例如,在我的情况下,我正在考虑使用a map或an hash table(但所涉及的函数数量实际上很小,现在最多2-3个),其中一对由tag(表示文件格式的版本/实现)+ functions,我想知道为什么我不能只使用std::string和函数指针作为每对的2种类型; 我也无法理解为什么我们std::function在标准库中.
我的意思是,当你需要一个未命名的函数并且你需要一个对象来描述它的状态时呢?
在编译时,有些使用static_asserts我想检查一些简单类型的位大小,unsigned int或者char,根据我的用法,它将在编译时发生重要的事情.
我在gcc手册中没有发现任何相关内容,也没有任何相关功能的知识clang,任何人都知道如何检查类型使用的位数?
请不要,我的重点是位和编译时间.