Skip to content

v0.0.203

Choose a tag to compare

@github-actions github-actions released this 05 Oct 09:57
· 54 commits to main since this release
6574861

rePIU v0.0.203

이전 릴리스 v0.0.200 이후의 변경입니다(Tasks 771–773, issue #4·#6). v0.0.201은 릴리스 빌드가 실패해 올라가지
않았고, v0.0.202는 문서 규칙만 바뀌었으므로 여기에 함께 적습니다. Linux i386이 크게 빨라졌고(pumpit1 60초 프레임
약 1,990 → 3,190), 창을 최소화해도 게임 시간이 늦어지지 않습니다.
명령줄에서 화면 shader를 고를 수 있습니다.

해결된 issue

issue 내용 커밋
#6 direct 모델(i386): 숨겨진 창이 vsync swap을 막는 동안 타이머 tick이 버려짐 6574861
#4 task를 GitHub issue로 관리하고 main 머지는 squash merge한 PR로 dcc73e5

issue로 바꾸기 전의 작업: Task 771 77117bf(v0.0.201), Tasks 772–773 6574861(v0.0.203에 함께 들어감).

새로 들어온 것

Linux i386 Glide 호출 연결 (Task 773). Linux i386에서는 코드 캐시가 0xE8000000 근처에 있어, 게임의 Glide 호출을
gate로 바로 잇는 call rel32를 한 번도 쓰지 못했습니다. 그래서 Glide 호출마다 약 160 µs가 드는 경계 처리를 거쳤습니다.
32비트 명령 포인터는 2^32에서 감기므로, 이제 감은 변위를 씁니다. Windows는 캐시가 낮은 주소에 있어 원래 이 문제가
없었습니다.

  • pumpit1 60초: 약 1,990 → 3,190프레임(vsync 끔: 2,100 → 53,197), 게스트 스레드 CPU 99.4% → 16.3%.
  • pumpit8 60초: 439 → 3,288프레임.

최소화한 창에서도 게임 시간 유지 (#6). 창이 숨겨지면 컴포지터가 vsync swap을 약 1초에 한 번으로 늦춥니다. Linux
i386은 그동안 밀린 타이머 tick을 버려 게임 시간이 늦어졌습니다(12초 최소화에 4,200개 이상). 이제 swap 대기가 50 ms를
넘으면 기다리는 동안에도 tick을 전달합니다. 창이 보일 때의 동작과 프레임은 그대로입니다.

  • 12초 최소화에서 버려진 tick: pumpit1 4,456 → 21, pumpitea 4,451 → 54.
  • Windows는 최소화해도 swap이 막히지 않아 원래 tick을 대량으로 버리지 않았습니다. 같은 경로가 켜지지만 동작은 같습니다.

명령줄에서 화면 shader 고르기 (v0.0.201, Task 771). repiu pumpit1 --post-shader crt(또는 --post-shader=crt).
REPIU_POST_SHADER와 런처 설정보다 우선합니다. 값이 없으면 오류로 끝납니다.

새 스위치 (설정하지 않으면 기본 동작)

  • --post-shader <id> — 그 실행의 화면 shader.
  • REPIU_GLIDE_SWAP_WAIT_TICKS=0 — swap 대기 중 tick 전달을 끕니다(이전 동작).
  • REPIU_GLIDE_SWAP_WAIT_TICK_HOLD_MS — 전달을 시작하기까지 기다리는 시간. 기본은 direct 모델(Win32, Linux i386)
    50 ms, Linux x64 0 ms.

확인한 것

구성 확인
Linux i386 Release (Ubuntu 26.04, RTX 4090, x11) core probe, pumpit1·pumpit8·pumpitea 정상 실행과 12초 최소화, 켜고 끈 설정 교대 비교
Linux x64 Debug (같은 머신) 빌드, core probe, pumpit1 회귀 없음, --post-shader 세 경우, 전체화면 왕복(Wayland·x11), v0.0.200 아카이브
Win32 x86 Release (Windows 11) 빌드, 새 probe 두 개(core·AOT), pumpit1·pumpit8·pumpitea 정상 실행과 12초 최소화, 보류 0 ms 부하 시험(주입 3,804회, 프레임 같음)
Win32 x86 Debug (CI) 빌드와 probe

알려진 것

  • Linux i386 + Wayland(NVIDIA)에서 창을 만들지 못합니다(#7).
    32비트 Wayland 라이브러리가 설치되어 있으면 SDL이 Wayland를 고르고 EGL surface 생성에 실패합니다. 지금은
    SDL_VIDEO_DRIVER=x11로 실행하십시오.
  • Win32 Release core probe의 stack_bridge_contract=false는 probe 쪽 문제로 보고 #8에서
    추적합니다.
  • 게임의 Glide 호출 중 간접 호출(약 1.5%)은 여전히 경계 처리를 거칩니다.
  • v0.0.200의 "알려진 것"(Linux 창 크기 변경 직후 한 프레임, WSLg Wayland 전체화면 해제)은 그대로입니다.

rePIU v0.0.203

Changes since the previous release, v0.0.200 (Tasks 771–773, issues #4 and #6). The v0.0.201 release
build failed and was never published, and v0.0.202 changed only documentation rules, so both are described
here. Linux i386 is much faster (pumpit1 from about 1,990 to 3,190 frames in 60 s), and minimising the
window no longer slows the game's time.
The screen shader can be chosen on the command line.

Resolved issues

Issue Summary Commit
#6 Direct model (i386): timer ticks dropped while a hidden window blocks the vsync swap 6574861
#4 Tasks as GitHub issues, and main merges through squash-merged pull requests dcc73e5

Work from before the switch to issues: Task 771 77117bf (v0.0.201), Tasks 772–773 6574861 (part of
v0.0.203).

New

Glide calls linked on Linux i386 (Task 773). On Linux i386 the code cache sits near 0xE8000000, so the
call rel32 that links a game's Glide call straight to its gate was never written, and every Glide call took
a boundary path costing about 160 µs. A 32-bit instruction pointer wraps at 2^32, so the wrapped displacement
is now written. Windows, whose cache sits low, never had this problem.

  • pumpit1, 60 s: about 1,990 → 3,190 frames (vsync off: 2,100 → 53,197); guest thread CPU 99.4% → 16.3%.
  • pumpit8, 60 s: 439 → 3,288 frames.

Game time kept while the window is minimised (#6). A hidden window has its vsync swaps slowed by the
compositor to about one a second, and Linux i386 dropped the timer ticks that piled up meanwhile, so the
game's time fell behind (more than 4,200 in 12 s minimised). Once a swap wait passes 50 ms, ticks are now
delivered during the wait. Behaviour and frames with a visible window are unchanged.

  • Ticks dropped in 12 s minimised: pumpit1 4,456 → 21, pumpitea 4,451 → 54.
  • Windows does not block the swap of a minimised window, so it never dropped ticks in bulk. The same path
    is on there, with the same behaviour.

Screen shader on the command line (v0.0.201, Task 771). repiu pumpit1 --post-shader crt (or
--post-shader=crt). It wins over REPIU_POST_SHADER and the launcher setting; a missing value is an error.

New switches (default behaviour when unset)

  • --post-shader <id> — the screen shader for that run.
  • REPIU_GLIDE_SWAP_WAIT_TICKS=0 — turns off tick delivery during the swap wait (the earlier behaviour).
  • REPIU_GLIDE_SWAP_WAIT_TICK_HOLD_MS — how long a wait lasts before delivery starts. Defaults to 50 ms on
    the direct model (Win32, Linux i386) and 0 ms on Linux x64.

Verified

Configuration Check
Linux i386 Release (Ubuntu 26.04, RTX 4090, x11) core probe, normal runs and 12 s minimised runs of pumpit1, pumpit8 and pumpitea, alternating with the switch off
Linux x64 Debug (same machine) build, core probe, no regression in pumpit1, three --post-shader cases, fullscreen round trips (Wayland and x11), the v0.0.200 archives
Win32 x86 Release (Windows 11) build, the two new probes (core and AOT), normal runs and 12 s minimised runs of pumpit1, pumpit8 and pumpitea, a 0 ms hold stress run (3,804 injections, same frames)
Win32 x86 Debug (CI) build and probes

Known

  • Linux i386 on Wayland (NVIDIA) cannot create its window (#7).
    With the 32-bit Wayland libraries installed, SDL picks Wayland and fails to create the EGL surface. Run
    with SDL_VIDEO_DRIVER=x11 for now.
  • The Win32 Release core probe's stack_bridge_contract=false looks like a problem in the probe and is
    tracked in #8.
  • Glide calls the game makes indirectly (about 1.5%) still take the boundary path.
  • v0.0.200's known issues (one frame right after a Linux window resize, leaving fullscreen on WSLg Wayland)
    remain.