小编Ste*_*nov的帖子

QQmlApplicationEngine和QQuickView有什么区别?

我使用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让我能多采样方法,但我不知道,我是不可能输给由切换什么QQmlApplicationEngineQQuickView

换句话说,这两个类之间有什么区别?

我找到的一个区别是(从这里):

与QQuickView不同,QQmlApplicationEngine不会自动创建根窗口.如果您使用Qt Quick中的可视项目,则需要将它们放在窗口内.

这种特殊的差异对我来说无关紧要.

还有其他差异吗?

qt qml qtquick2 qquickview qqmlapplicationengine

23
推荐指数
2
解决办法
9505
查看次数

如何从C++访问嵌套的QML对象?

这是一个可重复的例子:

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)

c++ qt qml qtquick2 qtcore

14
推荐指数
1
解决办法
1万
查看次数

我如何充分了解CLR对性能问题做出有根据的猜测?

是的,我正在使用分析器(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 c# clr optimization performance

10
推荐指数
1
解决办法
479
查看次数

"Formatter"和"Serializer" - 条款之间的任何差异?

.NET中的一些东西称为"格式化程序" - BinaryFormatter, SoapFormatter.

其他人被称为"序列化器" - XmlSerializer, DataContractSerializer.

为什么不同?

.net serialization terminology

10
推荐指数
1
解决办法
1091
查看次数

OpenGL纹理上传:UNSIGNED_BYTE vs UNSIGNED_INT_8_8_8_8

我正在调用glTexSubImage2D.如果我的像素格式是GL_RGBA,那么像素类型GL_UNSIGNED_BYTEGL_UNSIGNED_INT_8_8_8_8完全相同吗?

另外,这两对是否相同?

  • Format = GL_RGBA, Type = GL_UNSIGNED_INT_8_8_8_8
  • Format = GL_BGRA, Type = GL_UNSIGNED_INT_8_8_8_8_REV

我已经尝试过阅读OpenGL规范和GL_EXT_packed_pixels规范,但说实话,我无法做出它们的头或尾.

opengl pixelformat

10
推荐指数
1
解决办法
6301
查看次数

glTexSubImage2D在英特尔显卡上速度极慢

我的显卡是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卡上存在性能问题,但我还没有将它们提取到测试用例中.

关于如何调试这个的任何想法?

opengl performance

10
推荐指数
2
解决办法
3476
查看次数

Qt的最佳C#绑定?

我用C++和OpenGL编写了一个C#游戏.我想为它添加一个菜单,我需要Qt.您在C#中为Qt推荐了哪些绑定?

  • Qyoto?(显然它在Windows中仍然不稳定.)
  • qt4dotnet
  • 其他?

要求:

  • 快速
  • 应该只是工作和抛光 - 即每一步都没有奇怪的问题
  • 与构建系统,uic,资源等的集成应该运行良好

事实上,我很感激您在使用Qt和C#时可以分享的任何经验.

编辑:我现在正在使用qt4dotnet和OpenTK进行一个重大项目.随意问我问题.

c# binding qt

9
推荐指数
1
解决办法
2万
查看次数

.NET与BinaryFormatter的向后兼容性

我们在C#游戏中使用BinaryFormatter来保存用户游戏进度,游戏关卡等.我们遇到了向后兼容性的问题.

目的:

  • 关卡设计师会创建广告系列(级别和规则),我们会更改代码,广告系列应该仍能正常运行.这可以在发布之前的每个开发期间发生.
  • 用户保存游戏,我们发布游戏补丁,用户应该仍然可以加载游戏
  • 无论两个版本有多远,无形数据转换过程都应该有效.例如,用户可以跳过我们的前5个小更新并直接获得第6个.尽管如此,他保存的游戏仍然可以正常运行.

解决方案需要对用户和关卡设计人员完全不可见,并且最低限度地要求更改某些内容的编码人员(例如,因为他们想要更好的名称而重命名字段).

我们序列化的一些对象图根植于一个类,一些在其他类中.不需要向前兼容性.

可能会发生变化(当我们序列化旧版本并反序列化为新版本时会发生什么):

  • 添加字段(获取默认初始化)
  • 更改字段类型(失败)
  • 重命名字段(相当于删除它并添加一个新字段)
  • 将属性更改为字段和返回(相当于重命名)
  • 更改自动实现的属性以使用支持字段(相当于重命名)
  • 添加超类(相当于将其字段添加到当前类)
  • 以不同的方式解释一个字段(例如,以度为单位,现在以弧度表示)
  • 对于实现ISerializable的类型,我们可以改变ISerializable方法的实现(例如,对于某些非常大的类型,在ISerializable实现中开始使用压缩)
  • 重命名一个类,重命名一个枚举值

我读过:

我目前的解决方案:

  • 我们通过使用像OnDeserializing回调之类的东西,尽可能多地进行更改.
  • 我们每两周安排一次重大更改,因此保留的兼容性代码较少.
  • 每次我们进行重大更改之前,我们会将我们使用的所有 [Serializable]类复制到名为OldClassVersions.VersionX的名称空间/文件夹中(其中X是最后一个之后的下一个序号).即使我们不打算很快发布,我们也会这样做.
  • 在写入文件时,我们序列化的是这个类的一个实例:class SaveFileData {int version; 对象数据; }
  • 从文件中读取时,我们反序列化SaveFileData并将其传递给迭代的"更新"例程,该例程执行如下操作:

.

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)
  • 为方便起见,Update()函数在其实现中可以使用CopyOverlappingPart()函数,该函数使用反射将尽可能多的数据从旧版本复制到新版本.这样,Update()函数只能处理实际更改的内容.

有些问题:

  • 反序列化器反序列化为类Foo而不是类OldClassVersions.Version5.Foo - 因为类Foo是序列化的.
  • 几乎不可能测试或调试
  • 需要保留很多类的旧副本,这容易出错,易碎且烦人
  • 当我们想要重命名一个类时,我不知道该怎么做

这应该是一个非常普遍的问题.人们通常如何解决它?

.net backwards-compatibility binaryformatter

9
推荐指数
1
解决办法
3821
查看次数

编组从.NET到C++的结构数组:什么时候进行复制?

考虑像System.Drawing.Point这样的结构 - 一个使用LayoutKind.Sequential并且只包含原始成员的结构.我有一个这样的结构的C#数组.

我通过P/Invoke将它传递给(非托管)C++函数.在C++方面,有一个相应的结构定义(例如struct Point { int x, y; };).该函数采用Point*arg.

我的问题是,在什么情况下CLR复制数据,在什么情况下它只是固定它?变量包括:

  • 数组类型:一维或矩形
  • C#函数定义 - 使用Point*Point[]/Point[,]
  • 使用fixed(Point* pointer = array)与否

我想避免复制,因为它很慢.

.net c# performance pinvoke marshalling

9
推荐指数
1
解决办法
1392
查看次数

如何使解决方案资源管理器仅搜索文件名

当我按下Ctrl+;并键入时,VS 在文件名和 C++ 符号(例如函数名、类名)中搜索。没关系,除了由于这个新功能,它比以前的 VS 版本慢得多。

如何让它只在文件名中搜索?

visual-studio-2017

9
推荐指数
1
解决办法
611
查看次数