mirror of
https://github.com/Droid-Deck/DroidDeck.git
synced 2026-11-12 11:31:08 +00:00
Add measured render-path pacing comparisons
This commit is contained in:
1 parent
fc5a5d77d8
commit
ebf9fa3e82
11 files changed
+359
No files matched your search
@@ -0,0 +1,10 @@
|
||||
beb40eda246bc7c52cf9247658d31546e64649ffd89f27351f1e6de65f3eb3a9 apk-proof.json
|
||||
cd05a8fb7af2077939f901e13c6da999bacf170c1b409209346b4064193358d3 before-after.png
|
||||
fc50d2857301e224f55dc3f33c421088b49f570884069eeffeeb437a76f897b3 cpu-gpu-profile.png
|
||||
e767962bcb772f73274d7b56fe9c65a7d4a2eff1c37e9b9d9231d08d0ee7de24 final-main.png
|
||||
b78fb9209bfad586f6db7ea890f1c57ad4b3ca18fd583e57b7d6450e63eede37 functional-proof.json
|
||||
2872dbe1e2df58a4477de97c158f5058827e0562cd44df9f92da5437aa2da0f3 gpu-timing.json
|
||||
fd63c9d056fcb500fad85f7ea399f570326104a35ef2ba30f794e61eb51c8f1e helper-proof.json
|
||||
efd53910e9079d9cb1de2b3ae78e70227dc33651befc69ba3c01cb5cc244f3b6 measurements.csv
|
||||
d0b41c2d5046c7048d7377aa8a7b69e79b97f874f1042f6a65df621813c3a909 method.md
|
||||
f6ed88b4afcb1e4e6c7b068f771e0819e5f4f98a625aa94f0deb955cd2891c49 theory-results.png
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"donor": "main-f3650d3",
|
||||
"changed_entries": [
|
||||
"assets/linuxfs/usr/local/bin/droiddeck-game-env"
|
||||
],
|
||||
"apk_sha256": "0dc5330f2c7299719ea86fb3bc36dac0c0e2e1725390cb646882d37650af098e",
|
||||
"helper_sha256": "c79440144bb5f8b3464e98eae3a8d11cf2f8b423988941b79781199d93590556",
|
||||
"adb_install_success": true,
|
||||
"installed_helper_matches_source": true,
|
||||
"environment_regression_tests_passed": 129,
|
||||
"packaging": "Repository fast-deploy tool; main donor with one helper replacement; release certificate and legacy signing lineage verified."
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 157 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 123 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.3 MiB |
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"observations": {
|
||||
"virtual_controller_map": "opened and closed",
|
||||
"virtual_controller_throttle": "truck traveled 14 m",
|
||||
"keyboard_and_camera": "driving inputs, orbit and hood views responded; odometer reached 19 m",
|
||||
"visual_spot_check": "no obvious corruption in inspected Flood views",
|
||||
"physical_button_latency": "not measured",
|
||||
"other_maps": "not validated"
|
||||
},
|
||||
"dynamic_sample": {
|
||||
"ok": true,
|
||||
"seconds": 60.1,
|
||||
"frames": 1335,
|
||||
"fpsOnScreen": 22.2
|
||||
},
|
||||
"included_in_controlled_before_after": false,
|
||||
"game_closed_after_testing": true,
|
||||
"original_environment_restored": true,
|
||||
"return_after_game_preference_restored": true,
|
||||
"final_state": {
|
||||
"phase": "IDLE",
|
||||
"running": false,
|
||||
"game_and_steam_processes": [],
|
||||
"main_page_visually_verified": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"timing-stock": {
|
||||
"frames": 694.0,
|
||||
"gpu_timestamp_ms_per_frame": 33.320407504322766,
|
||||
"wall_ms_per_frame": 54.15719308357349,
|
||||
"submissions_per_frame": 7.0,
|
||||
"acquire_ms_per_frame": 0.04815561959654179,
|
||||
"present_ms_per_frame": 0.1918328530259366
|
||||
},
|
||||
"timing-tiler": {
|
||||
"frames": 771.0,
|
||||
"gpu_timestamp_ms_per_frame": 33.81811167055771,
|
||||
"wall_ms_per_frame": 46.75638391699092,
|
||||
"submissions_per_frame": 9.0,
|
||||
"acquire_ms_per_frame": 0.04532555123216602,
|
||||
"present_ms_per_frame": 0.17829701686121918
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,220 @@
|
||||
[
|
||||
{
|
||||
"trial": "profile-a",
|
||||
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = False\nWINEDEBUG=-all"
|
||||
},
|
||||
{
|
||||
"trial": "profile-a",
|
||||
"screen_pacing": {
|
||||
"cadenceMs": 50,
|
||||
"command": "pacing",
|
||||
"fpsOnScreen": 22.1,
|
||||
"frames": 554,
|
||||
"offCadence": 339,
|
||||
"offCadencePercent": 61.2,
|
||||
"ok": true,
|
||||
"presentToPresentMs": {
|
||||
"16": 155,
|
||||
"33": 22,
|
||||
"50": 215,
|
||||
"66": 159,
|
||||
"86": 3
|
||||
},
|
||||
"refreshRates": [
|
||||
60
|
||||
],
|
||||
"seconds": 25.1
|
||||
}
|
||||
},
|
||||
{
|
||||
"trial": "profile-b",
|
||||
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = False\nWINEDEBUG=-all"
|
||||
},
|
||||
{
|
||||
"trial": "profile-b",
|
||||
"screen_pacing": {
|
||||
"cadenceMs": 50,
|
||||
"command": "pacing",
|
||||
"fpsOnScreen": 22.1,
|
||||
"frames": 555,
|
||||
"offCadence": 347,
|
||||
"offCadencePercent": 62.5,
|
||||
"ok": true,
|
||||
"presentToPresentMs": {
|
||||
"16": 158,
|
||||
"33": 23,
|
||||
"50": 208,
|
||||
"66": 162,
|
||||
"86": 4
|
||||
},
|
||||
"refreshRates": [
|
||||
60
|
||||
],
|
||||
"seconds": 25.1
|
||||
}
|
||||
},
|
||||
{
|
||||
"trial": "profile-override-auto",
|
||||
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = Auto\nWINEDEBUG=-all"
|
||||
},
|
||||
{
|
||||
"trial": "profile-override-auto",
|
||||
"screen_pacing": {
|
||||
"cadenceMs": 50,
|
||||
"command": "pacing",
|
||||
"fpsOnScreen": 18.8,
|
||||
"frames": 472,
|
||||
"offCadence": 201,
|
||||
"offCadencePercent": 42.6,
|
||||
"ok": true,
|
||||
"presentToPresentMs": {
|
||||
"102": 14,
|
||||
"16": 14,
|
||||
"33": 83,
|
||||
"50": 271,
|
||||
"66": 32,
|
||||
"86": 58
|
||||
},
|
||||
"refreshRates": [
|
||||
60
|
||||
],
|
||||
"seconds": 25.1
|
||||
}
|
||||
},
|
||||
{
|
||||
"trial": "apk-stock-auto",
|
||||
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = Auto\nWINEDEBUG=-all"
|
||||
},
|
||||
{
|
||||
"trial": "apk-stock-auto",
|
||||
"screen_pacing": {
|
||||
"cadenceMs": 50,
|
||||
"command": "pacing",
|
||||
"fpsOnScreen": 18.9,
|
||||
"frames": 474,
|
||||
"offCadence": 186,
|
||||
"offCadencePercent": 39.2,
|
||||
"ok": true,
|
||||
"presentToPresentMs": {
|
||||
"102": 17,
|
||||
"16": 9,
|
||||
"33": 88,
|
||||
"50": 288,
|
||||
"66": 16,
|
||||
"86": 56
|
||||
},
|
||||
"refreshRates": [
|
||||
60
|
||||
],
|
||||
"seconds": 25.1
|
||||
}
|
||||
},
|
||||
{
|
||||
"trial": "apk-profile-a",
|
||||
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = False\nWINEDEBUG=-all"
|
||||
},
|
||||
{
|
||||
"trial": "apk-profile-a",
|
||||
"screen_pacing": {
|
||||
"cadenceMs": 50,
|
||||
"command": "pacing",
|
||||
"fpsOnScreen": 22.1,
|
||||
"frames": 554,
|
||||
"offCadence": 335,
|
||||
"offCadencePercent": 60.5,
|
||||
"ok": true,
|
||||
"presentToPresentMs": {
|
||||
"16": 152,
|
||||
"33": 22,
|
||||
"50": 219,
|
||||
"66": 160,
|
||||
"86": 1
|
||||
},
|
||||
"refreshRates": [
|
||||
60
|
||||
],
|
||||
"seconds": 25.1
|
||||
}
|
||||
},
|
||||
{
|
||||
"trial": "apk-profile-b",
|
||||
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = False\nWINEDEBUG=-all"
|
||||
},
|
||||
{
|
||||
"trial": "apk-profile-b",
|
||||
"screen_pacing": {
|
||||
"cadenceMs": 50,
|
||||
"command": "pacing",
|
||||
"fpsOnScreen": 22.1,
|
||||
"frames": 554,
|
||||
"offCadence": 344,
|
||||
"offCadencePercent": 62.1,
|
||||
"ok": true,
|
||||
"presentToPresentMs": {
|
||||
"16": 154,
|
||||
"33": 24,
|
||||
"50": 210,
|
||||
"66": 164,
|
||||
"86": 2
|
||||
},
|
||||
"refreshRates": [
|
||||
60
|
||||
],
|
||||
"seconds": 25.1
|
||||
}
|
||||
},
|
||||
{
|
||||
"trial": "apk-stock-repeat",
|
||||
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = Auto\nWINEDEBUG=-all"
|
||||
},
|
||||
{
|
||||
"trial": "apk-stock-repeat",
|
||||
"screen_pacing": {
|
||||
"cadenceMs": 50,
|
||||
"command": "pacing",
|
||||
"fpsOnScreen": 19.0,
|
||||
"frames": 475,
|
||||
"offCadence": 187,
|
||||
"offCadencePercent": 39.4,
|
||||
"ok": true,
|
||||
"presentToPresentMs": {
|
||||
"102": 13,
|
||||
"16": 10,
|
||||
"33": 83,
|
||||
"50": 288,
|
||||
"66": 29,
|
||||
"86": 52
|
||||
},
|
||||
"refreshRates": [
|
||||
60
|
||||
],
|
||||
"seconds": 25.1
|
||||
}
|
||||
},
|
||||
{
|
||||
"trial": "apk-drive-ready",
|
||||
"effective_environment": "DXVK_CONFIG=dxvk.tilerMode = False\nWINEDEBUG=-all"
|
||||
},
|
||||
{
|
||||
"trial": "apk-drive-ready",
|
||||
"screen_pacing": {
|
||||
"cadenceMs": 50,
|
||||
"command": "pacing",
|
||||
"fpsOnScreen": 22.5,
|
||||
"frames": 565,
|
||||
"offCadence": 346,
|
||||
"offCadencePercent": 61.2,
|
||||
"ok": true,
|
||||
"presentToPresentMs": {
|
||||
"16": 157,
|
||||
"33": 35,
|
||||
"50": 219,
|
||||
"66": 154
|
||||
},
|
||||
"refreshRates": [
|
||||
60
|
||||
],
|
||||
"seconds": 25.1
|
||||
}
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,29 @@
|
||||
label,fps,seconds,cpu_pct_mean,gpu_pct_mean,gpu_mhz_mean,long_interval_pct
|
||||
Stock A,19.0,25.1,23.43,65.25,1150.0,80.25
|
||||
Stock B,18.9,25.1,23.58,65,1150.0,83.09
|
||||
Stock after restart,18.9,25.1,24.4,64.86,1150.0,81.61
|
||||
Tiler heuristics off A,22.1,25.1,26.64,76.75,1150.0,68.9
|
||||
Tiler heuristics off B,22.1,25.1,27.11,77.14,1150.0,67.93
|
||||
Partial precision,18.7,20.1,23.7,64.74,1150.0,80.59
|
||||
Installed test driver,16.5,30.1,20.71,72.55,1150.0,75.56
|
||||
Direct mapping off,18.2,25.1,25.05,64.32,1150.0,77.85
|
||||
D3D9 vsync off,18.8,25.1,24.29,65.64,1150.0,81.36
|
||||
Frame latency 1,19.1,25.1,23.85,65.79,1150.0,77.24
|
||||
Game limiter off,18.8,25.1,23.71,65.29,1150.0,80.3
|
||||
Driver 0.3.5,19.0,25.1,24.24,65.39,1150.0,76.89
|
||||
Cached write-only buffers,19.0,25.1,24.0,65.36,1150.0,80.0
|
||||
Detailed logging on,18.9,25.1,25.52,65.21,1150.0,81.18
|
||||
Float emulation off,16.8,25.1,22.76,68.14,1150.0,68.65
|
||||
Strict float emulation,17.0,25.1,22.61,68.36,1150.0,64.94
|
||||
Device-local constants,18.6,25.1,24.05,65,1150.0,78.54
|
||||
Stock late control,18.8,25.1,23.99,65.61,1150.0,80.72
|
||||
64-thread shader waves,18.4,25.1,23.37,65.96,1150.0,71.15
|
||||
Tiler off + NTSYNC off,22.0,25.1,26.63,77.39,1150.0,69.69
|
||||
Installed helper A,22.1,25.1,26.26,77.18,1150.0,68.05
|
||||
Installed helper B,22.1,25.1,26.38,77.32,1150.0,67.39
|
||||
Installed helper + Auto override,18.8,25.1,23.61,65.36,1150.0,79.45
|
||||
Signed APK + Auto override,18.9,25.1,26.46,65.57,1150.0,79.54
|
||||
Signed APK default A,22.1,25.1,27.28,77.11,1150.0,68.59
|
||||
Signed APK default B,22.1,25.1,27.47,77.21,1150.0,67.87
|
||||
Signed APK control repeat,19.0,25.1,24.58,65.46,1150.0,80.42
|
||||
Signed APK default C,22.5,25.1,27.77,77.04,1150.0,66.02
|
||||
|
@@ -0,0 +1,44 @@
|
||||
# Render-path pacing investigation
|
||||
|
||||
Retroid Pocket Duo, Adreno 722, DD-Turnip 0.4.0, Proton 11-11.11 and Ubuntu runtime rc4. Spintires uses Direct3D 9 through DXVK; VKD3D is not in this rendering path.
|
||||
|
||||
## Method
|
||||
|
||||
Each controlled launch restored the same Flood checkpoint, configuration and camera. The output was 1280×720 at 60 Hz, highest shaders, high grass/LOD, with shadows, SSAO, FXAA and motion blur enabled. Samples began after screenshot matching and warm-up. SurfaceFlinger present intervals measured frames reaching the screen. Device CPU/GPU, clocks, memory and thermal state were sampled alongside pacing. Samples were sequential rather than randomized; they are short observations, not confidence intervals or a complete thermal study. Severe skin thermal status was present; sampled GPU clocks stayed at 1150 MHz.
|
||||
|
||||
## Findings
|
||||
|
||||
Stock controls stayed between 18.8 and 19.0 FPS. Turning off DXVK tiler heuristics produced 22.1 FPS twice without lowering graphics quality. The automatically selected helper subsequently reproduced 22.1 FPS twice. A release-signed APK based on main-f3650d3 measured 22.1, 22.1 and 22.5 FPS in the three fix runs, bracketed by explicit Auto controls of 18.9 and 19.0 FPS. The signed-APK gain is 17.3% over the mean of those controls, and intervals of at least 50 ms fell from 80.0% to 67.5%. This is a bounded throughput improvement; long frame holds remain.
|
||||
|
||||
Mesa overlay profiling measured 33.32 ms of GPU timestamp spans and 54.16 ms of wall time per stock frame. With tiler heuristics off, the corresponding values were 33.82 and 46.76 ms. Submission counts changed from 7 to 9 per frame. Acquire and present API time stayed below 1 ms. The timestamps can include queue stalls and profiling overhead, so the difference is not an exclusive measurement of shader execution or FEX overhead. The evidence supports improved render scheduling; it does not isolate secondary command buffers, cached allocation preference or flush policy individually.
|
||||
|
||||
Thread snapshots did not show saturation of the main or command-stream thread. That does not eliminate CPU scheduling, emulation or synchronization from the remaining cost. PRoot counters and global paging statistics do not identify an individual blocking call. Hardware and software perf-event access against the real game PID was denied.
|
||||
|
||||
Changing shader precision/wave size, driver versions, buffer mapping, present interval, maximum frame latency, game limiter, detailed logging, floating-point emulation, device-local constants and NTSYNC did not improve on the tiler change. Forced Turnip sysmem, LRZ/binning toggles also did not help; forced gmem was slower. The existing custom GPU-load layer was absent from the game's process.
|
||||
|
||||
## Scope and exclusions
|
||||
|
||||
The default is restricted to the tested executable, Adreno 722 and DD-Turnip 0.4.0. Explicit tiler options and custom configuration files retain control. Other games, GPUs and drivers keep their existing behavior.
|
||||
|
||||
A 640×360 request was not an advertised mode and the actual swapchain remained 1280×720. Those runs are excluded from resolution-scaling conclusions. An interrupted DXVK 2.7.1 run, interrupted captures, mismatched camera scenes and an accidental self-profile are excluded. No statement that every stall is fixed or that a different DXVK release is equivalent follows from these tests.
|
||||
|
||||
## Primary sources
|
||||
|
||||
- [DXVK performance hints](https://github.com/doitsujin/dxvk/blob/master/src/dxvk/dxvk_device.cpp)
|
||||
- [DXVK render-pass command buffers](https://github.com/doitsujin/dxvk/blob/master/src/dxvk/dxvk_context.cpp)
|
||||
- [DXVK configuration](https://github.com/doitsujin/dxvk/blob/master/dxvk.conf)
|
||||
- [Mesa Adreno architecture](https://docs.mesa3d.org/drivers/freedreno.html)
|
||||
- [Mesa environment controls](https://docs.mesa3d.org/envvars.html)
|
||||
|
||||
## Package verification
|
||||
|
||||
The repository fast-deploy tool rebuilt main-f3650d3 with exactly one changed non-signature payload: the environment helper. Release certificate/lineage, ZIP alignment and complete session-asset source checks passed. The APK installed successfully over the existing app, and its extracted helper matched the tested source hash. The original installed APK was retained locally for rollback. This is a helper-only package rebuild using the existing compiled main application, not a new compilation of unchanged native/Kotlin code.
|
||||
|
||||
The APK and source-helper digests are recorded in apk-proof.json. Raw process logs, device identifiers and account details are kept out of the shared evidence.
|
||||
## Gameplay check and remaining work
|
||||
|
||||
After the controlled runs, the virtual controller opened/closed the map and drove the truck 14 m. Keyboard driving and camera changes responded; the odometer reached 19 m. A 60-second dynamic capture completed with the game still active. The inspected rear, orbit and hood views showed no obvious corruption. This is a Flood spot check, not validation of every map or physical-button latency. The dynamic capture is excluded from controlled comparisons.
|
||||
|
||||
The new default removes measured avoidable render scheduling cost. The remaining GPU-side spans and long present intervals still need investigation; a full stall resolution has not been demonstrated. Next work should profile expensive rendering passes and the remaining submission gaps, rather than assume that disabling synchronization or changing shader precision is a proven fix. Original environment/test settings were restored, and the game was closed after testing.
|
||||
|
||||
Steam was stopped, temporary overrides and diagnostic bridge files were removed, and DroidDeck was force-closed/reopened on its main Play Steam page. The installed package retains the tested helper. Temporary test progress is preserved privately; pre-existing save/config files were retained.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 331 KiB |
Reference in new issue
Block a user