mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-05-06 01:50:38 +00:00
Rewrite the analytics intro text to be less of a wall of text
* Also add a preview of what data will be included in any report, both in the intro and in the confirmation before sending any report.
This commit is contained in:
@@ -23,15 +23,51 @@
|
||||
******************************************************************************/
|
||||
|
||||
#include <QBuffer>
|
||||
#include <QDialog>
|
||||
#include <QDialogButtonBox>
|
||||
#include <QNetworkAccessManager>
|
||||
#include <QNetworkReply>
|
||||
#include <QTextEdit>
|
||||
#include <QUrlQuery>
|
||||
#include <QVBoxLayout>
|
||||
#include "Code/QRDUtils.h"
|
||||
#include "Windows/Dialogs/AnalyticsConfirmDialog.h"
|
||||
#include "Windows/Dialogs/AnalyticsPromptDialog.h"
|
||||
#include "QRDInterface.h"
|
||||
|
||||
#if RENDERDOC_ANALYTICS_ENABLE
|
||||
|
||||
template <>
|
||||
inline const char *TypeName<QString>()
|
||||
{
|
||||
return "string";
|
||||
}
|
||||
|
||||
template <>
|
||||
inline const char *TypeName<QStringList>()
|
||||
{
|
||||
return "string array";
|
||||
}
|
||||
|
||||
template <>
|
||||
inline const char *TypeName<bool>()
|
||||
{
|
||||
return "bool";
|
||||
}
|
||||
|
||||
template <>
|
||||
inline const char *TypeName<AnalyticsAverage>()
|
||||
{
|
||||
return "Average";
|
||||
}
|
||||
|
||||
template <>
|
||||
inline const char *TypeName<bool[32]>()
|
||||
{
|
||||
// DaysUsed
|
||||
return "int";
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
enum class AnalyticsState
|
||||
@@ -46,6 +82,7 @@ enum class AnalyticsSerialiseType
|
||||
Loading,
|
||||
Saving,
|
||||
Reporting,
|
||||
Documenting,
|
||||
};
|
||||
|
||||
static AnalyticsState analyticsState = AnalyticsState::Nothing;
|
||||
@@ -139,17 +176,139 @@ void saveTo(QVariantMap &parent, const QString &name, const T &el, bool reportin
|
||||
parent[name] = analyticsToVar<T>(el, reporting);
|
||||
}
|
||||
|
||||
// add a macro to either load or save, depending on our state.
|
||||
#define ANALYTIC_SERIALISE(varname) \
|
||||
if(type == AnalyticsSerialiseType::Loading) \
|
||||
{ \
|
||||
loadFrom(values, lit(#varname), Analytics::db->varname); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
saveTo(values, lit(#varname), Analytics::db->varname, reporting); \
|
||||
// add a macro to either document, load, or save, depending on our state.
|
||||
#define ANALYTIC_SERIALISE(varname) \
|
||||
if(type == AnalyticsSerialiseType::Documenting) \
|
||||
{ \
|
||||
QString var = lit(#varname); \
|
||||
int idx = var.indexOf(QLatin1Char('.')); \
|
||||
if(idx >= 0) \
|
||||
var = var.mid(idx + 1); \
|
||||
doc += lit("<b>%1 (%2)</b>: %3<br>") \
|
||||
.arg(var) \
|
||||
.arg(QString::fromUtf8(TypeName<decltype(Analytics::db->varname)>())) \
|
||||
.arg(docs.varname); \
|
||||
} \
|
||||
else if(type == AnalyticsSerialiseType::Loading) \
|
||||
{ \
|
||||
loadFrom(values, lit(#varname), Analytics::db->varname); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
saveTo(values, lit(#varname), Analytics::db->varname, reporting); \
|
||||
}
|
||||
|
||||
// only used during documenting
|
||||
#define ANALYTIC_SECTION(section) \
|
||||
if(type == AnalyticsSerialiseType::Documenting) \
|
||||
{ \
|
||||
doc += lit("<h2>%1</h2>").arg(docs.section_##section); \
|
||||
}
|
||||
|
||||
// macros for documenting the analytic values
|
||||
#define DOCUMENT_ANALYTIC(name, docs) QString name = lit(docs);
|
||||
|
||||
#define DOCUMENT_ANALYTIC_SECTION(name, docs) \
|
||||
name; \
|
||||
QString section_##name = lit(docs);
|
||||
|
||||
// must match the properties in Analytics
|
||||
static struct AnalyticsDocumentation
|
||||
{
|
||||
struct
|
||||
{
|
||||
DOCUMENT_ANALYTIC(Year, "The year this data was recorded in.");
|
||||
DOCUMENT_ANALYTIC(Month, "The month this data was recorded in.");
|
||||
} DOCUMENT_ANALYTIC_SECTION(Date, "Date range");
|
||||
|
||||
DOCUMENT_ANALYTIC(Version, "The version number of the analytics data.");
|
||||
|
||||
struct
|
||||
{
|
||||
DOCUMENT_ANALYTIC(RenderDocVersion, "The RenderDoc build version used to submit the report.");
|
||||
DOCUMENT_ANALYTIC(DistributionVersion, "The distribution version, if this is a linux build.");
|
||||
DOCUMENT_ANALYTIC(OSVersion, "OS version as reported by Qt.");
|
||||
DOCUMENT_ANALYTIC(Bitness, "Whether the build is 64-bit or 32-bit.");
|
||||
DOCUMENT_ANALYTIC(DevelBuildRun,
|
||||
"Has a local or nightly or otherwise unofficial build been run?");
|
||||
DOCUMENT_ANALYTIC(OfficialBuildRun, "Has an officially produced binary build been run?");
|
||||
DOCUMENT_ANALYTIC(DaysUsed, "How many unique days in this month was the program run?");
|
||||
} DOCUMENT_ANALYTIC_SECTION(Metadata, "Metadata");
|
||||
|
||||
struct
|
||||
{
|
||||
DOCUMENT_ANALYTIC(LoadTime, "How long (on average) did captures take to load?");
|
||||
} DOCUMENT_ANALYTIC_SECTION(Performance, "Performance");
|
||||
|
||||
DOCUMENT_ANALYTIC(APIs, "A list of the distinct APIs that were replayed.");
|
||||
|
||||
DOCUMENT_ANALYTIC(GPUVendors, "A list of the distinct GPU vendors used for replay.");
|
||||
|
||||
struct
|
||||
{
|
||||
DOCUMENT_ANALYTIC(Bookmarks, "Did the user set any event bookmarks?");
|
||||
DOCUMENT_ANALYTIC(ResourceInspect, "Did the user use the resource inspector?");
|
||||
DOCUMENT_ANALYTIC(ShaderEditing, "Did the user edit a shader (any API)?");
|
||||
DOCUMENT_ANALYTIC(CallstackResolve, "Did the user capture and resolve CPU callstacks?");
|
||||
DOCUMENT_ANALYTIC(PixelHistory, "Did the user run a pixel history?");
|
||||
DOCUMENT_ANALYTIC(DrawcallTimes, "Did the user fetch drawcall timings/durations?");
|
||||
DOCUMENT_ANALYTIC(PerformanceCounters, "Did the user fetch advanced performance counters?");
|
||||
DOCUMENT_ANALYTIC(PythonInterop, "Did the user run any python scripts or commands?");
|
||||
DOCUMENT_ANALYTIC(CustomTextureVisualise,
|
||||
"Did the user use a custom texture visualisation shader?");
|
||||
DOCUMENT_ANALYTIC(ImageViewer,
|
||||
"Did the user employ RenderDoc as an image (DDS/PNG/HDR) viewer?");
|
||||
DOCUMENT_ANALYTIC(CaptureComments,
|
||||
"Did the user make and save any comments in a capture file?");
|
||||
DOCUMENT_ANALYTIC(AndroidRemoteReplay, "Did the user use Android remote replay functionality?");
|
||||
DOCUMENT_ANALYTIC(NonAndroidRemoteReplay, "Did the user use remote replay on non-Android?");
|
||||
} DOCUMENT_ANALYTIC_SECTION(UIFeatures, "UI Features");
|
||||
|
||||
struct
|
||||
{
|
||||
DOCUMENT_ANALYTIC(EventBrowser, "Did the user ever export drawcalls from the event browser?");
|
||||
DOCUMENT_ANALYTIC(PipelineState, "Did the user ever export the pipeline state (any API)?");
|
||||
DOCUMENT_ANALYTIC(MeshOutput, "Did the user ever export mesh data (inputs or outputs)?");
|
||||
DOCUMENT_ANALYTIC(RawBuffer, "Did the user ever export raw buffer data?");
|
||||
DOCUMENT_ANALYTIC(Texture, "Did the user ever export a texture?");
|
||||
DOCUMENT_ANALYTIC(Shader, "Did the user ever export a shader?");
|
||||
} DOCUMENT_ANALYTIC_SECTION(Export, "Data Export");
|
||||
|
||||
struct
|
||||
{
|
||||
DOCUMENT_ANALYTIC(Vertex, "Did the user ever debug a vertex shader?");
|
||||
DOCUMENT_ANALYTIC(Pixel, "Did the user ever debug a pixel shader?");
|
||||
DOCUMENT_ANALYTIC(Compute, "Did the user ever debug a compute shader?");
|
||||
} DOCUMENT_ANALYTIC_SECTION(ShaderDebug, "Shader Debugging");
|
||||
|
||||
struct
|
||||
{
|
||||
DOCUMENT_ANALYTIC(Drawcall, "Did the user use the Drawcall overlay?");
|
||||
DOCUMENT_ANALYTIC(Wireframe, "Did the user use the Wireframe overlay?");
|
||||
DOCUMENT_ANALYTIC(Depth, "Did the user use the Depth Test overlay?");
|
||||
DOCUMENT_ANALYTIC(Stencil, "Did the user use the Stencil Test overlay?");
|
||||
DOCUMENT_ANALYTIC(BackfaceCull, "Did the user use the Backface Culling overlay?");
|
||||
DOCUMENT_ANALYTIC(ViewportScissor, "Did the user use the Viewport/Scissor overlay?");
|
||||
DOCUMENT_ANALYTIC(NaN, "Did the user use the NaN/Inf/-ve overlay?");
|
||||
DOCUMENT_ANALYTIC(Clipping, "Did the user use the Histogram Clipping overlay?");
|
||||
DOCUMENT_ANALYTIC(ClearBeforePass, "Did the user use the Clear Before Pass overlay?");
|
||||
DOCUMENT_ANALYTIC(ClearBeforeDraw, "Did the user use the Clear Before Draw overlay?");
|
||||
DOCUMENT_ANALYTIC(QuadOverdrawPass, "Did the user use the Quad Overdraw (Pass) overlay?");
|
||||
DOCUMENT_ANALYTIC(QuadOverdrawDraw, "Did the user use the Quad Overdraw (Draw) overlay?");
|
||||
DOCUMENT_ANALYTIC(TriangleSizePass, "Did the user use the Triangle Size (Pass) overlay?");
|
||||
DOCUMENT_ANALYTIC(TriangleSizeDraw, "Did the user use the Triangle Size (Draw) overlay?");
|
||||
} DOCUMENT_ANALYTIC_SECTION(TextureOverlays, "Texture Overlays");
|
||||
|
||||
struct
|
||||
{
|
||||
DOCUMENT_ANALYTIC(ShaderLinkage, "Did any capture use 'shader linkage' functionality?");
|
||||
DOCUMENT_ANALYTIC(YUVTextures, "Did any capture use YUV/composite textures?");
|
||||
DOCUMENT_ANALYTIC(SparseResources, "Did any capture use sparse aka tiled resources?");
|
||||
DOCUMENT_ANALYTIC(MultiGPU, "Did any capture make use of multiple GPUs?");
|
||||
DOCUMENT_ANALYTIC(D3D12Bundle, "Did any D3D12 capture use bundles?");
|
||||
} DOCUMENT_ANALYTIC_SECTION(CaptureFeatures, "Capture API Usage");
|
||||
} docs;
|
||||
|
||||
void AnalyticsSerialise(QVariantMap &values, AnalyticsSerialiseType type)
|
||||
{
|
||||
bool reporting = type == AnalyticsSerialiseType::Reporting;
|
||||
@@ -159,14 +318,19 @@ void AnalyticsSerialise(QVariantMap &values, AnalyticsSerialiseType type)
|
||||
|
||||
static_assert(sizeof(Analytics) == 147, "Sizeof Analytics has changed - update serialisation.");
|
||||
|
||||
// Date
|
||||
QString doc;
|
||||
|
||||
doc += lit("<h1>Report Explained</h1>");
|
||||
|
||||
ANALYTIC_SERIALISE(Version);
|
||||
|
||||
ANALYTIC_SECTION(Date);
|
||||
{
|
||||
ANALYTIC_SERIALISE(Date.Year);
|
||||
ANALYTIC_SERIALISE(Date.Month);
|
||||
}
|
||||
ANALYTIC_SERIALISE(Version);
|
||||
|
||||
// Metadata
|
||||
ANALYTIC_SECTION(Metadata);
|
||||
{
|
||||
ANALYTIC_SERIALISE(Metadata.RenderDocVersion);
|
||||
ANALYTIC_SERIALISE(Metadata.DistributionVersion);
|
||||
@@ -190,15 +354,17 @@ void AnalyticsSerialise(QVariantMap &values, AnalyticsSerialiseType type)
|
||||
}
|
||||
}
|
||||
|
||||
// Performance
|
||||
ANALYTIC_SECTION(Performance);
|
||||
{
|
||||
ANALYTIC_SERIALISE(Performance.LoadTime);
|
||||
}
|
||||
|
||||
doc += lit("<h2>API/GPU Usage</h2>");
|
||||
|
||||
ANALYTIC_SERIALISE(APIs);
|
||||
ANALYTIC_SERIALISE(GPUVendors);
|
||||
|
||||
// UIFeatures
|
||||
ANALYTIC_SECTION(UIFeatures);
|
||||
{
|
||||
ANALYTIC_SERIALISE(UIFeatures.Bookmarks);
|
||||
ANALYTIC_SERIALISE(UIFeatures.ResourceInspect);
|
||||
@@ -215,7 +381,7 @@ void AnalyticsSerialise(QVariantMap &values, AnalyticsSerialiseType type)
|
||||
ANALYTIC_SERIALISE(UIFeatures.NonAndroidRemoteReplay);
|
||||
}
|
||||
|
||||
// Export
|
||||
ANALYTIC_SECTION(Export);
|
||||
{
|
||||
ANALYTIC_SERIALISE(Export.EventBrowser);
|
||||
ANALYTIC_SERIALISE(Export.PipelineState);
|
||||
@@ -225,14 +391,14 @@ void AnalyticsSerialise(QVariantMap &values, AnalyticsSerialiseType type)
|
||||
ANALYTIC_SERIALISE(Export.Shader);
|
||||
}
|
||||
|
||||
// ShaderDebug
|
||||
ANALYTIC_SECTION(ShaderDebug);
|
||||
{
|
||||
ANALYTIC_SERIALISE(ShaderDebug.Vertex);
|
||||
ANALYTIC_SERIALISE(ShaderDebug.Pixel);
|
||||
ANALYTIC_SERIALISE(ShaderDebug.Compute);
|
||||
}
|
||||
|
||||
// TextureOverlays
|
||||
ANALYTIC_SECTION(TextureOverlays);
|
||||
{
|
||||
ANALYTIC_SERIALISE(TextureOverlays.Drawcall);
|
||||
ANALYTIC_SERIALISE(TextureOverlays.Wireframe);
|
||||
@@ -250,7 +416,7 @@ void AnalyticsSerialise(QVariantMap &values, AnalyticsSerialiseType type)
|
||||
ANALYTIC_SERIALISE(TextureOverlays.TriangleSizeDraw);
|
||||
}
|
||||
|
||||
// CaptureFeatures
|
||||
ANALYTIC_SECTION(CaptureFeatures);
|
||||
{
|
||||
ANALYTIC_SERIALISE(CaptureFeatures.ShaderLinkage);
|
||||
ANALYTIC_SERIALISE(CaptureFeatures.YUVTextures);
|
||||
@@ -258,6 +424,8 @@ void AnalyticsSerialise(QVariantMap &values, AnalyticsSerialiseType type)
|
||||
ANALYTIC_SERIALISE(CaptureFeatures.MultiGPU);
|
||||
ANALYTIC_SERIALISE(CaptureFeatures.D3D12Bundle);
|
||||
}
|
||||
|
||||
values[lit("doc")] = doc;
|
||||
}
|
||||
|
||||
}; // anonymous namespace
|
||||
@@ -321,6 +489,38 @@ void Analytics::Load()
|
||||
}
|
||||
}
|
||||
|
||||
void Analytics::DocumentReport()
|
||||
{
|
||||
QVariantMap dummy;
|
||||
AnalyticsSerialise(dummy, AnalyticsSerialiseType::Documenting);
|
||||
QString reportText = dummy[lit("doc")].toString();
|
||||
|
||||
{
|
||||
QDialog dialog;
|
||||
dialog.setWindowTitle(lit("Sample Analytics Report"));
|
||||
dialog.setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||||
dialog.setFixedSize(600, 500);
|
||||
|
||||
QDialogButtonBox buttons;
|
||||
buttons.addButton(QDialogButtonBox::Ok);
|
||||
QObject::connect(&buttons, &QDialogButtonBox::accepted, &dialog, &QDialog::accept);
|
||||
|
||||
QTextEdit report;
|
||||
report.setReadOnly(true);
|
||||
report.setAcceptRichText(true);
|
||||
report.setText(reportText);
|
||||
|
||||
QVBoxLayout layout;
|
||||
|
||||
layout.addWidget(&report);
|
||||
layout.addWidget(&buttons);
|
||||
|
||||
dialog.setLayout(&layout);
|
||||
|
||||
RDDialog::show(&dialog);
|
||||
}
|
||||
}
|
||||
|
||||
void Analytics::Prompt(ICaptureContext &ctx, PersistantConfig &config)
|
||||
{
|
||||
if(analyticsState == AnalyticsState::PromptFirstTime)
|
||||
@@ -389,6 +589,10 @@ void Load()
|
||||
void Prompt(ICaptureContext &ctx, PersistantConfig &config)
|
||||
{
|
||||
}
|
||||
|
||||
void DocumentReport()
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -81,7 +81,11 @@ struct AnalyticsAverage
|
||||
QVariant toVariant(bool reporting) const
|
||||
{
|
||||
if(reporting)
|
||||
{
|
||||
if(Count == 0)
|
||||
return 0.0;
|
||||
return Total / double(Count);
|
||||
}
|
||||
|
||||
QVariantMap ret;
|
||||
ret[lit("Total")] = Total;
|
||||
@@ -102,7 +106,8 @@ struct ICaptureContext;
|
||||
#endif
|
||||
|
||||
// we declare the analystics data struct here, this contains the information we're storing
|
||||
// If you add anything to this struct, make sure to update AnalyticsSerialise.
|
||||
// If you add anything to this struct, make sure to update AnalyticsSerialise, and
|
||||
// AnalyticsDocumentation.
|
||||
struct Analytics
|
||||
{
|
||||
// utility function - loads the analytics from disk and initialise the Analytics::db member.
|
||||
@@ -114,6 +119,9 @@ struct Analytics
|
||||
// opted-out from.
|
||||
static Analytics *db;
|
||||
|
||||
// utility function - displays an annotated report documenting what each member means
|
||||
static void DocumentReport();
|
||||
|
||||
// Function to save the analytics to disk, if it's been initialised. Every set macro below will
|
||||
// call this after the data is set to flush it to disk.
|
||||
void Save();
|
||||
@@ -301,6 +309,7 @@ namespace Analytics
|
||||
{
|
||||
void Load();
|
||||
void Prompt(ICaptureContext &ctx, PersistantConfig &config);
|
||||
void DocumentReport();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
******************************************************************************/
|
||||
|
||||
#include "AnalyticsConfirmDialog.h"
|
||||
#include <QDesktopServices>
|
||||
#include <QFontDatabase>
|
||||
#include <QPushButton>
|
||||
#include "ui_AnalyticsConfirmDialog.h"
|
||||
@@ -43,3 +44,15 @@ AnalyticsConfirmDialog::~AnalyticsConfirmDialog()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void AnalyticsConfirmDialog::on_label_linkActivated(const QString &link)
|
||||
{
|
||||
if(link == lit("#documentreport"))
|
||||
{
|
||||
Analytics::DocumentReport();
|
||||
}
|
||||
else
|
||||
{
|
||||
QDesktopServices::openUrl(QUrl(link));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,6 +39,10 @@ public:
|
||||
explicit AnalyticsConfirmDialog(QString report, QWidget *parent = 0);
|
||||
~AnalyticsConfirmDialog();
|
||||
|
||||
private slots:
|
||||
// automatic slots
|
||||
void on_label_linkActivated(const QString &link);
|
||||
|
||||
private:
|
||||
Ui::AnalyticsConfirmDialog *ui;
|
||||
};
|
||||
|
||||
@@ -26,14 +26,11 @@
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string><html><head/><body><p align="center"><span style=" font-size:18pt; font-weight:600;">Analytics Report Ready</span></p><p><br/>RenderDoc has gathered analytics from your usage over the past month. This is now ready to send to the server for processing.</p><p>As requested, the full report is listed below where you can check the data and ensure you are happy with what's being sent.</p><p>When ready, click OK to send the report. Clicking Discard will throw away this report and begin again for next month.</p><p>If you want, you can manually copy-paste this report and send it through here: <a href="https://renderdoc.org/analytics"><span style=" text-decoration: underline; color:#0000ff;">https://renderdoc.org/analytics</span></a>.</p></body></html></string>
|
||||
<string><html><head/><body><p align="center"><span style=" font-size:18pt; font-weight:600;">Analytics Report Ready</span></p><p><br/>RenderDoc has gathered analytics from your usage over the past month. This is now ready to send to the server for processing.</p><p>As requested, the full report is listed below where you can check the data and ensure you are happy with what's being sent.</p><p>When ready, click OK to send the report. Clicking Discard will throw away this report and begin again for next month. <a href="#documentreport"><span style=" text-decoration: underline; color:#0000ff;">Click here</span></a> to see an explanation of the report properties.</p><p>If you want, you can manually copy-paste this report and send it through here: <a href="https://renderdoc.org/analytics"><span style=" text-decoration: underline; color:#0000ff;">https://renderdoc.org/analytics</span></a>.</p></body></html></string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="openExternalLinks">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
******************************************************************************/
|
||||
|
||||
#include "AnalyticsPromptDialog.h"
|
||||
#include <QDesktopServices>
|
||||
#include "Code/Interface/QRDInterface.h"
|
||||
#include "ui_AnalyticsPromptDialog.h"
|
||||
|
||||
@@ -63,3 +64,15 @@ void AnalyticsPromptDialog::on_optOut_toggled(bool checked)
|
||||
m_Config.Analytics_TotalOptOut = true;
|
||||
}
|
||||
}
|
||||
|
||||
void AnalyticsPromptDialog::on_label_linkActivated(const QString &link)
|
||||
{
|
||||
if(link == lit("#documentreport"))
|
||||
{
|
||||
Analytics::DocumentReport();
|
||||
}
|
||||
else
|
||||
{
|
||||
QDesktopServices::openUrl(QUrl(link));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,7 @@ private slots:
|
||||
void on_autoSubmit_toggled(bool checked);
|
||||
void on_manualCheck_toggled(bool checked);
|
||||
void on_optOut_toggled(bool checked);
|
||||
void on_label_linkActivated(const QString &link);
|
||||
|
||||
private:
|
||||
Ui::AnalyticsPromptDialog *ui;
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>498</width>
|
||||
<height>554</height>
|
||||
<width>492</width>
|
||||
<height>439</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -20,14 +20,11 @@
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string><html><head/><body><p align="center"><span style=" font-size:18pt; font-weight:600;">Anonymous Analytics</span></p><p><br/>RenderDoc now has some very minimal analytics gathering in the UI, to help learn how RenderDoc is used and inform its future development. Here you can choose how to use it - if you have no problems with this, click OK to continue and you won't be prompted again.</p><p>The data gathered is <span style=" font-weight:600; text-decoration: underline;">not personally identifiable</span> and contains <span style=" font-weight:600; text-decoration: underline;">absolutely no data from captures</span>. It will store for example which API is captured, and what features in the UI are used. The source is freely available and auditable.</p><p>Analytics gathering only happens in the UI itself, no analytics code runs at capture time so there is no risk of leaking information from the target program.</p><p>Each month an anonymous report is generated and sent to securely the RenderDoc server. The aggregated statistics are visible publicly.</p><p>By default this happens behind the scenes and no user interaction is required. If you want, you can choose to manually approve each report before it's sent. That way you can see what information is stored.</p><p>If you wish, you can opt-out entirely and no statistics will be gathered or reported. However please consider this carefully as it will reduce the accuracy of the statistics and make it harder for me to reason about what features and work on RenderDoc to prioritise.</p><p>For more information (and to see what statistics are gathered) go to <a href="https://renderdoc.org/analytics"><span style=" text-decoration: underline; color:#0000ff;">https://renderdoc.org/analytics</span></a>.</p><p>Thanks!<br/>Baldur Karlsson</p></body></html></string>
|
||||
<string><html><head/><body><p align="center"><span style=" font-size:18pt; font-weight:600;">Anonymous Analytics</span></p><p><br/>RenderDoc has some very minimal analytics gathering. The data is gathered only in the UI and <span style=" font-weight:600; text-decoration: underline;">not during capture</span>. It is <span style=" font-weight:600; text-decoration: underline;">not personally identifiable</span> and contains <span style=" font-weight:600; text-decoration: underline;">absolutely no data from captures</span>. <a href="https://github.com/baldurk/renderdoc/blob/v1.x/qrenderdoc/Code/Interface/Analytics.h"><span style=" text-decoration: underline; color:#0000ff;">The source</span></a> is freely available and auditable.</p><p>A report is generated monthly and sent to securely RenderDoc's server. If you want, you can choose to manually approve each report before it's sent.</p><p>If you wish to opt-out entirely then no statistics will be gathered or reported. However please consider this carefully as it will make it harder for me to decide which features to prioritise.</p><p>To see a complete list of what data is gathered, <a href="#documentreport"><span style=" text-decoration: underline; color:#0000ff;">click here</span></a>.</p><p>For more information go to <a href="https://renderdoc.org/analytics"><span style=" text-decoration: underline; color:#0000ff;">https://renderdoc.org/analytics</span></a>.</p><p>Thanks!<br/>Baldur Karlsson (RenderDoc author)</p></body></html></string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="openExternalLinks">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
|
||||
Reference in New Issue
Block a user