@jjlmoya/utils-hardware 1.19.0 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +4 -1
  4. package/src/index.ts +1 -0
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/monitorGhostingTest/bibliography.astro +14 -0
  8. package/src/tool/monitorGhostingTest/bibliography.ts +20 -0
  9. package/src/tool/monitorGhostingTest/component.astro +156 -0
  10. package/src/tool/monitorGhostingTest/entry.ts +29 -0
  11. package/src/tool/monitorGhostingTest/i18n/de.ts +293 -0
  12. package/src/tool/monitorGhostingTest/i18n/en.ts +293 -0
  13. package/src/tool/monitorGhostingTest/i18n/es.ts +293 -0
  14. package/src/tool/monitorGhostingTest/i18n/fr.ts +293 -0
  15. package/src/tool/monitorGhostingTest/i18n/id.ts +293 -0
  16. package/src/tool/monitorGhostingTest/i18n/it.ts +293 -0
  17. package/src/tool/monitorGhostingTest/i18n/ja.ts +293 -0
  18. package/src/tool/monitorGhostingTest/i18n/ko.ts +293 -0
  19. package/src/tool/monitorGhostingTest/i18n/nl.ts +293 -0
  20. package/src/tool/monitorGhostingTest/i18n/pl.ts +293 -0
  21. package/src/tool/monitorGhostingTest/i18n/pt.ts +293 -0
  22. package/src/tool/monitorGhostingTest/i18n/ru.ts +293 -0
  23. package/src/tool/monitorGhostingTest/i18n/sv.ts +293 -0
  24. package/src/tool/monitorGhostingTest/i18n/tr.ts +293 -0
  25. package/src/tool/monitorGhostingTest/i18n/zh.ts +293 -0
  26. package/src/tool/monitorGhostingTest/index.ts +9 -0
  27. package/src/tool/monitorGhostingTest/logic.ts +195 -0
  28. package/src/tool/monitorGhostingTest/monitor-ghosting-test.css +546 -0
  29. package/src/tool/monitorGhostingTest/seo.astro +15 -0
  30. package/src/tool/monitorGhostingTest/ui.ts +30 -0
  31. package/src/tools.ts +2 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-hardware",
3
- "version": "1.19.0",
3
+ "version": "1.20.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -8,11 +8,12 @@ import { mouseDoubleClickTest } from '../tool/mouseDoubleClickTest/index';
8
8
  import { estimadorSaludBateria } from '../tool/batteryHealthEstimator/index';
9
9
  import { toneGenerator } from '../tool/toneGenerator/index';
10
10
  import { refreshRateDetector } from '../tool/refreshRateDetector/index';
11
+ import { monitorGhostingTest } from '../tool/monitorGhostingTest/index';
11
12
  import { spectrumCanvas } from '../tool/colorAccuracyTest/index';
12
13
 
13
14
  export const hardwareCategory: HardwareCategoryEntry = {
14
15
  icon: 'mdi:memory',
15
- tools: [pixelesPantalla, testTeclado, testMando, probadorVibracionMando, testRaton, mouseDoubleClickTest, estimadorSaludBateria, toneGenerator, refreshRateDetector, spectrumCanvas],
16
+ tools: [pixelesPantalla, testTeclado, testMando, probadorVibracionMando, testRaton, mouseDoubleClickTest, estimadorSaludBateria, toneGenerator, refreshRateDetector, monitorGhostingTest, spectrumCanvas],
16
17
  i18n: {
17
18
  en: () => import('./i18n/en').then((m) => m.content),
18
19
  es: () => import('./i18n/es').then((m) => m.content),
package/src/entries.ts CHANGED
@@ -16,6 +16,8 @@ export { toneGenerator } from './tool/toneGenerator/entry';
16
16
  export type { ToneGeneratorLocaleContent } from './tool/toneGenerator/entry';
17
17
  export { refreshRateDetector } from './tool/refreshRateDetector/entry';
18
18
  export type { RefreshRateDetectorLocaleContent } from './tool/refreshRateDetector/entry';
19
+ export { monitorGhostingTest } from './tool/monitorGhostingTest/entry';
20
+ export type { MonitorGhostingTestLocaleContent } from './tool/monitorGhostingTest/entry';
19
21
  export { spectrumCanvas } from './tool/colorAccuracyTest/entry';
20
22
  export type { SpectrumCanvasLocaleContent } from './tool/colorAccuracyTest/entry';
21
23
  export { hardwareCategory } from './category';
@@ -28,5 +30,6 @@ import { testRaton } from './tool/mousePollingTest/entry';
28
30
  import { mouseDoubleClickTest } from './tool/mouseDoubleClickTest/entry';
29
31
  import { toneGenerator } from './tool/toneGenerator/entry';
30
32
  import { refreshRateDetector } from './tool/refreshRateDetector/entry';
33
+ import { monitorGhostingTest } from './tool/monitorGhostingTest/entry';
31
34
  import { spectrumCanvas } from './tool/colorAccuracyTest/entry';
32
- export const ALL_ENTRIES = [estimadorSaludBateria, pixelesPantalla, testMando, probadorVibracionMando, testTeclado, testRaton, mouseDoubleClickTest, toneGenerator, refreshRateDetector, spectrumCanvas];
35
+ export const ALL_ENTRIES = [estimadorSaludBateria, pixelesPantalla, testMando, probadorVibracionMando, testTeclado, testRaton, mouseDoubleClickTest, toneGenerator, refreshRateDetector, monitorGhostingTest, spectrumCanvas];
package/src/index.ts CHANGED
@@ -26,4 +26,5 @@ export { MOUSE_DOUBLE_CLICK_TEST_TOOL } from './tool/mouseDoubleClickTest/index'
26
26
  export { ESTIMADOR_SALUD_BATERIA_TOOL } from './tool/batteryHealthEstimator/index';
27
27
  export { TONE_GENERATOR_TOOL } from './tool/toneGenerator/index';
28
28
  export { REFRESH_RATE_DETECTOR_TOOL } from './tool/refreshRateDetector/index';
29
+ export { MONITOR_GHOSTING_TEST_TOOL } from './tool/monitorGhostingTest/index';
29
30
  export { SPECTRUM_CANVAS_TOOL } from './tool/colorAccuracyTest/index';
@@ -21,8 +21,8 @@ describe('Locale Completeness Validation', () => {
21
21
  });
22
22
  });
23
23
 
24
- it('all 10 tools registered', () => {
25
- expect(ALL_TOOLS.length).toBe(10);
24
+ it('all 11 tools registered', () => {
25
+ expect(ALL_TOOLS.length).toBe(11);
26
26
  });
27
27
  });
28
28
 
@@ -4,8 +4,8 @@ import { hardwareCategory } from '../data';
4
4
 
5
5
  describe('Tool Validation Suite', () => {
6
6
  describe('Library Registration', () => {
7
- it('should have 10 tools in ALL_TOOLS', () => {
8
- expect(ALL_TOOLS.length).toBe(10);
7
+ it('should have 11 tools in ALL_TOOLS', () => {
8
+ expect(ALL_TOOLS.length).toBe(11);
9
9
  });
10
10
 
11
11
  it('hardwareCategory should be defined', () => {
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { Bibliography as SharedBibliography } from '@jjlmoya/utils-shared';
3
+ import type { KnownLocale } from '../../types';
4
+ import { monitorGhostingTest } from './index';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const content = await monitorGhostingTest.i18n[locale]?.();
12
+ ---
13
+
14
+ {content && content.bibliography.length > 0 && <SharedBibliography links={content.bibliography} />}
@@ -0,0 +1,20 @@
1
+ import type { BibliographyEntry } from '../../../types';
2
+
3
+ export const bibliography: BibliographyEntry[] = [
4
+ {
5
+ name: 'Blur Busters UFO Motion Tests: visual tests for ghosting, pursuit tracking, and motion clarity',
6
+ url: 'https://www.testufo.com/',
7
+ },
8
+ {
9
+ name: 'RTINGS: monitor response time, overshoot, and motion handling methodology',
10
+ url: 'https://www.rtings.com/monitor/tests/motion/motion-blur-and-response-time',
11
+ },
12
+ {
13
+ name: 'TFTCentral: response time, overdrive, overshoot, and pursuit camera monitor testing',
14
+ url: 'https://tftcentral.co.uk/articles/response_time',
15
+ },
16
+ {
17
+ name: 'Blur Busters: G-SYNC 101 guide to frame pacing, VRR behavior, and display motion',
18
+ url: 'https://blurbusters.com/gsync/gsync101-input-lag-tests-and-settings/',
19
+ }
20
+ ];
@@ -0,0 +1,156 @@
1
+ ---
2
+ import type { KnownLocale } from '../../types';
3
+ import type { MonitorGhostingTestUI } from './ui';
4
+
5
+ interface Props {
6
+ locale?: KnownLocale;
7
+ ui?: Record<string, unknown>;
8
+ }
9
+
10
+ const { ui } = Astro.props;
11
+ const t = (ui ?? {}) as MonitorGhostingTestUI;
12
+ ---
13
+
14
+ <div id="mgt-root" class="mgt-root" data-config={JSON.stringify({
15
+ pixelsPerSecondUnit: t.pixelsPerSecondUnit,
16
+ pixelUnit: t.pixelUnit,
17
+ millisecondUnit: t.millisecondUnit,
18
+ fullscreen: t.fullscreen,
19
+ exitFullscreen: t.exitFullscreen,
20
+ pause: t.pause,
21
+ resume: t.resume,
22
+ })}>
23
+ <section class="mgt-card">
24
+ <div class="mgt-stage">
25
+ <div class="mgt-monitor" id="mgt-monitor">
26
+ <div class="mgt-screen">
27
+ <div class="mgt-ruler" aria-hidden="true"></div>
28
+ <div id="mgt-track" class="mgt-track">
29
+ <span class="mgt-ghost ghost-5"></span>
30
+ <span class="mgt-ghost ghost-4"></span>
31
+ <span class="mgt-ghost ghost-3"></span>
32
+ <span class="mgt-ghost ghost-2"></span>
33
+ <span class="mgt-ghost ghost-1"></span>
34
+ <span id="mgt-target-object" class="mgt-target-object">
35
+ <span class="mgt-bars" aria-hidden="true"></span>
36
+ <span class="mgt-word">{t.targetText}</span>
37
+ <span class="mgt-ufo" aria-hidden="true">
38
+ <span class="mgt-ufo-dome"></span>
39
+ <span class="mgt-ufo-body"></span>
40
+ <span class="mgt-ufo-light"></span>
41
+ </span>
42
+ </span>
43
+ </div>
44
+ <div class="mgt-pursuit" aria-hidden="true"></div>
45
+ <div class="mgt-screen-actions">
46
+ <button id="mgt-fullscreen" type="button">{t.fullscreen}</button>
47
+ <button id="mgt-pause" type="button">{t.pause}</button>
48
+ </div>
49
+ </div>
50
+ </div>
51
+
52
+ <div class="mgt-panel">
53
+ <div class="mgt-readout">
54
+ <span>{t.badge}</span>
55
+ <strong id="mgt-blur">--</strong>
56
+ <small>{t.estimatedBlur}</small>
57
+ </div>
58
+
59
+ <label class="mgt-control">
60
+ <span>{t.speedLabel}</span>
61
+ <b id="mgt-speed-value">--</b>
62
+ <input id="mgt-speed" type="range" min="240" max="1920" step="120" value="960" />
63
+ </label>
64
+
65
+ <label class="mgt-control">
66
+ <span>{t.trailLabel}</span>
67
+ <b id="mgt-trail-value">--</b>
68
+ <input id="mgt-trail" type="range" min="1" max="10" step="1" value="5" />
69
+ </label>
70
+
71
+ <label class="mgt-select">
72
+ <span>{t.backgroundLabel}</span>
73
+ <select id="mgt-background">
74
+ <option value="dark">{t.backgroundDark}</option>
75
+ <option value="light">{t.backgroundLight}</option>
76
+ <option value="grid">{t.backgroundGrid}</option>
77
+ </select>
78
+ </label>
79
+
80
+ <label class="mgt-select">
81
+ <span>{t.patternLabel}</span>
82
+ <select id="mgt-pattern">
83
+ <option value="bars">{t.patternBars}</option>
84
+ <option value="text">{t.patternText}</option>
85
+ <option value="ufo">{t.patternUfo}</option>
86
+ </select>
87
+ </label>
88
+
89
+ <label class="mgt-toggle">
90
+ <span>
91
+ <b>{t.pursuitLabel}</b>
92
+ <small>{t.pursuitOn} / {t.pursuitOff}</small>
93
+ </span>
94
+ <input id="mgt-pursuit" type="checkbox" checked />
95
+ </label>
96
+
97
+ <div class="mgt-metrics">
98
+ <div>
99
+ <span>{t.frameStep}</span>
100
+ <strong id="mgt-frame-step">--</strong>
101
+ </div>
102
+ <div>
103
+ <span>{t.persistence}</span>
104
+ <strong id="mgt-persistence">--</strong>
105
+ </div>
106
+ <div>
107
+ <span>{t.sampleCount}</span>
108
+ <strong id="mgt-sample-count">--</strong>
109
+ </div>
110
+ </div>
111
+
112
+ <p class="mgt-instructions">{t.instructions}</p>
113
+ <button id="mgt-reset" class="mgt-reset" type="button">{t.reset}</button>
114
+ </div>
115
+ </div>
116
+ </section>
117
+ </div>
118
+
119
+ <script>
120
+ import { MonitorGhostingLab } from './logic';
121
+
122
+ const root = document.getElementById('mgt-root');
123
+ const labels = JSON.parse(root?.dataset.config ?? '{}');
124
+
125
+ new MonitorGhostingLab(
126
+ {
127
+ root,
128
+ monitor: document.getElementById('mgt-monitor'),
129
+ track: document.getElementById('mgt-track'),
130
+ target: document.getElementById('mgt-target-object'),
131
+ speed: document.getElementById('mgt-speed') as HTMLInputElement | null,
132
+ trail: document.getElementById('mgt-trail') as HTMLInputElement | null,
133
+ background: document.getElementById('mgt-background') as HTMLSelectElement | null,
134
+ pattern: document.getElementById('mgt-pattern') as HTMLSelectElement | null,
135
+ pursuit: document.getElementById('mgt-pursuit') as HTMLInputElement | null,
136
+ fullscreen: document.getElementById('mgt-fullscreen'),
137
+ pause: document.getElementById('mgt-pause'),
138
+ reset: document.getElementById('mgt-reset'),
139
+ speedValue: document.getElementById('mgt-speed-value'),
140
+ trailValue: document.getElementById('mgt-trail-value'),
141
+ blur: document.getElementById('mgt-blur'),
142
+ frameStep: document.getElementById('mgt-frame-step'),
143
+ persistence: document.getElementById('mgt-persistence'),
144
+ sampleCount: document.getElementById('mgt-sample-count'),
145
+ },
146
+ {
147
+ pixelsPerSecondUnit: labels.pixelsPerSecondUnit,
148
+ pixelUnit: labels.pixelUnit,
149
+ millisecondUnit: labels.millisecondUnit,
150
+ fullscreen: labels.fullscreen,
151
+ exitFullscreen: labels.exitFullscreen,
152
+ pause: labels.pause,
153
+ resume: labels.resume,
154
+ },
155
+ );
156
+ </script>
@@ -0,0 +1,29 @@
1
+ import type { HardwareToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ import type { MonitorGhostingTestUI } from './ui';
4
+ export type MonitorGhostingTestLocaleContent = ToolLocaleContent<MonitorGhostingTestUI>;
5
+
6
+ export const monitorGhostingTest: HardwareToolEntry<MonitorGhostingTestUI> = {
7
+ id: 'monitor-ghosting-test',
8
+ icons: {
9
+ bg: 'mdi:monitor',
10
+ fg: 'mdi:motion-play',
11
+ },
12
+ i18n: {
13
+ de: () => import('./i18n/de').then((m) => m.content),
14
+ en: () => import('./i18n/en').then((m) => m.content),
15
+ es: () => import('./i18n/es').then((m) => m.content),
16
+ fr: () => import('./i18n/fr').then((m) => m.content),
17
+ id: () => import('./i18n/id').then((m) => m.content),
18
+ it: () => import('./i18n/it').then((m) => m.content),
19
+ ja: () => import('./i18n/ja').then((m) => m.content),
20
+ ko: () => import('./i18n/ko').then((m) => m.content),
21
+ nl: () => import('./i18n/nl').then((m) => m.content),
22
+ pl: () => import('./i18n/pl').then((m) => m.content),
23
+ pt: () => import('./i18n/pt').then((m) => m.content),
24
+ ru: () => import('./i18n/ru').then((m) => m.content),
25
+ sv: () => import('./i18n/sv').then((m) => m.content),
26
+ tr: () => import('./i18n/tr').then((m) => m.content),
27
+ zh: () => import('./i18n/zh').then((m) => m.content),
28
+ },
29
+ };
@@ -0,0 +1,293 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { MonitorGhostingTestUI } from '../ui';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ const slug = 'monitor-ghosting-test-deutsch';
7
+ const title = 'Monitor Ghosting Test';
8
+ const description =
9
+ 'Testen Sie Monitor-Ghosting, Bewegungsunschärfe, Overdrive-Nachzieheffekte und Pixel-Reaktionsverhalten mit bewegten Balken, Text und Vollbild-Bewegungsmustern.';
10
+
11
+ const faqData = [
12
+ {
13
+ question: 'Was ist Monitor-Ghosting?',
14
+ answer:
15
+ 'Monitor-Ghosting ist eine sichtbare Spur, die bewegten Objekten folgt, wenn Pixel nicht schnell genug übergehen können. Es tritt häufig bei langsamen LCD-Panels, schlecht eingestellten Overdrive-Modi und Displays auf, die unter ihrer optimalen Bildwiederholrate laufen.',
16
+ },
17
+ {
18
+ question: 'Kann dieser Test die genaue Reaktionszeit messen?',
19
+ answer:
20
+ 'Ein Browser-Test kann keine Laborgeräte wie eine Pursuit-Kamera oder Fotodiode ersetzen, aber er kann sichtbare Bewegungsartefakte aufdecken, Monitoreinstellungen vergleichen und Ihnen helfen, den klarsten Overdrive-Modus zu wählen.',
21
+ },
22
+ {
23
+ question: 'Warum erzeugt Overdrive manchmal helle Nachzieheffekte?',
24
+ answer:
25
+ 'Overdrive treibt Pixel stärker an, um Übergänge zu beschleunigen. Wenn er über den Zielfarbton hinausschiebt, sehen Sie möglicherweise inverses Ghosting: einen hellen oder farbigen Halo hinter bewegten Objekten.',
26
+ },
27
+ {
28
+ question: 'Sollte ich auf dunklem oder hellem Hintergrund testen?',
29
+ answer:
30
+ 'Beides. Einige Panels verschmieren Dunkel-zu-Grau-Übergänge mehr als Hell-zu-Dunkel-Übergänge, daher zeigt ein Wechsel des Hintergrunds Artefakte, die ein einzelnes Muster verbergen kann.',
31
+ },
32
+ ];
33
+
34
+ const howToData = [
35
+ {
36
+ name: 'Bewegungsgeschwindigkeit einstellen',
37
+ text: 'Beginnen Sie nahe der Standardgeschwindigkeit und erhöhen Sie sie, bis die Nachzieheffekte leicht zu prüfen sind, ohne das Objekt aus den Augen zu verlieren.',
38
+ },
39
+ {
40
+ name: 'Spurstärke ändern',
41
+ text: 'Verwenden Sie die Spursteuerung, um die Nachleuchtdauer beim Vergleich der Monitoreinstellungen besser sichtbar zu machen.',
42
+ },
43
+ {
44
+ name: 'Mehrere Hintergründe testen',
45
+ text: 'Wechseln Sie zwischen dunklen, hellen und Gitter-Hintergründen, um schwarze Verschmierungen, inverses Ghosting und Overdrive-Halos aufzudecken.',
46
+ },
47
+ {
48
+ name: 'Overdrive-Einstellungen vergleichen',
49
+ text: 'Öffnen Sie das Monitor-OSD und testen Sie die Modi Aus, Normal, Schnell und Extrem. Wählen Sie den Modus mit der klarsten Bewegung und dem geringsten Halo.',
50
+ },
51
+ ];
52
+
53
+ const faqSchema: WithContext<FAQPage> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'FAQPage',
56
+ mainEntity: faqData.map((item) => ({
57
+ '@type': 'Question',
58
+ name: item.question,
59
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
60
+ })),
61
+ };
62
+
63
+ const howToSchema: WithContext<HowTo> = {
64
+ '@context': 'https://schema.org',
65
+ '@type': 'HowTo',
66
+ name: title,
67
+ description,
68
+ step: howToData.map((step, i) => ({
69
+ '@type': 'HowToStep',
70
+ position: i + 1,
71
+ name: step.name,
72
+ text: step.text,
73
+ })),
74
+ };
75
+
76
+ const appSchema: WithContext<SoftwareApplication> = {
77
+ '@context': 'https://schema.org',
78
+ '@type': 'SoftwareApplication',
79
+ name: title,
80
+ description,
81
+ applicationCategory: 'UtilityApplication',
82
+ operatingSystem: 'All',
83
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
84
+ inLanguage: 'de',
85
+ };
86
+
87
+ export const content: ToolLocaleContent<MonitorGhostingTestUI> = {
88
+ slug,
89
+ title,
90
+ description,
91
+ faq: faqData,
92
+ howTo: howToData,
93
+ schemas: [faqSchema, howToSchema, appSchema],
94
+ bibliography,
95
+ seo: [
96
+ {
97
+ type: 'title',
98
+ text: 'Monitor Ghosting Test: Bewegungsunschärfe und Pixel-Reaktion prüfen',
99
+ level: 2,
100
+ },
101
+ {
102
+ type: 'paragraph',
103
+ html: 'Monitor-Ghosting tritt auf, wenn bewegte Objekte eine sichtbare Spur hinterlassen. Es kann Spiele verschmiert wirken lassen, scrollenden Text schwerer lesbar machen und einen Monitor mit hoher Bildwiederholrate schlechter aussehen lassen als erwartet. Dieser Monitor-Ghosting-Test bietet bewegte Balken, Text und kontrastreiche Muster, damit Sie Overdrive-Modi, Bildwiederholraten, Hintergründe und Bewegungsgeschwindigkeiten ohne Softwareinstallation vergleichen können.',
104
+ },
105
+ {
106
+ type: 'paragraph',
107
+ html: 'Der Test ist für die praktische Inspektion konzipiert. Er erhebt keinen Anspruch auf laborgenaue Grau-zu-Grau-Reaktionszeiten, hilft aber bei der Beantwortung der Frage, die die meisten Benutzer tatsächlich haben: <strong>welche Monitoreinstellung sieht auf diesem Display am klarsten aus?</strong>',
108
+ },
109
+ {
110
+ type: 'title',
111
+ text: 'Wie Ghosting aussieht',
112
+ level: 3,
113
+ },
114
+ {
115
+ type: 'list',
116
+ items: [
117
+ 'Ein dunkler Schatten, der dem bewegten Objekt folgt, oft als schwarze Verschmierung bezeichnet',
118
+ 'Ein blasser oder farbiger Halo hinter dem Objekt, oft durch übermäßigen Overdrive verursacht',
119
+ 'Eine lange durchscheinende Spur, die Kanten weich erscheinen lässt',
120
+ 'Mehrere schwache Kopien des Objekts, besonders bei Displays mit langsamer Pixel-Reaktion',
121
+ 'Ungleichmäßige Klarheit zwischen dunklen, hellen und Gitter-Hintergründen',
122
+ ],
123
+ },
124
+ {
125
+ type: 'title',
126
+ text: 'Ghosting, Bewegungsunschärfe und inverses Ghosting',
127
+ level: 3,
128
+ },
129
+ {
130
+ type: 'table',
131
+ headers: ['Artefakt', 'Was Sie sehen', 'Häufige Ursache'],
132
+ rows: [
133
+ ['Ghosting', 'Eine dunklere oder verblasste Kopie folgt dem Objekt', 'Pixel-Reaktion ist zu langsam für die Bewegungsgeschwindigkeit'],
134
+ ['Bewegungsunschärfe', 'Das ganze bewegte Objekt sieht weich aus', 'Sample-and-Hold-Unschärfe, niedrige Bildwiederholrate oder Augenverfolgungsunschärfe'],
135
+ ['Inverses Ghosting', 'Heller Halo oder farbige Überschwinger', 'Overdrive-Einstellung ist zu aggressiv'],
136
+ ['Schwarze Verschmierung', 'Dunkle Szenen hinterlassen starke Schatten', 'VA-Panel-Dunkelübergänge sind langsam'],
137
+ ['Stottern', 'Bewegung springt statt zu fließen', 'Frame-Pacing, niedrige FPS oder Browser-/Systemlast'],
138
+ ],
139
+ },
140
+ {
141
+ type: 'title',
142
+ text: 'Ein praktischer Diagnose-Workflow',
143
+ level: 3,
144
+ },
145
+ {
146
+ type: 'paragraph',
147
+ html: 'Beginnen Sie mit Ihrem Monitor in seiner nativen Auflösung und der höchsten stabilen Bildwiederholrate. Wenn Sie einen 144Hz-, 165Hz-, 240Hz- oder 360Hz-Monitor besitzen, bestätigen Sie, dass das Betriebssystem diesen Modus tatsächlich verwendet, bevor Sie die Bewegungsklarheit beurteilen. Öffnen Sie den Test im Vollbild, wählen Sie das Klarheitsbalken-Ziel und beobachten Sie die hintere Kante des bewegten Objekts. Die hintere Kante ist der Ort, an dem Geisterspuren, dunkle Verschmierungen und helle Overdrive-Halos am einfachsten zu vergleichen sind.',
148
+ },
149
+ {
150
+ type: 'list',
151
+ items: [
152
+ 'Verwenden Sie dunklen Hintergrund, um schwarze Verschmierungen und langsame Dunkelübergänge aufzudecken',
153
+ 'Verwenden Sie hellen Hintergrund, um farbige Overdrive-Halos aufzudecken',
154
+ 'Verwenden Sie Gitter-Hintergrund, um die Kantenklarheit anhand kontrastreicher Referenzlinien zu prüfen',
155
+ 'Verwenden Sie das Textziel, wenn Ihr echtes Problem verschwommenes Scrollen oder schwer lesbare Bewegung ist',
156
+ 'Verwenden Sie Vollbild, bevor Sie einen Monitor beurteilen, da Browser-Chrome und Skalierung von Bewegungsartefakten ablenken können',
157
+ 'Erhöhen Sie die Geschwindigkeit erst, nachdem Sie dem Objekt bequem folgen können',
158
+ 'Vergleichen Sie jeweils eine Monitoreinstellung, damit Sie wissen, was sich geändert hat',
159
+ ],
160
+ },
161
+ {
162
+ type: 'title',
163
+ text: 'Die beste Overdrive-Einstellung für Ihren Monitor wählen',
164
+ level: 3,
165
+ },
166
+ {
167
+ type: 'paragraph',
168
+ html: 'Die meisten Gaming-Monitore enthalten eine Overdrive-Einstellung namens Aus, Normal, Schnell, Schneller, Extrem, Reaktionszeit oder Trace Free. Die schnellste Option ist nicht immer die beste. Eine moderate Einstellung bietet oft das beste Gleichgewicht: weniger Unschärfe als Aus, aber weniger Halos als Extrem.',
169
+ },
170
+ {
171
+ type: 'table',
172
+ headers: ['Overdrive-Modus', 'Erwartetes Ergebnis', 'Empfehlung'],
173
+ rows: [
174
+ ['Aus', 'Geringste Überschwinger, aber mehr Unschärfe', 'Nützliche Baseline für Vergleiche'],
175
+ ['Normal', 'Moderate Unschärfereduzierung', 'Oft am besten für den täglichen Gebrauch'],
176
+ ['Schnell', 'Schärfere Bewegung mit gewissem Halo-Risiko', 'Gut, wenn die Spuren sauber bleiben'],
177
+ ['Extrem', 'Niedrigste Reaktionszeitangabe, höchstes Überschwinger-Risiko', 'Vermeiden, wenn helle inverse Spuren erscheinen'],
178
+ ['Adaptiv/Variabel', 'Verhalten ändert sich mit der Bildwiederholrate', 'Erneut im tatsächlich genutzten FPS-Bereich testen'],
179
+ ],
180
+ },
181
+ {
182
+ type: 'title',
183
+ text: 'Was zu ändern ist, wenn der Test schlecht aussieht',
184
+ level: 3,
185
+ },
186
+ {
187
+ type: 'table',
188
+ headers: ['Was Sie sehen', 'Wahrscheinliche Ursache', 'Was zu versuchen ist'],
189
+ rows: [
190
+ ['Lange dunkle Spur hinter dem Ziel', 'Langsame dunkle Pixel-Übergänge oder schwacher Overdrive', 'Versuchen Sie einen stärkeren Overdrive-Modus und testen Sie erneut auf dunklem und Gitter-Hintergrund'],
191
+ ['Heller Halo oder farbiger Umriss hinter dem Ziel', 'Overdrive-Überschwinger oder inverses Ghosting', 'Overdrive um eine Stufe reduzieren und bei Ihrer tatsächlichen Bildwiederholrate vergleichen'],
192
+ ['Bewegung sieht ruckartig statt verschwommen aus', 'Frame-Pacing, Browser-Last oder Abweichung der Bildwiederholrate', 'Schwere Apps schließen, Vollbild aktivieren, Bildwiederholrate des Betriebssystems bestätigen'],
193
+ ['Text wird beim Bewegen unlesbar', 'Sample-and-Hold-Unschärfe, niedrige Bildwiederholrate oder langsame Reaktion', 'Bildwiederholrate erhöhen, Textmuster testen, Overdrive-Modi vergleichen'],
194
+ ['Artefakte ändern sich bei FPS-Änderung', 'VRR oder adaptives Overdrive-Verhalten', 'Erneut im tatsächlich genutzten FPS-Bereich testen'],
195
+ ],
196
+ },
197
+ {
198
+ type: 'title',
199
+ text: 'Warum die Bildwiederholrate wichtig ist',
200
+ level: 3,
201
+ },
202
+ {
203
+ type: 'paragraph',
204
+ html: 'Höhere Bildwiederholraten verkürzen die Zeit, die jedes Bild sichtbar bleibt, was Bewegung klarer erscheinen lassen kann. Die Bildwiederholrate allein beseitigt jedoch kein Ghosting. Ein 240Hz-Monitor mit langsamen Pixel-Übergängen kann immer noch verschmieren, während ein gut eingestelltes 144Hz-Panel sauberer aussehen kann als ein schlecht eingestelltes schnelleres Panel.',
205
+ },
206
+ {
207
+ type: 'table',
208
+ headers: ['Bildwiederholrate', 'Bilddauer', 'Was zu erwarten ist'],
209
+ rows: [
210
+ ['60Hz', '16,7 ms', 'Sample-and-Hold-Unschärfe und langsamere Bewegung sind leicht zu erkennen'],
211
+ ['120Hz', '8,3 ms', 'Viel flüssiger, aber Pixel-Reaktion ist weiterhin wichtig'],
212
+ ['144Hz', '6,9 ms', 'Gängige Gaming-Basislinie für Bewegungsklarheit'],
213
+ ['240Hz', '4,2 ms', 'Sehr flüssig, wenn die Reaktionsabstimmung gut ist'],
214
+ ['360Hz', '2,8 ms', 'Anspruchsvoll: schlechte Overdrive-Abstimmung wird offensichtlich'],
215
+ ],
216
+ },
217
+ {
218
+ type: 'title',
219
+ text: 'VRR, Gaming und realitätsnahes Testen',
220
+ level: 3,
221
+ },
222
+ {
223
+ type: 'paragraph',
224
+ html: 'Variable Bildwiederholrate kann das Verhalten eines Monitors verändern, da einige Displays bei verschiedenen Bildwiederholraten unterschiedliche Overdrive-Abstimmungen verwenden. Wenn Ihr Problem nur in Spielen auftritt, testen Sie nicht nur bei der maximalen Desktop-Bildwiederholrate. Testen Sie erneut im FPS-Bereich, in dem Sie tatsächlich spielen, besonders um 60 FPS, 90 FPS, 120 FPS und jede von Ihnen verwendete FPS-Begrenzung.',
225
+ },
226
+ {
227
+ type: 'list',
228
+ items: [
229
+ 'Wenn Ghosting bei niedrigen FPS schlimmer ist, hat der Monitor möglicherweise eine schwache variable Overdrive-Abstimmung',
230
+ 'Wenn Halos nur bei hohen Bildwiederholraten erscheinen, ist der Overdrive-Modus möglicherweise zu aggressiv',
231
+ 'Wenn die Bewegung stottert, während die Spur kurz bleibt, ist das Problem wahrscheinlich Frame-Pacing statt Pixel-Reaktion',
232
+ 'Wenn Vollbild anders aussieht als der Fenstermodus, prüfen Sie Browser-Skalierung, Betriebssystem-Skalierung und Compositor-Verhalten',
233
+ ],
234
+ },
235
+ {
236
+ type: 'title',
237
+ text: 'Fehlerbehebung bei schlechten Ergebnissen',
238
+ level: 3,
239
+ },
240
+ {
241
+ type: 'list',
242
+ items: [
243
+ 'Bestätigen Sie, dass Ihr Display-Kabel die angestrebte Bildwiederholrate unterstützt',
244
+ 'Deaktivieren Sie Bewegungsglättung, Black Frame Insertion oder MPRT-Modi beim Vergleich des normalen Overdrive',
245
+ 'Testen Sie erneut nach dem Umschalten des Monitors auf seine native Auflösung',
246
+ 'Verwenden Sie Vollbild oder reduzieren Sie den Browser-Zoom, wenn die Bewegung inkonsistent erscheint',
247
+ 'Schließen Sie rechenintensive Hintergrund-Apps, wenn die Animation stottert',
248
+ 'Testen Sie dasselbe Muster nach dem Ändern der GPU-Systemsteuerungseinstellungen für die Bildwiederholrate',
249
+ 'Versuchen Sie ein anderes Kabel oder einen anderen Anschluss, wenn der Monitor seine angegebene Bildwiederholrate nicht erreicht',
250
+ 'Testen Sie erneut mit VRR ein und aus, wenn sich das Ghosting zwischen Desktop und Spielen ändert',
251
+ ],
252
+ },
253
+ {
254
+ type: 'title',
255
+ text: 'Grenzen eines Online-Ghosting-Tests',
256
+ level: 3,
257
+ },
258
+ {
259
+ type: 'paragraph',
260
+ html: 'Ein browserbasierter Ghosting-Test hängt von der Browser-Animationszeit, der GPU-Last, der Betriebssystem-Zusammensetzung und Ihrer Display-Konfiguration ab. Er eignet sich hervorragend für den visuellen Vergleich, aber exakte Reaktionszeitmessungen erfordern spezielle Ausrüstung wie Pursuit-Kameras, Fotodioden oder oszilloskopbasierte Methoden. Verwenden Sie diesen Test, um Einstellungen zu wählen und offensichtliche Artefakte zu erkennen, nicht um Herstellerangaben zu Reaktionszeiten zu zertifizieren.',
261
+ },
262
+ ],
263
+ ui: {
264
+ badge: 'Bewegungsklarheit',
265
+ speedLabel: 'Bewegungsgeschwindigkeit',
266
+ pixelsPerSecondUnit: 'px/s',
267
+ pixelUnit: 'px',
268
+ millisecondUnit: 'ms',
269
+ trailLabel: 'Spurstärke',
270
+ backgroundLabel: 'Hintergrund',
271
+ backgroundDark: 'Dunkel',
272
+ backgroundLight: 'Hell',
273
+ backgroundGrid: 'Gitter',
274
+ patternLabel: 'Testziel',
275
+ patternBars: 'Klarheitsbalken',
276
+ patternText: 'Textblock',
277
+ patternUfo: 'UFO',
278
+ pursuitLabel: 'Verfolgungsführung',
279
+ pursuitOn: 'An',
280
+ pursuitOff: 'Aus',
281
+ fullscreen: 'Vollbild',
282
+ exitFullscreen: 'Vollbild verlassen',
283
+ pause: 'Pause',
284
+ resume: 'Fortsetzen',
285
+ targetText: 'BEWEGUNG',
286
+ estimatedBlur: 'geschätzte Unschärfe',
287
+ frameStep: 'Bildschritt',
288
+ persistence: 'Nachleuchtdauer',
289
+ sampleCount: 'Spurproben',
290
+ instructions: 'Beobachten Sie die hintere Kante des bewegten Ziels, während Sie Geschwindigkeit, Spurstärke, Hintergrund, Vollbildmodus und Monitor-Overdrive-Einstellungen ändern.',
291
+ reset: 'Zurücksetzen',
292
+ },
293
+ };