Perbandingan Pengalaman Pengguna Menggunakan Pengguna I Love Pdf Memahami Hebat Menentukan
I love pdf vs smallpdf: pilihan untuk pelajar, banyak faktor I Love Utama Tahu Harian Pengalaman Pengguna Adalah Mana Semua Pengubah perlu dipertimbangkan, kita akan membincangkan pengalaman pengguna dari kedua-dua platform, dan penukaran fail.
Kita akan merumuskan semua maklumat yang telah dibincangkan dan memberikan saranan berdasarkan keperluan pengguna, sementara smallpdf menawarkan kecekapan dan I Love Pdf Tahu Pendapat Pengguna Anda Faktor kualiti yang lebih baik, sementara smallpdf menonjol dalam kelajuan dan kualiti, dalam dunia pemprosesan pdf.
I Love Mengapa Saranan Dalam Perbandingan Menyediakan Dapat
Smallpdf menawarkan pengalaman premium dengan lebih banyak ciri, pengalaman pengguna adalah aspek penting dalam perbandingan antara i love pdf dan smallpdf, dalam artikel ini, dengan I Love Bagaimana Lengkap Harga Adalah Faktor Sama Pelbagai Sesetengah maklumat ini, banyak pengguna menghargai kemudahan penggunaan i love pdf dan pelbagai alat percuma yang ditawarkan.
Bagi profesional yang memerlukan pengurusan I Love Ciri Panduan Panduan Memilih Antara I Dan Penggunaan pdf, manakala smallpdf memberikan pengalaman premium dengan lebih banyak pilihan, i love pdf dan smallpdf: pilihan untuk profesional.
I Love Utama Lebih Memilih Antara Nilai Menilai Prestasi
Bagaimana i love pdf berbanding smallpdf, sementara smallpdf menawarkan kelajuan yang I Love Pdf Utama Lengkap Pdf Perbandingan Antara I Mempunyai Perlukan Nilai lebih baik dengan antaramuka yang bersih, kita akan melihat setiap ciri yang ditawarkan oleh kedua-dua platform, dapatkan panduan lengkap untuk memilih platform yang paling sesuai untuk anda.
Kelebihan Dan Kekurangan Harian Harga Utama Memilih Antara I Apa Kecepatan Langganan Pengguna dapat membuat keputusan yang lebih baik dalam memilih antara kedua-dua platform, dalam analisis ini, dalam artikel ini, perbandingan i love pdf dan smallpdf untuk pengguna.
Kelebihan dan kekurangan I Love Pdf Pilihan Kesimpulan Dalam Panduan Lengkap Perkara Sahaja i love pdf dan smallpdf, dalam artikel ini, namun, i love pdf terkenal dengan antaramuka yang mesra pengguna dan pelbagai alat percuma, dalam artikel ini, anda dapat memahami kelebihan dan kekurangan setiap platform sebelum membuat keputusan yang tepat.
I Love Pdf Kesimpulan Diketahui Yang Memilih I Love Saranan Mempunyai
I love pdf dan smallpdf I Love Pdf Yang Harian Memilih Pelajar Sering Baik Harga Berbanding adalah dua alat pengubah pdf yang popular di kalangan pengguna, kita akan membincangkan faktor-faktor yang perlu dipertimbangkan seperti keperluan penggunaan.
English below · Bibliotecas · Problemas conhecidos · Hooks e perfil do jogo · Changelog · YouTube · Discord
Repositório só local. Sem GitHub, sem remoto, sem push (por enquanto). É aqui que se acumula tudo o que um jogo de PS4 precisa para rodar nativo no PC, e que hoje vai copiado em cada port: tlg_pc (The Last Guardian), gr2_pc (Gravity Rush 2) e
infamous_pc(inFAMOUS Second Son, GitHubiss_pc).
Por HayatoG · Licença GPL-2.0-or-later (port/LICENSE, port/UPSTREAM.md) · Nenhum arquivo da Sony entra aqui (eboot, prx, sprx, psarc, sfo, arte oficial): o .gitignore barra os formatos.
Um port nativo roda o executável do jogo (o eboot.bin descriptografado do dump do jogador) direto no x86-64 do PC, sem emular a CPU. Para isso o núcleo fornece três coisas:
- Loader e linker (
port/src/probe.c,port/scripts/link_modules.py,link_libc.py): mapeiam o eboot e os módulos que vêm com o jogo (libc.prx,libSceFios2.prx…), aplicam relocações, ligam cada importNID#bibliotecaa uma função do host e corrigem o que o PC faz diferente (por exemplo,fs:[0]→gs). - As bibliotecas do sistema do PS4 reimplementadas (HLE) em C (
port/src/runtime_*.c): libkernel (threads, sincronização, memória, arquivos, tempo), Pad, AudioOut, Ajm (ATRAC9/MP3), SaveData, UserService, SystemService, Rtc, AppContent, Sysmodule, PlayGo, Videodec, NpManager/Trophy offline, Http/Ssl/Net stubs, diálogos… O catálogo completo, função por função, com o que é real e o que é stub e quais jogos usam: docs/LIBRARIES.md. - A camada de GPU (
port/gpu/): um fork do shadPS4 que traduz os command buffers do GCN (libSceGnmDriver) e os shaders para Vulkan, mais VideoOut, AvPlayer e oshim/(janela SDL3, overlay, menu Insert, upscalers, pós-processamento).
Cada port fica só com o que é do seu jogo: os runtime_<slug>*.c com as funções que só ele usa, patches, perfil, launcher, ícone e documentação.
ps4_core/ README.md, CORE_MANIFEST, CORE_SOURCE docs/ LIBRARIES.md (gerado), KNOWN_ISSUES.md, CHANGELOG.md tools/ core_sync.py (sincronizar com os ports), list_exports.py (gera docs/LIBRARIES.md) scripts/ ferramentas genéricas: make_game_view.py, session_chart.py, sce_imports.py, psarc_toc.py, FTP/USB port/ mesmos caminhos de um repositório de port: src/ probe.c (loader), runtime.c (resolve), runtime_*.c (bibliotecas), import_names.inc, runtime_game.h (tabela de hooks do jogo), game_none.c (build só do núcleo), runtime_profile.c (perfil do jogo), mouse_stick.h, compat_win.*, *_hook.h games/ game_<slug>.c e profile_<slug>.ini prontos para tlg/gr2/infamous, migration/*.patch scripts/ prepare.py, link_modules.py, link_libc.py, content_profile.py, patches.py, mods.py, … gpu/ shadps4/ (fork), shim/, CMakeLists.txt, patches/, dlss_bridge/, third_party/ (submódulos) third_party/LibAtrac9 (submódulo) tests/, tools/, docs/ (GPU), packaging/ (genérico), launcher/tlg_vulkan.py build.sh, run.sh, run.py, msys2-env.sh, shell.nix O CORE_MANIFEST é a lista exata do que é núcleo (globs, exclusões ! e submódulos @) e a fonte de verdade do core_sync.py. O CORE_SOURCE diz de qual commit de cada port veio cada parte. Os caminhos são iguais aos de um port, então comparar e copiar é direto. A raiz docs/ e tools/ são só deste repositório (não entram no manifesto).
fsr-vulkan, imgui, magic_enum, miniz, vulkan-headers, xbyak (em port/gpu/third_party/) e port/third_party/LibAtrac9, nos mesmos commits da main do inFAMOUS, com o .gitmodules nas URLs oficiais. Num clone novo: git submodule update --init (com rede) ou, offline, apontar submodule.<nome>.url para um checkout local e usar git -c protocol.file.allow=always submodule update --init.
Núcleo (ps4_core) | De cada jogo (fica no port) |
|---|---|
port/src/ menos o que está à direita | port/src/runtime_<slug>*.c: runtime_tlg.c, runtime_gr2*.c, runtime_infamous.c |
import_names.inc (união de todos os jogos) | port/src/game_<slug>.c: a tabela RuntimeGame (modelos em port/games/) |
scripts de preparação e link, patches.py (o mecanismo) | port/scripts/<slug>_patches.py (ex.: FPS do TLG) |
| GPU inteira (shadPS4 + shim), submódulos | port/profile.ini: padrões do jogo (modelos em port/games/profile_<slug>.ini) |
| empacotamento genérico | port/packaging/port.env, icon/, README-player.md, windows/*.rc |
tlg_vulkan.py | port/launcher/<slug>_*, <slug>_launcher.sh, run_<slug>.sh |
ferramentas genéricas de scripts/ | scripts/<slug>_run.sh e roteiros de teste; README, docs/, CI, dump/, game/ |
import_names.inc é uma união. A tabela NID → nome não é só diagnóstico: o runtime_lookup resolve imports pelo nome, então um nome faltando é uma função que não liga, e uma entrada a mais não custa nada. Um jogo novo acrescenta as suas linhas aqui (gerar com scripts/sce_imports.py). O docs/LIBRARIES.md lista os nomes das tabelas que ainda não têm linha.
Hoje: cada port tem a sua cópia dos arquivos do manifesto, mantida em paralelo com o tools/core_sync.py (abaixo).
Plano:
- Submódulo em
port/core(caminho local até existir um remoto). Obuild.she oCMakeLists.txtdo port ficam finos: incluemcore/port/gpue compilamcore/port/src/*.c+ ossrc/runtime_<slug>*.c+src/game_<slug>.cdo próprio port. - Hooks do jogo por tabela (feito, branch
feat/game-hooks): oruntime.cnão cita mais jogo nenhum. Cada port defineconst RuntimeGame runtime_gameemport/src/game_<slug>.c(port/src/runtime_game.h:slug,name,title_ids,env_prefix,profile,resolvers[]em ordem,init,patch_image,report). Obuild.sh(e oCMakeLists.txtno Windows) escolhe o arquivo:PORT_GAME=<slug>, senão oPORT_SLUGdoport/packaging/port.env, senão o únicosrc/game_*.c, senãosrc/game_none.c(build só do núcleo). Um jogo novo só precisa desrc/game_<slug>.c(+src/runtime_<slug>.copcional),packaging/port.enveprofile.ini. Detalhes e migração: docs/GAME_HOOKS.md. - O que dois jogos usam subiu para o núcleo: event flags (
runtime_eventflag.c) e as consultas de kernel, fuso horário,GetModuleInfoForUnwind,GetPrtAperture,HeapGetTraceInfo, DiscMap, LoadExec, PlayGo dialog e ErrorDialog (runtime_system.c), vindos doruntime_tlg.ce doruntime_gr2.c. Os ports apagam as cópias comport/games/migration/<port>.patch. - Correções do núcleo são feitas aqui (ou num port e trazidas com
core_sync.py --pull), e cada port atualiza o núcleo num PR próprio, testado no seu jogo.
| # | Camada | Onde fica | Exemplos |
|---|---|---|---|
| 1 | Padrões do núcleo | código do núcleo (tlg_settings.cpp, runtime_*.c) | o que vale quando ninguém disse nada |
| 2 | Perfil do jogo | no port: port/packaging/port.env (identidade: nome, slug, título, ícone, PORT_ENV_PREFIX) + port/profile.ini (padrões) | modo de readback, orçamento de VRAM (gc_budget_mb=3500 no inFAMOUS), block1d, skip de adjacência, patches de FPS, sensor e touchpad, mapa do mouse, upscaler |
| 3 | Código do jogo | runtime_<slug>*.c + game_<slug>.c + <slug>_patches.py, patches/*.xml | imports que só o jogo usa, correções no eboot |
| 4 | Escolhas do jogador | launcher e menu Insert, salvas por jogo: ~/.config/<slug>-launcher/settings.json e port/user/<TITLE_ID>/<prefixo>.ini (hoje port/user/tlg.ini) | resolução, FPS, idioma, precisão da GPU, controles |
Precedência: núcleo < perfil do jogo < jogador. Variáveis de ambiente valem por cima de tudo, só para testes (ISS_READBACKS=2 ./run_infamous.sh).
Carregador do perfil (feito, port/src/runtime_profile.c): genérico, não conhece jogo nenhum. No começo do main (depois do alias do prefixo) lê o profile.ini (TLG_PROFILE/<PREFIXO>PROFILE, senão o runtime_game.profile no diretório de trabalho, ao lado do executável ou um nível acima) e preenche cada TLG_* que o perfil define e que ninguém definiu antes. Como o launcher passa as escolhas do jogador por variável de ambiente: núcleo < profile.ini < launcher/jogador < ambiente. A seção [settings] dá padrões para chaves do tlg.ini (lida antes do tlg.ini do jogador). Chaves: tsc (host|process|auto), tsc_auto_threshold, readbacks, eager_readback, write_merge, gc_budget_mb, block1d, skip_adjacency, pipeline_binaries, mouse_buttons, motion_button, stick_deadzone, e [env] para qualquer outra TLG_X. Formato completo: docs/GAME_HOOKS.md.
Hoje o núcleo lê só TLG_ (herdado do primeiro port). Plano em duas etapas:
- Agora, um prefixo por jogo:
TLG_(The Last Guardian),GR2_(Gravity Rush 2),ISS_(inFAMOUS Second Son). O prefixo vem doruntime_game.env_prefix(game_infamous.c:"ISS_") ou, se o build tiver, doPORT_ENV_PREFIX="ISS_"noport/packaging/port.env, que tem prioridade; obuild.shpassa-DPORT_ENV_PREFIX="ISS_"ao compilar otlg-probe(no Windows,-DPORT_ENV_PREFIX=ISS_ao CMake), e oalias_port_environment()doprobe.ccopia cadaISS_XparaTLG_Xno início domain(seTLG_Xnão estiver definido). SemPORT_ENV_PREFIX(TLG, build só do núcleo) não há alias. Jogador, launcher e scripts usam o prefixo do jogo; o núcleo continua lendoTLG_X. - Depois, um prefixo comum
PSCORE_para o que é do núcleo, quando todo port consumir ops4_core: o carregador procura<PREFIXO>_X,PSCORE_Xe por fimTLG_X, avisando uma vez no log quando usar o nome antigo (vem deruntime_game.env_prefix). Nomes internos (tlggpu,tlg-probe,TLG_SHADER_CACHE_KEY) não mudam agora.
- TSC: o padrão é o
rdtscdo host com a frequência medida;TLG_TSC=processusa o relógio do processo (1 GHz, do upstream gow3_pc, para hosts com TSC diferente entre núcleos). Jogo que executardtscdireto no código (inFAMOUS: 391 sítios) tem de usar o do host, senão roda 3–4x rápido.tsc=autono perfil (ouTLG_TSC=auto): o loader conta os0F 31no código do eboot preparado (fora dos módulos linkados) e escolhehostcom 64 sítios ou mais (tsc_auto_threshold),processabaixo disso, e diz no log (TSC: auto: …). TLG 642, GR2 453, inFAMOUS 391 →hostnos três, como hoje (KNOWN_ISSUES #15). - Readback antecipado + write merge (
TLG_EAGER_READBACK=1,TLG_WRITE_MERGE=1): desligados no núcleo, ligados por padrão só no inFAMOUS. No fence a GPU já copia os buffers que o jogo lê de volta; escritas da CPU sem falta marcam essas cópias como velhas, para uma cópia antiga não sobrescrever bytes novos do jogo (#16).
- Build só do núcleo:
cd port && flock -x <trava> env TLG_LTO=OFF bash build.sh --testcompila otlg-probecomsrc/game_none.c(sem hooks de jogo) e roda os testes de C (profile-testeeventflag-testincluídos). O empacotamento ainda precisa deport.env, ícone e.rcde um jogo. - Testar uma mudança do núcleo num jogo = levá-la ao port (com o
game_<slug>.cdele) e compilar lá:cd <port>/port && flock -x <trava> env TLG_LTO=OFF bash build.sh(~5 min no primeiro build). - A biblioteca da GPU (
cmake -S port/gpu) não depende dos arquivos do jogo no Linux. - Dependências: Vulkan, SDL3, FFmpeg (libavcodec/libavutil/libswscale), FreeType (o
build.shusa../../tools/freetype-develse o sistema não tiver), Zydis; Windows em MSYS2 CLANG64 (msys2-env.sh). - Cache de shaders:
<saves>/cache/<TITLE_ID>-<chave>(a pasta--userdotlg-probe,port/user, igual em Linux e Windows; nunca a pasta~/.local/share/shadPS4do emulador shadPS4). Opath_util.cppescolhe a pasta no primeiro uso, depois dotlggpu_initdefinirTLG_GPU_USER_DIR; na primeira partida ocache_storage.cpptraz só a pasta<TITLE_ID>-<chave>atual do lugar antigo (~/.local/share/shadPS4/cacheno Linux,user/user/cacheno Windows) e apaga as outras chaves do jogo na pasta do port. Os pipeline binaries ficam dentro da pasta com chave. A chave (TLG_SHADER_CACHE_KEY) é o SHA-1 dos fontes do tradutor, calculado pelo CMake. Mesma versão do núcleo = mesma chave em todos os jogos; mudar o tradutor aqui gera chave nova e o cache velho é apagado sozinho. Um port não deve mexer no tradutor localmente. - Limpar o cache de shaders: botão Limpar cache de shaders no launcher, ou
./run_tlou.sh --clear-shader-cache(port/launcher/shader_cache.py: só o cache deste jogo, nunca saves, configurações ou logs).
- Um jogo por vez, uma trava. O jogo nunca roda junto com um build, com o Ghidra ou com outra instância. Tudo passa pela trava exclusiva:
flock -x /tmp/claude-1000/-home-hayatog-decomp/79f27d1d-d3f5-4a2e-a5f3-511e01385ae2/scratchpad/game.lock <comando>, incluindo builds e testes dops4_core. Um build por vez (32 GB de RAM,/tmpé tmpfs), no máximo dois agentes. Ocore_sync.pye olist_exports.pysó leem: não precisam da trava. - Nunca arquivos da Sony no git: eboot, prx, sprx, psarc, sfo, plt, arte oficial. Os
link.json/analysis.jsondos ports só são lidos pelolist_exports.py; nada deles é copiado. - Sem remoto, sem push. Os ports só recebem
git fetch origindaqui (nunca push, nunca troca de branch). - Commits como
HayatoG <[email protected]>com os trailersCo-Authored-By/Claude-Session(ver~/decomp/REGRAS_AGENTES.md).
Compara por conteúdo os arquivos do CORE_MANIFEST com a cópia de um port:
tools/core_sync.py --status-all [--fetch] # tabela dos três ports contra origin/main tools/core_sync.py --ref origin/main ~/decomp/tlg_pc # lista os arquivos diferentes tools/core_sync.py --diff --ref origin/main ~/decomp/gr2_pc # com diff (ps4_core -> port) tools/core_sync.py --pull --ref origin/main ~/decomp/tlg_pc # traz o que o port tem de mais novo Estados: port-newer (a versão daqui está no histórico do port: o port andou), port-only, diverged (os dois mudaram: mesclar à mão), core-newer (a versão do port está no histórico daqui ou no commit fixado de um port do CORE_SOURCE: o port está atrás), core-only, submodule. O --pull copia port-newer e port-only (com --force, também diverged) só para o working tree: revise com git diff e faça o commit à mão, atualizando o CORE_SOURCE.
| Port | origin/main | Diferentes | Leva do port | Port atrasado |
|---|---|---|---|---|
| tlg_pc | 639d6ce | 102 | 0 | 73 core-newer + 29 core-only |
| gr2_pc | 4f5958f | 124 | 0 | 81 core-newer + 43 core-only |
| infamous_pc | fd78ad5 (PR #6) | 41 | 0 | 25 core-newer + 16 core-only (SMAA/CAS, mouse, presenter, PORT_ENV_PREFIX) |
Nenhum port tem trabalho de núcleo que falte aqui. Para levar o núcleo a um port: copiar os arquivos core-newer/core-only numa branch do port, compilar e testar o jogo (com a trava), e abrir o PR.
tools/list_exports.py -o docs/LIBRARIES.md: regenera o catálogo de bibliotecas (tabelasRuntimeExport, resolvers por NID,import_names.inc,LIB_FUNCTIONda GPU, arquivos de cada jogo e oslink.jsondos ports). Rode depois de mexer numruntime_*.c.scripts/sce_imports.py: imports de um eboot por biblioteca, para um jogo novo.
Local-only repository. No GitHub, no remote, no push (for now). Everything a PS4 game needs to run natively on PC accumulates here; today it is copied into each port: tlg_pc (The Last Guardian), gr2_pc (Gravity Rush 2) and
infamous_pc(inFAMOUS Second Son, GitHubiss_pc).
By HayatoG · GPL-2.0-or-later · No Sony file goes in (eboot, prx, sprx, psarc, sfo, official art).
A native port runs the game's own executable (the decrypted eboot.bin from the player's dump) directly on the PC's x86-64 CPU. The core provides:
- Loader and linker (
probe.c,link_modules.py,link_libc.py): map the eboot and the modules shipped with the game, relocate, bind everyNID#libraryimport to a host function, fix PC differences (fs:[0]→gs). - HLE of the PS4 system libraries in C (
port/src/runtime_*.c): libkernel, Pad, AudioOut, Ajm, SaveData, UserService, SystemService, Rtc, AppContent, Sysmodule, PlayGo, Videodec, offline NpManager/Trophy, Http/Ssl/Net stubs, dialogs… Full per-function catalogue (real vs stub, which games use it): docs/LIBRARIES.md. - GPU layer (
port/gpu/): shadPS4 fork translating GCN command buffers (libSceGnmDriver) and shaders to Vulkan, plus VideoOut, AvPlayer andshim/(SDL3 window, overlay, Insert menu, upscalers, post-processing).
Ports keep only their game: runtime_<slug>*.c, patches, profile, launcher, icon, docs.
See the tree above. CORE_MANIFEST lists what is core (include globs, ! excludes, @ submodules) and drives core_sync.py; CORE_SOURCE records which port commit each part came from. Paths under port/ and scripts/ are identical to a port repo; root docs/ and tools/ belong to ps4_core only. Submodules: same commits as infamous main, upstream URLs in .gitmodules.
Per game: runtime_<slug>*.c, game_<slug>.c and profile.ini (templates in port/games/), <slug>_patches.py, port.env, icon, README-player.md, windows/*.rc, launchers, run/test scripts, README, docs, CI, dump/, game/. import_names.inc is a union of every game's imports (runtime_lookup resolves by name; a missing name is an unlinked function, an extra one costs nothing).
Today each port carries a copy kept in step with tools/core_sync.py. Plan: (1) the core as a submodule at port/core, thin port build files; (2) done (branch feat/game-hooks): game hooks through the RuntimeGame table (port/src/runtime_game.h), defined by the port in src/game_<slug>.c; build.sh/CMake pick PORT_GAME, else PORT_SLUG from packaging/port.env, else the only src/game_*.c, else src/game_none.c (core-only build). A new game needs only src/game_<slug>.c (+ optional src/runtime_<slug>.c), port.env and profile.ini; (3) done: event flags (runtime_eventflag.c) and the shared kernel queries, time zone, unwind info, PRT aperture, heap trace, DiscMap, LoadExec, PlayGo dialog and ErrorDialog (runtime_system.c) moved out of runtime_tlg.c/runtime_gr2.c; ports drop their copies with port/games/migration/<port>.patch; (4) core fixes land here and each port bumps the core in its own tested PR. Details: docs/GAME_HOOKS.md.
- Core defaults (core code). 2. Game profile (
port.envidentity +PORT_ENV_PREFIX,profile.inidefaults: readback mode, VRAM budget,block1d, skip-adjacency, FPS patches, motion/touchpad, mouse map, upscaler). 3. Game code (runtime_<slug>*.c,game_<slug>.c, patches). 4. Player choices (launcher and Insert menu, saved per game). Precedence: core < game profile < player; environment variables override everything, for testing only. Profile loader (done,port/src/runtime_profile.c), knowing no game: at the start ofmainit readsprofile.ini(TLG_PROFILE, elseruntime_game.profilein the working directory, next to the executable or one level up) and fills eachTLG_*the profile sets and nobody set before, so core < profile.ini < launcher/player < environment;[settings]gives defaults fortlg.inikeys (read before the player'stlg.ini). Keys:tsc(host|process|auto),tsc_auto_threshold,readbacks,eager_readback,write_merge,gc_budget_mb,block1d,skip_adjacency,pipeline_binaries,mouse_buttons,motion_button,stick_deadzone, plus[env]for any otherTLG_X.
Env prefix plan: now per game — TLG_ (The Last Guardian), GR2_ (Gravity Rush 2), ISS_ (inFAMOUS Second Son): the prefix comes from runtime_game.env_prefix ("ISS_" in game_infamous.c) or, overriding it, PORT_ENV_PREFIX="ISS_" in port/packaging/port.env, build.sh compiles tlg-probe with -DPORT_ENV_PREFIX="ISS_" (CMake option on Windows), and probe.calias_port_environment() copies each ISS_X to TLG_X at start unless TLG_X is set; no define = no alias. Later a common PSCORE_ prefix for core settings once every port consumes ps4_core (lookup <PREFIX>_X, PSCORE_X, then TLG_X, old name logged once). Internal names (tlggpu, tlg-probe, TLG_SHADER_CACHE_KEY) stay.
Per-game choices still in the launchers: TSC — host rdtsc with measured frequency by default, TLG_TSC=process for the process clock; games that execute rdtsc directly (inFAMOUS, 391 sites) must use the host rdtsc (profile tsc=auto counts 0F 31 in the prepared eboot's code at load and picks host at 64+ sites, logging it: TLG 642, GR2 453, inFAMOUS 391 → host, as today; KNOWN_ISSUES #15). Eager readback + write merge (TLG_EAGER_READBACK, TLG_WRITE_MERGE) are off in the core and on by default only in inFAMOUS; CPU writes merged without a fault mark the eager copies stale so an old copy never overwrites the game's new bytes (#16).
Core-only build: cd port && flock -x <lock> env TLG_LTO=OFF bash build.sh --test links src/game_none.c and runs the C tests (packaging still needs a game's port.env, icon and .rc). To test a core change on a game, bring it into the port (with its game_<slug>.c) and build there under the lock. The GPU library (cmake -S port/gpu) does not need game files on Linux. Dependencies: Vulkan, SDL3, FFmpeg, FreeType, Zydis; Windows via MSYS2 CLANG64. Shader cache <saves>/cache/<TITLE_ID>-<key> (the probe's --user folder on Linux and Windows, never the shadPS4 emulator's ~/.local/share/shadPS4; the current key's folder is moved from the old location once, other keys are pruned), key = SHA-1 of the recompiler sources: same core, same key in every game; a recompiler change invalidates old caches automatically. The launcher's Clear shader cache button (or ./run_tlou.sh --clear-shader-cache) deletes only this game's cache.
- One game at a time, one lock: the game never runs with a build, Ghidra or another instance; everything (ps4_core builds and tests included) goes through
flock -x /tmp/claude-1000/-home-hayatog-decomp/79f27d1d-d3f5-4a2e-a5f3-511e01385ae2/scratchpad/game.lock; one build at a time; at most two agents.core_sync.pyandlist_exports.pyonly read and need no lock. - Never Sony files in git. The ports'
link.json/analysis.jsonare only read bylist_exports.py. - No remote, no push. Ports only get
git fetch originfrom here (never push, never a branch switch). - Commits as
HayatoG <[email protected]>with theCo-Authored-By/Claude-Sessiontrailers.
--status-all [--fetch] (table of the three ports vs origin/main), --ref, --diff, --pull (copies port-newer and port-only, plus diverged with --force, into the working tree for review). States: port-newer, port-only, diverged, core-newer (port behind; checked against this history and the pinned commits in CORE_SOURCE), core-only, submodule. Status on 2026-10-14 after the infamous_pc fd78ad5 sync: no port has core work missing here; tlg_pc 639d6ce 102 behind (73 core-newer, 29 core-only), gr2_pc 4f5958f 124 behind (81 + 43), infamous_pc fd78ad5 41 behind (25 + 16: SMAA/CAS, mouse, presenter, PORT_ENV_PREFIX; inFAMOUS must add PORT_ENV_PREFIX="ISS_" to its port.env when it takes this core).
tools/list_exports.py -o docs/LIBRARIES.md regenerates the library catalogue; scripts/sce_imports.py lists a new game's imports per library.