我试图规范化4d向量.
我的第一个approch是使用SSE内在函数 - 这为我的向量算法提供了2倍的速度提升.这是基本代码:( v.v4是输入)(使用GCC)(所有内容都是内联的)
//find squares
v4sf s = __builtin_ia32_mulps(v.v4, v.v4);
//set t to square
v4sf t = s;
//add the 4 squares together
s = __builtin_ia32_shufps(s, s, 0x1B);
t = __builtin_ia32_addps(t, s);
s = __builtin_ia32_shufps(s, s, 0x4e);
t = __builtin_ia32_addps(t, s);
s = __builtin_ia32_shufps(s, s, 0x1B);
t = __builtin_ia32_addps(t, s);
//find 1/sqrt of t
t = __builtin_ia32_rsqrtps(t);
//multiply to get normal
return Vec4(__builtin_ia32_mulps(v.v4, t));
Run Code Online (Sandbox Code Playgroud)
我检查了反汇编,它看起来像我期待的.我没有看到任何大问题.
无论如何,然后我尝试使用近似值:(我从谷歌得到这个)
float x = (v.w*v.w) + (v.x*v.x) + (v.y*v.y) + (v.z*v.z);
float xhalf …Run Code Online (Sandbox Code Playgroud) 我想知道是否建议消除所有冗余的opengl调用.
例如,我应该做什么(包裹在一个函数中):
if(foobuffer != boundbuffer) {
glBindBuffer(GL_BAR_BUFFER, foobuffer);
boundbuffer = foobuffer;
}
Run Code Online (Sandbox Code Playgroud)
或者是驱动程序自动执行此类操作,这实际上是一个冗余的reduntant-check?
每次我使用unsigned过之前的关键字int或其他内置类型.我想知道是否还有其他方法unsigned可以使用.
unsigned关键字?unsigned吗?如果没有,为什么它有自己的关键字?为什么unsigned int不uint呢?
我不明白这个:
(7.6.1)只有在引入属性指定符时才会出现两个连续的左方括号标记.[注意:如果在不允许属性指定的情况下出现两个连续的左方括号,即使括号与替代语法生成匹配,程序也会形成错误. - 尾注] [例子:(略微修改自来源)
// ...
void f() {
int x = 42, y[5];
// ...
y[[] { return 2; }()] = 2; // error even though attributes are not allowed
// in this context.
}
Run Code Online (Sandbox Code Playgroud)
可以[[使用什么替代语法?如果属性不存在,示例是否有效(示例的作用是什么)?
我目前正在开发一个大规模的应用程序项目(用c ++编写),它从一开始就是从头开始,我们已经到了强制要求对内存泄漏进行检查的时候了.
该应用程序在Ubuntu Linux上运行,它具有大量的多媒体内容,并使用OpenGl,SDL和ffmpeg用于各种目的,包括3D图形渲染,窗口,音频和电影播放.您可以将其视为视频游戏,虽然它不是,但通过将其视为视频游戏,可以简化应用程序的职责.
我目前有点无能为力地确定我们是否还有内存泄漏.在过去,我们已经确定了一些,并删除了它们.这些天,应用程序已接近完成,我们运行的测试给了我一些我无法弄清楚的结果.
我做的第一件事是尝试通过Valgrind运行应用程序...不幸的是,当在valgrind环境中运行时应用程序崩溃."非确定性"崩溃,因为它在各个不同的地方崩溃.所以我放弃了Valgrind来轻松识别潜在泄漏的来源,并最终使用了两个Linux命令:free和top.
在应用程序运行时,free用于探测系统内存使用情况
top与'-p'选项一起使用,以在运行时探测应用程序进程内存使用情况.
输出表单top和free将被转储到文件中以进行后处理.我用问题底部链接的数据组成了两个图表.
测试用例非常简单:一旦应用程序启动并等待命令,就会探测有关内存的数据.然后我开始一系列命令,这些命令反复执行相同的操作.该应用程序有望将大量多媒体数据加载到RAM中,然后下载.
不幸的是,图表没有显示我的期望.内存使用量通过3个不同的步骤增长,然后停止.内存显然从未发布,这暗示我有一个巨大的内存泄漏.这将是完全正常的,因为这意味着我们很可能没有释放被媒体吸收的记忆.
但是在前三个步骤之后...内存使用情况稳定......没有更大的步骤......只是轻微的上下,这与预期的数据加载和卸载相对应.这里出乎意料的是,应该加载/卸载的数据占据了百万兆字节的RAM,而不是只有少数兆字节的数据(比如8-10 MB).
我目前在解释这些数据时非常无能为力.
任何人都有一些提示或建议吗?我错过了什么?我用来检查宏观内存泄漏是否存在完全错误的方法?你知道Valgrind以外的任何其他(最好是免费的)工具来检查内存泄漏吗?
这不是一个OpenGL问题,而是一个C++组织问题.
我将要有一个简单的场景图(一个n树),其节点(为了这个问题)将渲染一些几何.更具体地说,它们在draw()方法中都有一些OpenGL绘图命令.
出于优化原因,我想将类似的对象一起批处理并一次性绘制它们.出于这个原因,我想要一种表达我称之为OpenGL的"状态集"的方式.状态集只是一堆OpenGL绑定,或者是在X对象上调用draw之前设置的命令,之后会被取消设置.
因此,状态集至少set()和unset()将被渲染系统在使用该状态集的节点的绘制命令之前和之后调用.
我的问题是如何表达状态集?当然有很多功能可以做,但我宁愿能够命名一套并回忆它.类似于节点A具有状态集LIGHTING_AND_SHADOW和节点B具有的状态集CEL_SHADING.
出于这个原因,创建一个抽象类stateSet,它本质上是set()和unset()方法的接口,并且每个状态集继承自它似乎是一个好主意.但是,它需要创建一堆对象才能获得一个名称.似乎可能有更好的方法.
理想情况下,我想列出一个stateSets可以轻松召回的清单.例如,在渲染开始之前,能够按照它们对场景图中的所有节点进行排序将是很好的stateSet.
有任何想法吗?
如果我这样做:
Dog dog; //class with virtual methods
Cat cat; //class from same base as Dog
dog.eat(); //call virtual method
cat.eat(); //call virtual method
Run Code Online (Sandbox Code Playgroud)
然后eat()s将是正常的方法调用,不会要求v表 - 正确吗?我可以假设它会运行与非虚方法相同吗?
(是的,我知道编译器如何处理虚函数不在标准中 - 我想知道大多数编译器的作用)
我正在尝试使用 GCC 4.7 快照做一些类似的事情:
\n\ntemplate <int n, int... xs>\nstruct foo { \n static const int value = 0;\n};\n\n// partial specialization where n is number of ints in xs:\n\ntemplate <int... xs>\nstruct foo<sizeof...(xs), xs...> { // error: template argument \xe2\x80\x98sizeof (xs ...)\xe2\x80\x99\n // involves template parameter(s)\n static const int value = 1;\n};\n\ntemplate <int... xs>\nstruct foo<sizeof(xs), xs...> { // This compiles fine. sizeof(xs) is sizeof int \n // even though packs aren't expanded\n static const int value = 2;\n};\nRun Code Online (Sandbox Code Playgroud)\n\n该错误很奇怪,因为在这种情况下, sizeof …
我有这个代码.在主要我想要使用类型转换,但使用调试我明白在这一行
ob2=(Point2D<double>)ob1;
template <class T1> Point2D(Point2D<T1>& ob)无论explicit以前调用构造函数,template <class T1> explicit Point2D(Point2D<T1>& ob)为什么会发生这种情况?我希望这operator Point2D<T1>()是被调用的.
template <class T>
class Point2D
{
public:
T x;
T y;
Point2D(T _x=0,T _y=0):x(_x),y(_y)
{
}
Point2D(Point2D& ob)
{
x=ob.x;
y=ob.y;
}
template <class T1>
Point2D(Point2D<T1>& ob)
{
x=ob.x;
y=ob.y;
}
template <class T1>
operator Point2D<T1>()
{
return Point2D<T1>(x,y);
}
};
int main()
{
Point2D<int> ob1(10,10);
Point2D<double> ob2(20,20);
ob2=(Point2D<double>)ob1;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在我的理解中,对于C++虚拟调用,它需要:
而对于非虚拟(例如在C)呼叫,仅需要#4.
我认为#3应该是最耗时的.鉴于C++中实时覆盖的性质,我看不到上述步骤的编译时间优化的可能性.因此,对于具有长函数签名的复杂类继承,C++虚拟调用应该比非虚拟调用慢得多.
但所有的说法都是相反的,为什么?