我目前正在使用Qt3D模块在C++/Qt5中编写游戏.
我可以在QGLView上渲染场景(QGLSceneNodes),但现在我不得不用一些GUI元素重复绘制场景.我还没有决定是否使用QML或C++来定义界面的外观,所以我愿意接受两者的解决方案.(注意,QML模块称为QtQuick3D,C++模块称为Qt3D,它们都是Qt5的一部分.)
我非常喜欢基于QML的解决方案.
我该如何做一些过度涂色?
必须具备以下条件:
我认为这只是使用另一个QGLSceneNode用于2D GUI部分.但是我认为定位和定向一些场景节点以便在渲染期间(使用顶点着色器)重新定位和重新定位没有意义,引入数值误差并且看起来效率低下.
是否正确使用另一个"GUI"顶点着色器?
(如何)我可以一起制作后期渲染效果和重复绘画?
如果我可以执行以下后期渲染效果,那将是非常好的:
当我使用特殊的着色器程序实现重绘时,我发现了一个问题:我无法访问GUI后面的像素来应用高斯模糊等效果,使GUI看起来像玻璃.我必须将场景渲染到另一个缓冲区而不是QGLView.这是我的主要问题......
我想在类中有一个可变参数模板函数.可变参数模板参数是字符,应该以类似循环的方式处理.所以我想把它写成haskell,头部/尾部分割列表,直到达到基本情况(空列表).
举个例子,让我们只计算给出的参数数量(只是一个最小的例子).
我想出了以下代码:
struct MyClass {
template<char ...X>
static int count();
};
template<>
int MyClass::count<>() {
return 0;
}
template<char Head, char ...Tail>
int MyClass::count<Head, Tail...>() {
return 1 + count<Tail...>();
}
Run Code Online (Sandbox Code Playgroud)
但是,这似乎不起作用:
prog.cpp:12:35: error: function template partial specialization ‘count<Head, Tail ...>’ is not allowed
prog.cpp:12:5: error: prototype for ‘int MyClass::count()’ does not match any in class ‘MyClass’
prog.cpp:3:16: error: candidate is: template<char ...X> static int MyClass::count()
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我知道功能不支持部分特化.但我认为将变量模板专门设计为头/尾和空基本案例版本不是局部专业化而是完全专业化,但也许我错了?我是否需要将其写为类而不是函数?
我发现了一些示例(printf),它们在不使用模板语法的情况下实现了基本情况.但我想我的情况有所不同,因为对printf的调用不使用模板语法而是类型推导,所以printf(tail...)调用printf() …
c++ templates template-meta-programming variadic-templates c++11
我有一个QByteArray存储从GPS接收的数据,这是部分二进制和部分ASCII.我想知道调试提案知道收到了什么,所以我写的qDebug是这样的:
//QByteArray buffer;
//...
qDebug() << "GNSS msg (" << buffer.size() << "): " << buffer;
Run Code Online (Sandbox Code Playgroud)
我在控制台上收到这样的消息:
GNSS msg ( 1774 ): "ygnnsdgk...(many data)..PR085hlHJGOLH
(more data into a new line, which is OK because it is a new GNSS sentence and
probably has a \n at the end of each one) blablabla...
Run Code Online (Sandbox Code Playgroud)
但突然间我得到了一个新的打印迭代.数据尚未删除,已附加.所以新的消息大小例如3204,明显比之前的打印大.但它打印完全相同(但括号之间的新尺寸3204).没有打印新数据,只是与上一条消息相同:
GNSS msg ( 3204 ): "ygnnsdgk...(many data)..PR085hlHJGOLH
(more data into a new line, which is OK because it is a new GNSS sentence …Run Code Online (Sandbox Code Playgroud) 今天我下载并创建了一个Electronic Arts STL实现的示例项目,EA的矢量看起来比标准慢得多.我刚创建了2个向量并上传了100万个项目:
void performance_test(void)
{
clock_t start;
clock_t end;
// EA
eastl::string strEA = "hello";
eastl::vector<eastl::string> vec_EA;
start = clock();
for (size_t i = 0; i < 1000000; i++)
{
vec_EA.push_back(strEA);
}
end = clock();
printf("EA %f\n", (double(end - start) / 1000));
// Standard
std::string strStandard = "hello";
std::vector<std::string> vec_Standard;
start = clock();
for (size_t i = 0; i < 1000000; i++)
{
vec_Standard.push_back(strStandard);
}
end = clock();
printf("Standard %f\n", (double(end - start) / 1000));
}
Run Code Online (Sandbox Code Playgroud)
结果是:
我想在运行XBMC时获得屏幕内容的平均颜色,以更改电视环境光的颜色.XBMC运行在一个小型HTPC上,OpenGL ES 2.0硬件(Raspberry Pi)运行Debian派生的发行版.我想我必须从XBMC使用OpenGL绘制的屏幕帧缓冲区中读取.(至少,我认为并希望XBMC使用OpenGL呈现所有内容.)
是否可以读取代表整个屏幕输出的OpenGL帧缓冲区?我需要访问它什么?我是否还需要一个自己的渲染上下文来访问屏幕的帧缓冲区?(我不会自己渲染任何东西到屏幕上,我只想阅读).
有效地计算平均颜色是下一个任务.我正在考虑每行/每列读取第8或第16个像素(足够,我们正在讨论1080p高清电影),然后计算CPU上的平均值.欢迎任何有关更好解决方案的想法.
这些线条是否相同?
float a = 2.0f;
Run Code Online (Sandbox Code Playgroud)
和
float a = 2.000000f;
Run Code Online (Sandbox Code Playgroud) 我正在编写一个模板函数,它将一个函数对象(现在是一个lambda)作为参数,使用lambda数据类型作为模板参数,并返回lambda返回的相同类型.像这样:
template<typename TFunctor, typename TReturn>
TReturn MyFunc(TFunctor &Func, TReturn) //The second arg is just to keep the template spec happy
{
return Func();
}
Run Code Online (Sandbox Code Playgroud)
消费代码如下:
int n = MyFunc([](){return 17;}, int());
Run Code Online (Sandbox Code Playgroud)
我不喜欢指定返回数据类型的丑陋方式.在编译器生成的lambda类中是否有一些内置的typedef会给我它的返回类型?所以MyFunc可以这样:
template<typename TFunctor>
TFunctor::return_type MyFunc(TFunctor &Func)
{ //...
Run Code Online (Sandbox Code Playgroud)
我希望它返回lambda返回的相同类型,而不显式拼写该类型.
编辑:目前,我所关注的所有lambda都没有争议.变量捕获也可以做到这一点.
我正在玩一些无用的代码来理解成员引用的初始化,并碰到了这个:
struct A {};
struct B
{
B() : a()
{
}
const A& a;
};
Run Code Online (Sandbox Code Playgroud)
使用gcc 4.9.2编译时,上面的代码给出以下错误:
In constructor 'B::B()':
error: value-initialization of reference type 'const A&'
B() : a()
Run Code Online (Sandbox Code Playgroud)
我明白了
但是如果我在B的构造函数的初始化列表中使用统一初始化,就像这样:
struct A {};
struct B
{
B() : a{}
{
}
const A& a;
};
Run Code Online (Sandbox Code Playgroud)
它汇编很好.
所以问题是,为什么在这里使用统一初始化会改变编译结果?
我也尝试使用Microsoft Visual C++ 2013.它不编译任何版本的代码,并使用相同的错误消息:
Error 3 error C2440: 'initializing' : cannot convert from 'int' to 'const A &
Run Code Online (Sandbox Code Playgroud)
你可以在这里快速玩它:
我想将文件上传到FTP服务器,但文件内容保存在变量中,而不是实际的本地文件中.我想避免使用文件; 这是为了避免在(可能)不那么安全的系统(*)上处理敏感数据时的安全风险,以及最小化文件处理(已经很低)的开销.
但PHP的FTP API仅提供通过函数从本地文件上传文件ftp_put或(当文件已作为文件句柄打开时)ftp_fput.
目前,我将此函数与临时文件一起使用,我在上传之前编写内容:
$tmpfile = tmpfile();
fwrite($tmpfile, $content);
fseek($tmpfile, 0);
ftp_fput($ftp, $filename, $tmpfile, FTP_BINARY);
Run Code Online (Sandbox Code Playgroud)
有没有在本地(PHP)网站上使用文件的简单方法?
有ftp_raw可以用来发送任意命令,所以我可以PUT手动发出命令,但是我没有看到在数据通道上手动写入数据的方法......
我不知道它是否重要,但FTP连接是用SSL(ftp_ssl_connect)保护的.
(*)考虑攻击者对整个文件系统具有只读控制的情况.
我希望拥有一个多用户系统(基于Linux),只使用一个带有多个屏幕的X11会话和一对鼠标和键盘.因此,两个(或更多)人可以使用相同的计算机共享不仅相同的硬件而且共享相同的"屏幕"(当然,它将被分成两个物理屏幕,但您可以将窗口移动到您的伙伴身上. ..).共享窗口不仅可以更方便地"显示"您的合作伙伴您所做的事情 - 如果用户A开始使用复杂的应用程序处理某些事情(断言保存文件并打开它们不方便另一个会话)将应用程序的窗口移动到用户B应该就像在自己的屏幕中移动窗口一样简单.这就是我称之为"无缝"多用户会话的原因.
我在这篇文章中读到了X11"多座位",它没有我想要的功能.它为每个用户使用会话而不是一个会话.
我发现XI2又名Xinput2,它提供了多指针支持.这允许具有由两只小鼠控制的两个单独的鼠标指针.我读到你可以为两只鼠标分配两个键盘,提供独立的焦点和文本输入.但我想知道剪贴板("真实"和"鼠标中键"剪贴板)是否也被单独处理......我发现只有少数关于XI2多指针功能但没有"现场报告"的信息.
另一个完全不同的想法是在计算机上有两个独立的X11会话,但在两个会话之间使用X11-forward共享窗口.但是:据我所知,你不能共享一个转发X11的窗口,以便用户A运行一个应用程序,当它运行时,将窗口发送给用户B.据我所知,只有用户B可以在硬件上运行一个应用程序用户A并在其自己的X11会话上显示窗口.那也不是我想要的......或者我错了,可以在应用程序启动后通过X11转发转发窗口吗?
编辑:我刚刚发现XPRA类似于X11转发,但允许从/向X11会话分离和附加正在运行的应用程序.我现在试一试.
完成任何其他想法?