我使用QQmlApplicationEngine如下:
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
app.exec();
Run Code Online (Sandbox Code Playgroud)
但现在我想为我的应用程序启用多重采样,并且QQmlApplicationEngine似乎没有setFormat启用多重采样的方法.
我QQmlApplicationEngine 在论坛中找到了一种方法:
QQuickWindow* window = (QQuickWindow*) engine.rootObjects().first();
QSurfaceFormat format;
format.setSamples(16);
window->setFormat(format)
Run Code Online (Sandbox Code Playgroud)
但它依赖于引擎的第一个根对象是a QQuickWindow,这在Qt docs中没有记录.所以我不想使用那种技术.
另一种方法是跳过QQmlApplicationEngine并创建一个QQuickView代替.这确实有一个setFormat让我能多采样方法,但我不知道,我是不可能输给由切换什么QQmlApplicationEngine来QQuickView?
换句话说,这两个类之间有什么区别?
我找到的一个区别是(从这里):
与QQuickView不同,QQmlApplicationEngine不会自动创建根窗口.如果您使用Qt Quick中的可视项目,则需要将它们放在窗口内.
这种特殊的差异对我来说无关紧要.
还有其他差异吗?
这是一个可重复的例子:
main.qml
import QtQuick 2.0
Item {
id : root
width: 360
height: 360
Text {
id : t1
text: qsTr("Hello World")
property int someNumber: 1000
anchors.centerIn: parent
}
MouseArea {
anchors.fill: parent
onClicked: {
Qt.quit();
}
}
}
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include <QtGui/QGuiApplication>
#include <QQmlEngine>
#include <QQmlComponent>
#include <QQmlProperty>
#include <QDebug>
#include "qtquick2applicationviewer.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QtQuick2ApplicationViewer viewer;
viewer.setMainQmlFile(QStringLiteral("qml/untitled/main.qml"));
viewer.showExpanded();
QQmlEngine engine;
QQmlComponent component(&engine, "qml/untitled/main.qml");
QObject *object = component.create();
qDebug() << "Property value:" << QQmlProperty::read(object, …Run Code Online (Sandbox Code Playgroud) 是的,我正在使用分析器(ANTS).但在微观层面,它无法告诉你如何解决你的问题.我现在处于微观优化阶段.例如,我正在分析这个:
for (int x = 0; x < Width; x++)
{
for (int y = 0; y < Height; y++)
{
packedCells.Add(Data[x, y].HasCar);
packedCells.Add(Data[x, y].RoadState);
packedCells.Add(Data[x, y].Population);
}
}
Run Code Online (Sandbox Code Playgroud)
ANTS显示y环线占用了大量时间.我以为是因为它必须经常调用高度吸气剂.所以我在int height = Height;循环之前创建了一个本地,并使内循环检查y < height.这实际上使性能更糟!ANTS现在告诉我x-loop-line是个问题.咦?这应该是微不足道的,它是外循环!
最终我有一个启示 - 可能使用外部循环绑定的属性和内部循环绑定的本地CLR跳转经常在"本地"缓存和"this-pointer"缓存之间(我用过)考虑CPU缓存).所以我也为Width创建了一个local,并修复了它.
从那里,很明显我也应该为数据创建一个本地 - 即使数据甚至不是属性(它是一个字段).事实上这给我带来了更多的表现.
但令人费解的是,重新排序x和y循环(以提高缓存使用率)是零差异,即使阵列很大(3000x3000).
现在,我想了解为什么我所做的事情提高了性能.你建议我读什么书?
.NET中的一些东西称为"格式化程序" - BinaryFormatter, SoapFormatter.
其他人被称为"序列化器" - XmlSerializer, DataContractSerializer.
为什么不同?
我正在调用glTexSubImage2D.如果我的像素格式是GL_RGBA,那么像素类型GL_UNSIGNED_BYTE和GL_UNSIGNED_INT_8_8_8_8完全相同吗?
另外,这两对是否相同?
Format = GL_RGBA, Type = GL_UNSIGNED_INT_8_8_8_8Format = GL_BGRA, Type = GL_UNSIGNED_INT_8_8_8_8_REV我已经尝试过阅读OpenGL规范和GL_EXT_packed_pixels规范,但说实话,我无法做出它们的头或尾.
我的显卡是Mobile Intel 4系列.我正在更新每帧更改数据的纹理,这是我的主循环:
for(;;) {
Timer timer;
glBindTexture(GL_TEXTURE2D, tex);
glBegin(GL_QUADS); ... /* draw textured quad */ ... glEnd();
glTexSubImage2D(GL_TEXTURE2D, 0, 0, 0, 512, 512,
GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
swapBuffers();
cout << timer.Elapsed();
}
Run Code Online (Sandbox Code Playgroud)
每次迭代需要120ms.但是,在glTexSubImage2D之前插入glFlush会使迭代时间延长到2ms.
问题不在于像素格式.我已经尝试了像素格式BGRA,RGBA和ABGR_EXT以及像素类型UNSIGNED_BYTE,BYTE,UNSIGNED_INT_8_8_8_8和UNSIGNED_INT_8_8_8_8_EXT.纹理的内部像素格式是RGBA.
通话顺序很重要.例如,在四边形绘图之前移动纹理上载可以修复缓慢的问题.
我也在GeForce GT 420M卡上尝试过这种功能,它在那里工作得很快.我的真实应用确实在glFlush调用修复的非Intel卡上存在性能问题,但我还没有将它们提取到测试用例中.
关于如何调试这个的任何想法?
我用C++和OpenGL编写了一个C#游戏.我想为它添加一个菜单,我需要Qt.您在C#中为Qt推荐了哪些绑定?
要求:
事实上,我很感激您在使用Qt和C#时可以分享的任何经验.
编辑:我现在正在使用qt4dotnet和OpenTK进行一个重大项目.随意问我问题.
我们在C#游戏中使用BinaryFormatter来保存用户游戏进度,游戏关卡等.我们遇到了向后兼容性的问题.
目的:
解决方案需要对用户和关卡设计人员完全不可见,并且最低限度地要求更改某些内容的编码人员(例如,因为他们想要更好的名称而重命名字段).
我们序列化的一些对象图根植于一个类,一些在其他类中.不需要向前兼容性.
可能会发生变化(当我们序列化旧版本并反序列化为新版本时会发生什么):
我读过:
我目前的解决方案:
.
for(int i = loadedData.version; i < CurrentVersion; i++)
{
// Update() takes an instance of OldVersions.VersionX.TheClass
// and returns an instance of OldVersions.VersionXPlus1.TheClass
loadedData.data = Update(loadedData.data, i);
}
Run Code Online (Sandbox Code Playgroud)
有些问题:
这应该是一个非常普遍的问题.人们通常如何解决它?
考虑像System.Drawing.Point这样的结构 - 一个使用LayoutKind.Sequential并且只包含原始成员的结构.我有一个这样的结构的C#数组.
我通过P/Invoke将它传递给(非托管)C++函数.在C++方面,有一个相应的结构定义(例如struct Point { int x, y; };).该函数采用Point*arg.
我的问题是,在什么情况下CLR复制数据,在什么情况下它只是固定它?变量包括:
Point*或Point[]/Point[,]fixed(Point* pointer = array)与否我想避免复制,因为它很慢.
当我按下Ctrl+;并键入时,VS 在文件名和 C++ 符号(例如函数名、类名)中搜索。没关系,除了由于这个新功能,它比以前的 VS 版本慢得多。
如何让它只在文件名中搜索?
.net ×4
c# ×3
performance ×3
qt ×3
opengl ×2
qml ×2
qtquick2 ×2
binding ×1
c++ ×1
clr ×1
marshalling ×1
optimization ×1
pinvoke ×1
pixelformat ×1
qquickview ×1
qtcore ×1
terminology ×1