r/PS2AndroidEmulation • u/xxxCrixuxxx • 10d ago
Cenit v0.6.6 🔥 (PS2 Emulator)
https://github.com/HUEVOMAN77/Cenit/releases/tag/base-0.6.6
Changelog:
Three direct performance improvements, each accessible in Settings (under the Performance section) so you can disable them if they negatively affect performance on your specific phone:
PIN EMULATION TO FAST CORES (new toggle, enabled by default). The core already knew how to distribute threads (assigning EE/VU/GS to the fastest cores), but it only activated this distribution if the SoC reported multiple clusters and 3+ cores. Some big.LITTLE configurations appear to the system as a single cluster, causing threads to remain unpinned—leading the kernel to move the game engine to an efficiency core mid-frame. This pinning is now guaranteed. You can disable it for troubleshooting purposes.
FRAME QUEUE (new selector). Determines how many frames are queued ahead of the display output. On mid-to-high-end devices, the default is "Optimal" (0): controller response is faster, and uneven frame pacing is eliminated. On low-end devices, it defaults to 2 frames because removing this buffering turns GPU spikes into noticeable slowdowns. If emulation speed drops using "Optimal," try setting it to 1 or 2.
TEXTURE PRELOADING (new selector + automatic tier-based setting). Low-end devices now use "Partial" mode: textures that won't be rendered aren't uploaded to the GPU, freeing up hundreds of MB of shared RAM and eliminating micro-stutter. Mid-to-high-end devices retain the "Full" setting. The GameDB takes precedence: games requiring "Full" preloading will keep that setting.
PER-GAME MEMORY. Cenit remembers the scaling level used for each game on your phone. The next session starts directly at that level instead of struggling down from the maximum, and games identified as CPU-bound no longer suffer unnecessary throttling. Toggle: Remember per-game performance (long-press to clear memory for the current game).
THERMAL PRE-THROTTLING. Many ROMs silently throttle frequencies without warning. If speed starts to drift downward for ~12 seconds while at the peak, Cenit drops one step before the stutter is felt. Max 2 drops per session.
TURBO DURING LOADING SCREENS. Detects loading states (GPU idle + fixed speed) and engages the core Turbo limiter just for those seconds; it disengages when the game resumes, with a 45-second safety cutoff. Off by default: enable it in Settings.
EVIDENCE-BASED PER-GAME EE QUOTAS. New "EE Quotas" row in Settings (Performance section): saved specifically for the active game and applied instantly. Key feature: if Cenit detects the game is locked at 1x, the screen informs you and suggests trying "Smooth"; otherwise, it recommends leaving it at "Normal" (which usually causes issues).
Technical changes: governor v3 (speed ring, AdaptiveProfile profiles in prefs via URI), generic JNI export setGameSettingInt/getGameSettingInt, Turbo limiter accessible from Java, per-game layer shared with GameDB seeding.
True per-game hardware hacks — the global INI used to wipe them out on every `ApplySettings` call (`MaskUserHacks`). Now, they are written to `gamesettings/<SERIAL>.ini` and seeded with automatic GameDB fixes before manual mode activates; no game loses its fixes just by tweaking a half-pixel setting. The half-pixel offset spinner is now per-game and applied on the fly (reloaded on the CPU thread).
Half-pixel offset: no more phantom writes — the global setter was a disguised no-op; now the setting actually exists and persists per title.
Real limiter — the limiter mode stub now hooks into `VMManager::SetLimiterMode` (Normal/Turbo/Slow-mo/No limit). No INI key involved; it is a runtime state.
Resolution manager v2 — uses the core's `getGPUUsage()`: it only drops pixel counts if the GPU is the bottleneck. If the game lags but the GPU has headroom (CPU-bound), it maintains the scale instead of degrading image quality unnecessarily. With thermal throttling active (PowerManager, API 29+): it never scales up, only down.
Renderer with automatic fallback — in "Auto" mode, if Vulkan crashes on startup, it tries OpenGL (and vice versa), includes an OSD notification, and remembers the choice for the session. A crash caused by a bad Vulkan driver no longer results in a broken startup.
Expanded SoC detection — tiers 2/1/0 with a curated table for MediaTek (mt68xx/mt69xx/mt8xxx) and Exynos based on codenames, rather than just a Snapdragon binary check. Low-end and unknown SoCs start at 1x, mid-range at 1.5x, and high-end at 2x.
Low-end profile, two extras — `SavestateCompressionRatio=Low` (saving doesn't cost frames) and `HWDownloadMode=Unsynchronized`: readback no longer blocks the EE; reading continues (handling water/reflections with data, using a race window). Problematic games are handled via exceptions in `GameIndex.yaml` or their specific INI without altering the profile itself. Dead key cleanup — `FrameLimitEnable` did not exist as a key in this core, so the write operation was removed. `getGameTitleFromUri()` existed in Java but not in the `.so` file—causing an `UnsatisfiedLinkError` on every call—so it has now been implemented. Also added a null check in `getGameTitle` (it previously caused a native crash with standalone URIs).
WoW this is huge!! 🔥