Fixed layouting performance issues in UIRichText (layout invalidation trashing issues). Everything is highly commented given that none of these changes are obvious and it's very easy to break it.

Added tests to verify possible regression. And added a simple benchmark with some metrics to inspect layouting invalidation issues.
This commit is contained in:
Martín Lucas Golini
2026-06-06 15:54:54 -03:00
parent 9bc9b099ad
commit 68904b9656
8 changed files with 401 additions and 38 deletions
@@ -1,14 +1,59 @@
#include <eepp/ee.hpp>
#include <eepp/ui/uimarkdownview.hpp>
EE_MAIN_FUNC int main( int, char** ) {
#include <args/args.hxx>
#include <iostream>
EE_MAIN_FUNC int main( int argc, char* argv[] ) {
UIApplication app(
{ 1280, 720, "eepp - UIMarkdownView Example" }, {},
ContextSettings( false, ContextSettings::FrameRateLimitScreenRefreshRate, 4 ) );
app.getUI()->loadLayoutFromString( R"xml(
args::ArgumentParser parser( "eepp Markdown View Example" );
args::HelpFlag help( parser, "help", "Display this help menu", { 'h', "help" } );
args::Positional<std::string> uri( parser, "URI", "The local URI to load" );
args::ValueFlag<std::string> prefersColorScheme(
parser, "prefers-color-scheme",
"Set the preferred color scheme (\"light\", \"dark\" or \"system\")",
{ 'c', "prefers-color-scheme" } );
args::Flag benchmarkMode( parser, "benchmark-mode",
"Render as much as possible to measure the rendering performance.",
{ "benchmark-mode" } );
args::ValueFlag<Float> pixelDensityConf( parser, "pixel-density",
"Set default application pixel density",
{ 'd', "pixel-density" } );
try {
parser.ParseCLI( Sys::parseArguments( argc, argv ) );
} catch ( const args::Help& ) {
std::cout << parser;
return EXIT_SUCCESS;
} catch ( const args::ParseError& e ) {
std::cerr << e.what() << std::endl;
std::cerr << parser;
return EXIT_FAILURE;
} catch ( args::ValidationError& e ) {
std::cerr << e.what() << std::endl;
std::cerr << parser;
return EXIT_FAILURE;
}
auto ui = app.getUI();
ui->setColorSchemePreference(
!prefersColorScheme.Get().empty()
? ColorSchemePreferences::fromStringExt( prefersColorScheme.Get() )
: ColorSchemeExtPreference::Dark );
ui->loadLayoutFromString( R"xml(
<ScrollView layout_width="match_parent" layout_height="match_parent">
<MarkdownView id="markdown_view" layout_width="match_parent" layout_height="wrap_content" padding="16dp">
<MarkdownView id="markdown_view" layout_width="match_parent" layout_height="wrap_content" padding="16dp"></MarkdownView>
</ScrollView>
)xml" );
auto markdownView = ui->find<UIMarkdownView>( "markdown_view" );
if ( uri.Get().empty() ) {
markdownView->loadFromString( R"markdown(
# Markdown Header 1
## Markdown Header 2
### Markdown Header 3
@@ -35,11 +80,17 @@ void main() {
printf("Hello World");
}
```
</MarkdownView>
</ScrollView>
)xml" );
)markdown" );
} else if ( FileSystem::fileExists( uri.Get() ) ) {
std::string file( uri.Get() );
std::string data;
FileSystem::fileGet( file, data );
markdownView->loadFromString( data );
} else {
std::cout << "File not found\n";
auto markdownView = app.getUI()->find<UIMarkdownView>( "markdown_view" );
return EXIT_FAILURE;
}
app.getWindow()->getInput()->pushCallback( [markdownView]( InputEvent* event ) {
switch ( event->Type ) {
@@ -59,9 +110,9 @@ void main() {
}
} );
app.getUI()->on( Event::KeyUp, [&app]( const Event* event ) {
ui->on( Event::KeyUp, [ui]( const Event* event ) {
if ( event->asKeyEvent()->getKeyCode() == KEY_F11 ) {
UIWidgetInspector::create( app.getUI() );
UIWidgetInspector::create( ui );
}
} );