Merge pull request 'diag(P4): Gezeichnete Fläche messen, direktes Zeichnen zurücknehmen (1.9.1)' (#70) from diag/gezeichnete-flaeche-messen into main
This commit was merged in pull request #70.
This commit is contained in:
@@ -1,3 +1,15 @@
|
|||||||
|
Version 1.9.1:
|
||||||
|
- Das direkte Zeichnen in den Bildspeicher aus 1.9.0 ist zurückgenommen: Es hat die
|
||||||
|
Bildaufbauzeit nicht verkürzt (weiterhin 240 bis 300 ms) und stattdessen Bildfehler
|
||||||
|
erzeugt, weil in denselben Speicher gezeichnet wird, aus dem gerade angezeigt wird.
|
||||||
|
Damit ist auch klar, dass der Flaschenhals nicht im Kopieren liegt, sondern im Zeichnen
|
||||||
|
selbst. Der Schalter WS7_DIRECT_FB bleibt samt Begründung erhalten.
|
||||||
|
- Die Messung sagt jetzt zusätzlich, WIE VIEL neu gezeichnet wurde: Anzahl der Bereiche und
|
||||||
|
ihr Anteil an der Gesamtfläche. Erst damit lässt sich unterscheiden, ob LVGL nur kleine
|
||||||
|
Bereiche anfasst - dann ist das Zeichnen an sich zu langsam - oder ob jedes Mal der ganze
|
||||||
|
Bildschirm neu entsteht, weil ihn etwas unnötig ungültig macht. Das sind zwei völlig
|
||||||
|
verschiedene Ursachen mit verschiedenen Gegenmitteln.
|
||||||
|
|
||||||
Version 1.9.0:
|
Version 1.9.0:
|
||||||
- Die Messung aus 1.8.8 hat die Ursache der Trägheit gefunden: Jeder Bildaufbau kostete
|
- Die Messung aus 1.8.8 hat die Ursache der Trägheit gefunden: Jeder Bildaufbau kostete
|
||||||
240 bis 300 Millisekunden - dauerhaft, auch im Leerlauf. Fünf Sekunden für den
|
240 bis 300 Millisekunden - dauerhaft, auch im Leerlauf. Fünf Sekunden für den
|
||||||
|
|||||||
@@ -39,10 +39,12 @@
|
|||||||
// nicht - siehe die ausfuehrliche Begruendung weiter unten beim Avoid-Tear-Schalter.
|
// nicht - siehe die ausfuehrliche Begruendung weiter unten beim Avoid-Tear-Schalter.
|
||||||
// Auf 0 nur, wenn das Startverhalten erneut untersucht wird.
|
// Auf 0 nur, wenn das Startverhalten erneut untersucht wird.
|
||||||
#define WS7_SINGLE_FB 1
|
#define WS7_SINGLE_FB 1
|
||||||
// LVGL zeichnet direkt in den Bildspeicher, statt in einen eigenen Puffer zu zeichnen und
|
// LVGL zeichnet direkt in den Bildspeicher statt in einen eigenen Puffer, dessen Inhalt
|
||||||
// den danach zu kopieren. Spart pro Bild einen kompletten Durchgang durch 2,7 MB PSRAM
|
// danach kopiert wird. GEPRUEFT: bringt an diesem Panel nichts (die Bildaufbauzeit blieb bei
|
||||||
// und laesst LVGL nur die geaenderten Bereiche neu zeichnen. Braucht WS7_SINGLE_FB.
|
// 240-300 ms) und erzeugt Bildfehler, weil in denselben Speicher gezeichnet wird, aus dem
|
||||||
#define WS7_DIRECT_FB 1
|
// gerade angezeigt wird. Der Flaschenhals liegt also nicht im Kopieren, sondern im Zeichnen
|
||||||
|
// selbst. Bleibt als Schalter erhalten, damit der Versuch nicht erneut gemacht wird.
|
||||||
|
#define WS7_DIRECT_FB 0
|
||||||
#define WS7_PARALLEL_RENDER 1
|
#define WS7_PARALLEL_RENDER 1
|
||||||
|
|
||||||
#define EXAMPLE_LVGL_PORT_TASK_MAX_DELAY_MS 500 //range 2 to 2000
|
#define EXAMPLE_LVGL_PORT_TASK_MAX_DELAY_MS 500 //range 2 to 2000
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
#include "esp_system.h"
|
#include "esp_system.h"
|
||||||
#include "display_hal.h"
|
#include "display_hal.h"
|
||||||
#include "esp_rom_sys.h"
|
#include "esp_rom_sys.h"
|
||||||
|
#include "lvgl_private.h"
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------
|
||||||
// Schriftgroesse
|
// Schriftgroesse
|
||||||
@@ -3464,11 +3465,33 @@ static bool g_uiReady = false;
|
|||||||
|
|
||||||
static uint32_t g_refrStart = 0;
|
static uint32_t g_refrStart = 0;
|
||||||
|
|
||||||
static void refr_start_cb(lv_event_t*) { g_refrStart = lv_tick_get(); }
|
static uint32_t g_refrPixels = 0;
|
||||||
|
static uint32_t g_refrAreas = 0;
|
||||||
|
|
||||||
|
// Beim Start eines Zeichenzyklus festhalten, WIE VIEL neu gezeichnet wird. Erst damit laesst
|
||||||
|
// sich unterscheiden, ob LVGL nur kleine Bereiche anfasst - dann ist das Zeichnen an sich zu
|
||||||
|
// langsam - oder ob jedes Mal der ganze Bildschirm neu entsteht, weil ihn etwas unnoetig
|
||||||
|
// ungueltig macht.
|
||||||
|
static void refr_start_cb(lv_event_t*) {
|
||||||
|
g_refrStart = lv_tick_get();
|
||||||
|
g_refrPixels = 0;
|
||||||
|
g_refrAreas = 0;
|
||||||
|
lv_display_t* d = lv_display_get_default();
|
||||||
|
if (!d) return;
|
||||||
|
for (uint16_t i = 0; i < d->inv_p; i++) {
|
||||||
|
if (d->inv_area_joined[i]) continue;
|
||||||
|
const lv_area_t* a = &d->inv_areas[i];
|
||||||
|
g_refrPixels += (uint32_t)(a->x2 - a->x1 + 1) * (uint32_t)(a->y2 - a->y1 + 1);
|
||||||
|
g_refrAreas++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void refr_ready_cb(lv_event_t*) {
|
static void refr_ready_cb(lv_event_t*) {
|
||||||
uint32_t d = lv_tick_get() - g_refrStart;
|
uint32_t d = lv_tick_get() - g_refrStart;
|
||||||
if (d >= REFR_WARN_MS) esp_rom_printf("[UI] Bildaufbau %u ms\n", (unsigned)d);
|
if (d < REFR_WARN_MS) return;
|
||||||
|
unsigned pct = (unsigned)((uint64_t)g_refrPixels * 100ULL / ((uint64_t)LCD_H_RES * LCD_V_RES));
|
||||||
|
esp_rom_printf("[UI] Bildaufbau %u ms, %u Bereiche, %u %% der Flaeche\n",
|
||||||
|
(unsigned)d, (unsigned)g_refrAreas, pct);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void refr_monitor_install() {
|
static void refr_monitor_install() {
|
||||||
|
|||||||
Reference in New Issue
Block a user