mirror of
https://github.com/djhackersdev/bemanitools.git
synced 2025-02-25 14:25:20 +01:00
doc: Dev journal entry about IIDX engine and syncbook
Due to recent development of tools and discussions, this is something that came up and has probably been overdue for ages. Document key concepts of how the iidx engine works regaring rendering, game loop and (song) sync. Add a “syncbook” that provides context and guidelines how to configure any (modern) system to work properly with iidx.
This commit is contained in:
parent
ce1a004bf6
commit
19f0776627
319
doc/dev/journal/2025-02-09-iidx-engine.md
Normal file
319
doc/dev/journal/2025-02-09-iidx-engine.md
Normal file
@ -0,0 +1,319 @@
|
||||
# IIDX engine overview and how game-play is impacted by hardware and software
|
||||
|
||||
Date: 2025-02-09 Author: icex2
|
||||
|
||||
This document provides information and explains the following:
|
||||
|
||||
* A sort-of taxonomy of the different major IIDX game engine versions
|
||||
* How the core game-play part of the engine works regarding
|
||||
* Threading model
|
||||
* Main render loop
|
||||
* Timing and synchronization
|
||||
|
||||
The goal is to capture key knowledge about how the game's engine works to enable a better
|
||||
understanding for developing bemanitools and how certain features can impact performance and
|
||||
synchronization during game-play.
|
||||
|
||||
This document is not claiming to be complete or 100% accurate. It is based on my own personal
|
||||
research and understanding of the IIDX game engine. It is very likely that some of the information
|
||||
is wrong or misunderstood. Feel free to raise any questions or concerns in an issue as I want
|
||||
this document to be as accurate as possible.
|
||||
|
||||
## Taxonomy of IIDX game engine versions
|
||||
|
||||
With every version, there have been numerous changes and improvements to the game engine. The
|
||||
following is a rough taxonomy that is focused on cabinet and hardware changes. As these are likely
|
||||
the main driver for key changes to the software and game engine, they create fairly distinct
|
||||
stages throughout the different versions of the game. The key attributes to be considered here are:
|
||||
|
||||
* Main PCB
|
||||
* IO board
|
||||
* Monitor
|
||||
|
||||
All of these had significant impact on key software features appearing or changing.
|
||||
|
||||
### Twinkle hardware era: 1st Style to 8th Style
|
||||
|
||||
* [Twinkle PCB](https://github.com/shizmob/arcade-docs/blob/main/konami/boards.md#twinkle)
|
||||
* [Original rear projection monitor](https://github.com/shizmob/arcade-docs/blob/main/konami/products.md#iidx-rear-projection-monitor)
|
||||
* Homogenous hardware and software
|
||||
|
||||
### 1st gen PC-based upgrade only: 9th Style
|
||||
|
||||
* 9th Style came as an upgrade kit only to existing twinkle-based cabinet hardware
|
||||
* [KNM-845G3-A02 PCB](https://github.com/shizmob/arcade-docs/blob/main/konami/boards.md#knm-845g3-a02)
|
||||
* [C02 EZUSB FX USB IO board](https://github.com/shizmob/arcade-docs/blob/main/konami/io.md#gec02-pwbaa)
|
||||
* Magnetic card readers connected to ezusb IO board
|
||||
|
||||
### 1st gen PC-based with dedicated cabinet: 10th Style to DistorteD (13)
|
||||
|
||||
* From here on, old cabinets that received the "Twinkle hardware" upgrade kit could always receive software only
|
||||
upgrades
|
||||
* [CRT monitor](https://github.com/shizmob/arcade-docs/blob/main/konami/products.md#iidx-crt-monitor) with new dedicated
|
||||
cabinets
|
||||
* [D01 EZUSB FX USB IO board](https://github.com/shizmob/arcade-docs/blob/main/konami/io.md#d01-io)
|
||||
* Slotted card readers starting version 13
|
||||
|
||||
### 2nd gen PC: GOLD (14) to Lincle (19)
|
||||
|
||||
* [FAB-e945-KN205](https://github.com/shizmob/arcade-docs/blob/main/konami/boards.md#fab-e945-kn205)
|
||||
* All prior cabinet configurations can be upgraded with a PCB and software upgrade
|
||||
* New LCD monitor starting version 15
|
||||
* Further variants of the LCD monitor appear starting version 18
|
||||
* [IO2 EZUSB FX2 USB IO board](https://github.com/shizmob/arcade-docs/blob/main/konami/io.md#usbio2) introduced with
|
||||
version 14
|
||||
* Switch to wave pass readers on version 19
|
||||
|
||||
### 3rd gen PC: Tricoro (20) to Sinobuz (24)
|
||||
|
||||
* All prior cabinet configurations can be upgraded with a PCB and software upgrade
|
||||
* [ADE-HM65](https://github.com/shizmob/arcade-docs/blob/main/konami/boards.md#hm65)
|
||||
* Game engine supports HD mode (720p)
|
||||
* Many new LCD monitor variants appear with every new version
|
||||
|
||||
### 4th gen PC: CANNON BALLERS (25) to RESIDENT (30)
|
||||
|
||||
* All prior cabinet configurations can be upgraded with a PCB and software upgrade
|
||||
* [ADE-6291](https://github.com/shizmob/arcade-docs/blob/main/konami/boards.md#ade-6291)
|
||||
* [BIO2 IO board](https://github.com/shizmob/arcade-docs/blob/main/konami/boards.md#hm65)
|
||||
* Upgrade cabinets required the [BIO2 sub-IO board](https://github.com/shizmob/arcade-docs/blob/main/konami/io.md#bio2-ldj-sub-io)
|
||||
* Drop of SD mode support starting version 27
|
||||
* Supporting 120 hz monitors starting version 27
|
||||
* Many new LCD monitor variants appear with every new version
|
||||
* 42" 120 hz for lightning cabinets starting version 27
|
||||
* 42" 60 hz for non-lightning cabinets starting version 25
|
||||
|
||||
### 5th gen PC: RESIDENT (30) to EPOLIS (31)
|
||||
|
||||
* All prior cabinet configurations can be upgraded with a PCB and software upgrade
|
||||
* [C300-xonarae](https://github.com/shizmob/arcade-docs/blob/main/konami/boards.md#c300-xonarae)
|
||||
* Game engine supports FHD mode (1080p)
|
||||
|
||||
## Threading model and core responsibilities in PC-based games
|
||||
|
||||
Since the early days of 9th Style to today (as of time of writing this: EPOLIS), the threading model
|
||||
hasn't changed significantly:
|
||||
|
||||
* Main and rendering thread
|
||||
* Runs your typical D3D9 render loop
|
||||
* Using D3D9ex starting version 27
|
||||
* Starting and managing other threads
|
||||
* Any file and game asset loading
|
||||
* Handles all the core game logic of the different screens starting from the initial boot screen
|
||||
to the core game-play screen
|
||||
* IO thread
|
||||
* Polls the main IO hardware and synchronizes the in-memory input and output state with the
|
||||
hardware
|
||||
* Executes commands issued by the main thread to the IO board such as dongle or card reader
|
||||
commands (ezusb generation of IO only)
|
||||
* Card reader thread (not applicable to versions 9 to 12)
|
||||
* Runs the protocol to read/write the hardware of the readers
|
||||
* Async execution of higher level commands issued by the main thread to the card reader hardware,
|
||||
e.g. card read, card eject etc.
|
||||
* Audio thread
|
||||
* Streaming of audio data to the sound API
|
||||
* DirectSound for versions 9 to 26
|
||||
* WASAPI for versions 27 to 30 for non-lighting cabinets with ADE-6291 hardware
|
||||
* ASIO for versions 27 and newer for lighting cabinets
|
||||
* ASIO for version 30/31 and newer for non-lighting cabinets with C300-xonarae hardware
|
||||
* Async execution of higher level commands issued by the main thread to the audio backend, e.g.
|
||||
play audio, stop audio, etc.
|
||||
* Network thread
|
||||
* Network plumbing with the xrpc protocol
|
||||
* Async execution of request-response commands issued by the main thread
|
||||
|
||||
## Main and rendering thread
|
||||
|
||||
With the game having transitioning to different screens throughout it's lifecycle, the main render
|
||||
loop might contain different logic such as asset loading. The following focuses on the main
|
||||
game-play screen, only. Common rendering logic still applies to other screens.
|
||||
|
||||
This follows your typical D3D9 single threaded rendering loop which boils down to the following:
|
||||
|
||||
* Begin the scene (`BeginScene`)
|
||||
* Set the render target (`SetRenderTarget`)
|
||||
* Clear the back buffer (`Clear`)
|
||||
* Run engine step. This includes and is mixed with
|
||||
* IO input evaluation
|
||||
* Game engine state and (re-) drawing the scene
|
||||
* Commands to the audio playback, e.g. play key sounds
|
||||
* Setting IO outputs
|
||||
* End the scene (`EndScene`)
|
||||
* Target a minimum frame time
|
||||
* Introduced with version 11
|
||||
* Sleep (`Sleep` or `SleepEx`) to fill up the frame up to either 13 ms or 14 ms (depending on the
|
||||
version)
|
||||
* This was likely introduced to not have the game run at hundreds of FPS if v-sync was disabled
|
||||
(probably when running in window mode for development/testing purposes)
|
||||
* Swapping the back buffers (`Present`)
|
||||
* D3D9 is configured with v-sync enabled by default and targets 60 hz
|
||||
* With this configuration, the call to `Present` fills up the remaining frame time to target the
|
||||
configured 60 hz refresh rate
|
||||
|
||||
### Rendering resolutions
|
||||
|
||||
The game engine went through a couple of different rendering resolutions:
|
||||
|
||||
* 640x240: version 1 to 8 (all twinkle hardware)
|
||||
* 640x480: version 9 to 19 (1st and 2nd gen PC-based)
|
||||
* 1280x720 (HD mode) and 640x480 (SD mode): version 20 to 27 (3rd and 4th gen PC-based)
|
||||
* 1280x720 (HD mode) only for version 28 to 29 (4th gen PC-based)
|
||||
* 1280x720 (HD mode) and 1920x1080 (FHD mode) for version 30 (4th gen PC-based)
|
||||
* 1920x1080 (FHD mode) only for version 30+ (5th gen PC-based)
|
||||
|
||||
## Core engine timing and synchronization
|
||||
|
||||
The following outlines and explains the core engine concepts related to timing and synchronization.
|
||||
|
||||
### The origins, twinkle hardware
|
||||
|
||||
* It appears that the game has been on the same codebase since it's inception.
|
||||
* This can be reasoned by the following observations
|
||||
* 9th style as the first PC-based game very buggy on initial release
|
||||
* 9th style threading model very clunky with various thread settings showing they tried to
|
||||
prioritize different processing on a single core CPU
|
||||
* Coming from twinkle hardware that is a realtime system vs. a Windows XP system
|
||||
* Fixed playstation 1 based hardware with a refresh rate of
|
||||
[59.8260978565 hz](https://github.com/mamedev/mame/blob/bf9df04e005697788ae988ef5aea91a1878fd631/src/devices/video/psx.cpp#L435)
|
||||
* No need to assume getting anything else if the resource budget per frame is not exceeded
|
||||
* All sub-systems were driven synchronously to that fixed time step
|
||||
* No need for the engine to synchronize audio during the song. When the song is started
|
||||
correctly, it stayed sync throughout the song
|
||||
* Observations and assumptions
|
||||
* It appears the developers struggled a lot with the significant platform shift to PC as indicated
|
||||
by various core engine improvements throughout the years still
|
||||
* Switches of hardware generations further complicated the situation as these forced them to further
|
||||
drift away from how the game engine was initially designed on the twinkle system
|
||||
|
||||
### Frame time/timing and engine step
|
||||
|
||||
* The game's engine step and timing is frame based
|
||||
* The main render loop defines the minimum valid timing window for the game engine to be able to
|
||||
evaluate
|
||||
* 60 hz/fps = 16.667 ms (rounded to three decimal places)
|
||||
* 120 hz/fps = 8.333 ms (rounded to three decimal places), only relevant for lightning cabinets with their 120 hz
|
||||
screen/mode
|
||||
* Depending on the GPU hardware and configuration, the GPU might drive the screen not exactly at
|
||||
perfectly 60 hz/fps = 16.667 ms
|
||||
* As outlined in the [main render loop](#main-and-rendering-thread), the `Present` call is the
|
||||
key function call to determine the frame time for the game engine
|
||||
* Just having v-sync enabled and telling D3D9 to **target** 60 hz, it still depends on how the GPU
|
||||
driver is implemented and how the GPU driver's implementation of D3D9 executes on the `Present`
|
||||
call
|
||||
* This is primarily determined by how the GPU driver is operating and driving connected display
|
||||
hardware
|
||||
* The following factors can contribute to that either directly or indirectly
|
||||
* Different monitor types analog vs. digital (CRT vs. LCD)
|
||||
* Different monitor connections VGA vs. DVI/HDMI/DP
|
||||
* Different GPU drivers
|
||||
* Different GPU hardware and vendors
|
||||
* Different GPU settings
|
||||
|
||||
### Monitor check screen
|
||||
|
||||
The monitor check screen was introduced with version 14. This was a solution to the problem of not
|
||||
guaranteeing a single fixed refresh rate throughout different GPU and monitor combinations. See
|
||||
a detailed explanation in the previous sub-subsection about
|
||||
[what influences the frame time](#frame-timetiming-and-engine-step) of the game.
|
||||
|
||||
The goal of the monitor check is to measure the frame time of the main render loop and use the
|
||||
results for [driving the core engine step](#engine-step-and-synchronization).
|
||||
|
||||
The monitor check evolved slightly as different GPU and monitor hardware, and GPU drivers yielded
|
||||
varying refresh rates that determined the frame times of the main game loop.
|
||||
|
||||
Actual values are outlined further down in the [engine step time](#engine-step-time) section.
|
||||
|
||||
There are two main versions of the monitor check, all of them have always been part of the boot
|
||||
process:
|
||||
|
||||
* 14
|
||||
* Measures a total of 3000 frames
|
||||
* If total time this took < 50004 ms -> so average of 16.668 ms per frame = 59.9952 hz
|
||||
* S-Video mode -> 59.95 hz (also shows S-VIDEO when the monitor check completes)
|
||||
* Otherwise VGA mode -> 60.05 hz
|
||||
* If VGA is determined, the game patches the chart event data when loading
|
||||
* `event_timestamp * 0.99817199 + 0.40000001`
|
||||
* When S-Video no charts are patched and the timing data in the chart is used as is
|
||||
* 15 to 18
|
||||
* Identical to 14 except that chart patching now happens in milliseconds instead of frames
|
||||
* VGA mode: `16.65279`
|
||||
* S-Video mode: `16.680567`
|
||||
* `event_timestamp * (1.0 / frame_time) + 0.40000001)`
|
||||
* 19
|
||||
* Identical to previous version
|
||||
* Monitor check screen shows current FPS on the last revision of that version. However, it doesn't
|
||||
use the value shown there by any means. Assuming this was added before the introduction of the
|
||||
new monitor check on 20.
|
||||
* 20 to 26
|
||||
* Runs on boot or when switching monitor modes SD vs. HD
|
||||
* Measures only 1200 frames
|
||||
* Takes the average refresh rate of 1200 frames
|
||||
* Applies the measured avg. frame time directly to the charts before song
|
||||
* 27 to 30
|
||||
* Frame rate measuring identical to prior versions
|
||||
* Added additional logic after the frame time measurements for handling of 120 hz displays
|
||||
* Includes checking the monitor and if the framerate matches as expected
|
||||
* 30/31 LDJ-010 upgrade
|
||||
* Added NvDisplayConfigLDJ tool which runs on system start and configures a custom timing in the
|
||||
NVIDIA GPU driver to ensure a fixed monitor refresh rate
|
||||
* 31
|
||||
* Same code as before
|
||||
* Consider the first 460 frames of the measurement as warm-up frames
|
||||
* Discard these for the actual measurement to get more stable frame times
|
||||
* Use a base avg. value of 119.982 for the 120 hz monitors and 59.9 for 60 hz monitors. Further
|
||||
frames measured are counted towards the average with the given base value
|
||||
|
||||
### Engine core game-play with visual and audio synchronization
|
||||
|
||||
#### Chart data
|
||||
|
||||
* Chart data encodes note timing and timing window information
|
||||
* Chart data consists of *note events* encoding a timestamp and note information such as type
|
||||
and key-sound information
|
||||
* Timing windows are defined per chart
|
||||
* Most infamous example: GAMBOL (7Key/Another)
|
||||
* Game engine timestamp evaluation and note event timestamp encoding
|
||||
* 9 to 14: Refresh rate in hz
|
||||
* 15 to 31: Milliseconds (equivalent to assuming 1000 fps)
|
||||
* Fundamentally, that doesn't change game play experience as it's just a different way of
|
||||
evaluating the timestamps since refresh rate in hz/frame rate in fps can be converted lossless to
|
||||
frame time in ms
|
||||
|
||||
#### Engine step time
|
||||
|
||||
The engine uses the following source for frame rate/time to drive internal logic on the following
|
||||
versions
|
||||
|
||||
* 9 to 13: Hardcoded 59.95 hz
|
||||
* 14: Either 59.95 hz or 60.05 hz determined by which value is determined to be closer to the
|
||||
measured one during the monitor check screen on startup
|
||||
* 15 to 19: 59.95 hz or 60.05 hz
|
||||
* Monitor check on startup measures the frame time and picks the value closest to what's been
|
||||
measured
|
||||
* Monitor check result can be overridden with the *Output Type* setting in the operator menu
|
||||
* *S-Video* to force to 59.95 hz
|
||||
* *VGA* to force to 60.05 hz
|
||||
* 20 to 31: Monitor check on boot determines the frame time and uses the result throughout the
|
||||
entire game session
|
||||
|
||||
#### Engine step and synchronization
|
||||
|
||||
Per frame engine step advancing and synchronization during game-play
|
||||
|
||||
* Game-play needs synchronization of the following aspects
|
||||
* Drawn content on the screen
|
||||
* Background audio playback track
|
||||
* Key sound effects
|
||||
* The game engine synchronizes these only at the start of a song
|
||||
* It takes known/determined refresh rate/frame time as the fixed time for every frame cycle
|
||||
throughout the entire song
|
||||
* It starts playback of the background audio track together with playback of the chart data
|
||||
* With every engine step/frame it advances internal calculations by that fixed amount of time.
|
||||
Thus, the game engine expects this to be constant/stable throughout an entire song
|
||||
* The chart data is advanced every frame by the engine
|
||||
* Key sound events are turned into audio playback on command as the chart advances
|
||||
* No re-synchronization or check-pointing between main rendering thread and audio is happening
|
||||
throughout the song
|
||||
* Remark: The above does not consider any kind of offsetting and timing adjustments for the sake
|
||||
of keeping this simple and focus on the absolute core concepts
|
224
doc/iidxhook/iidx-syncbook.md
Normal file
224
doc/iidxhook/iidx-syncbook.md
Normal file
@ -0,0 +1,224 @@
|
||||
# IIDX "Syncbook": A guide to ensuring sync and performant gameplay
|
||||
|
||||
This is a guide applicable to all IIDX versions that are native Windows PC-based. The goal is to
|
||||
enable proper configuration of those games to ensure the game engine "runs in-sync" with any of its
|
||||
IO (visual GPU/display output, audio output, user input) resulting in high and stable performance
|
||||
for smooth game-play.
|
||||
|
||||
This document won't go into the implementation details of the game engine. Please refer to the
|
||||
[IIDX engine details journal](../dev/journal/2025-02-09-iidx-engine.md) for a more in-depth
|
||||
information.
|
||||
|
||||
## Understanding the problems and options to address them
|
||||
|
||||
First, let's understand what the key problems are and how they contribute to different issues
|
||||
that impact game-play.
|
||||
|
||||
### Song de-syncing
|
||||
|
||||
Symptom: Throughout playing a song, the audio is de-syncing even it was fine when the song started.
|
||||
|
||||
Cause: The game engine is fundamentally designed to run on a fixed and consistent frame
|
||||
rate/time per engine step. A mismatch of expected frame time by the game engine and actually delivered
|
||||
frame time by the GPU driver. This can come either as a stable frame time that just mismatches in
|
||||
general or (highly) fluctuating frame times.
|
||||
|
||||
* G-sync on modern displays causes known fluctuations because it adjusts dynamically the monitor
|
||||
refresh rate
|
||||
* V-sync not correctly configured/enforced or even vsync-off override in driver is causing
|
||||
inconsistent frame times
|
||||
* Incorrect display timings causing refresh rate fluctuations resulting in inconsistent frame times
|
||||
|
||||
Stable frame times but not having the correct ones that the game engine expects is a different
|
||||
problem that can be addressed by:
|
||||
|
||||
* Knowing the refresh rates expected by the game engine of the different game versions
|
||||
* Configuring your GPU driver's display timings to match the expected frame times
|
||||
* Or, patch the game's chart data with your custom display timings so the game engine gets uses
|
||||
*your* "correct" frame times
|
||||
* Note: Offline patching the chart data doesn't work for several game versions as the monitor
|
||||
check does override this data, but not as flexible as required
|
||||
* Use the chart patch feature of bemanitools instead
|
||||
|
||||
### Micro-stuttering and non-smooth note scrolling
|
||||
|
||||
This is a trickier problem as it can be caused by a few different things.
|
||||
|
||||
* GPU related
|
||||
* Fluctuating refresh rates result in fluctuating frame times in the main game loop
|
||||
* GPU power configuration in non-performance mode (e.g. "power saving") causes processing latency
|
||||
due to sleep states
|
||||
* Display related
|
||||
* Display firmware buggy and/or internal scalers that expect to run at very specific refresh rates
|
||||
and cannot adapt to any custom display timings enforced by the GPU
|
||||
* A known example is the official
|
||||
[PENDUAL LCD monitor](https://github.com/shizmob/arcade-docs/blob/6ac99975cdb2bf668362f65fa9fa3ffb2127308b/konami/product/GULDJ-JI.md#notes-and-known-issues) that does not v-sync correctly to any other refresh-rate than 60.000 hz
|
||||
* CPU related
|
||||
* CPU power configuration on Windows in non-performance mode (e.g. "power saving") causes
|
||||
processing latency due to sleep states
|
||||
* Correct CPU C-states configuration in BIOS/UEFI
|
||||
* These cannot be configured in Windows and are separate from Windows's power configuration
|
||||
* Other stuff running in the background of the system causing fluctuations
|
||||
* (Synchronous) Disk I/O heavy applications stealing CPU time
|
||||
* Or any other process creating a considerable amount of CPU or GPU load
|
||||
|
||||
## Configuration guide for different game versions
|
||||
|
||||
### Measuring monitor refresh rate
|
||||
|
||||
Let's start with configuring the system to meet the game engine's expectation regarding the
|
||||
target monitor refresh rate and requiring vsync.
|
||||
|
||||
First, use the [d3d9-monitor-check tool](../tools/d3d9-monitor-check.md) to measure the currently
|
||||
configured refresh rate of your monitor. Note that your monitor might yield different timings on
|
||||
different resolutions and different game versions run on
|
||||
[different rendering resolutions](../dev/journal/2025-02-09-iidx-engine.md#rendering-resolutions).
|
||||
|
||||
For example, the game version is 31 with the rendering resolution of 1920x1080 in FHD mode that you
|
||||
want to target:
|
||||
|
||||
```bat
|
||||
d3d9-monitor-check.exe cmdline refresh-rate-test 1920 1080 60
|
||||
```
|
||||
|
||||
The test shows the current monitor refresh rate and the average refresh rate over the course of
|
||||
the test. Check that the avg. refresh rate is stable during the measuring phase (during warm-up,
|
||||
it's ok if it fluctuates).
|
||||
|
||||
This test allows you to determine/check:
|
||||
|
||||
* Refresh rate/frame time fluctuations: if you see (high) fluctuations on the first or second
|
||||
decimal place
|
||||
* What's your current target refresh rate the GPU is driving your monitor at
|
||||
* If vsync isn't overridden by some other driver setting as you want to see a refresh rate around
|
||||
the 60 hz mark
|
||||
|
||||
### Measuring vsync issues
|
||||
|
||||
Some displays or the GPU configuration might lead to vsync issues which can be detected with the
|
||||
`d3d9-monitor-check.exe` tool as well.
|
||||
|
||||
```bat
|
||||
d3d9-monitor-check.exe cmdline vsync-test 1920 1080 60
|
||||
```
|
||||
|
||||
This runs a test with a VSYNC text that alternates red and cyan colors. If the text appears grey
|
||||
all the time, everything's fine. If you spot brief red or cyan text either occasionally or
|
||||
periodically, your current configuration has vsync issues resulting in skipped frames or old
|
||||
frames displaying longer.
|
||||
|
||||
### Configuration
|
||||
|
||||
The following are recommended configurations for the different game versions. If any of these
|
||||
don't work as expected, you have to troubleshoot and tweak these potentially. Please refer to the
|
||||
[guidelines above](#configuration-guide-for-different-game-versions) to understand how to use
|
||||
the tooling and test your changes.
|
||||
|
||||
#### Recommended configuration with NVIDIA GPU and driver
|
||||
|
||||
We want to achieve the following configuration on the GPU driver:
|
||||
|
||||
* Turn-off g-sync if you have a monitor that supports it
|
||||
* Disable power saving mode on GPU driver
|
||||
* V-sync is not forced off
|
||||
* Run the display on a target refresh rate of `59.950 hz` which has been determined to be
|
||||
[the most compatible across all PC-based versions](../dev/journal/2025-02-09-iidx-engine.md#engine-step-time).
|
||||
|
||||
##### Turn-off g-sync
|
||||
|
||||
Create a new GPU profile for IIDX, if it doesn't exist yet:
|
||||
|
||||
```bat
|
||||
nvgpu.exe profile create iidx
|
||||
```
|
||||
|
||||
Add the application names when the profile needs to be applied:
|
||||
|
||||
```bat
|
||||
:: For iidx versions 9 to 17
|
||||
nvgpu.exe profile application-add iidx bm2dx.exe
|
||||
:: For iidx versions 18+
|
||||
nvgpu.exe profile application-add iidx launcher.exe
|
||||
```
|
||||
|
||||
Disable G-SYNC for the profile:
|
||||
|
||||
```bat
|
||||
nvgpu.exe profile gsync-disable iidx
|
||||
```
|
||||
|
||||
##### Disable power saving mode
|
||||
|
||||
Set GPU power state to maximum for the profile (assumes you have a
|
||||
[GPU profile called `iidx` already created](#turn-off-g-sync)):
|
||||
|
||||
```bat
|
||||
nvgpu.exe profile gpu-power-state-max iidx
|
||||
```
|
||||
|
||||
##### Configure and verify target refresh rate of 59.950 hz and vsync
|
||||
|
||||
Get display ID of your primary display:
|
||||
|
||||
```bat
|
||||
nvgpu.exe display primary-display-id
|
||||
```
|
||||
|
||||
Copy the hex-value of the display ID and use it in the following commands.
|
||||
|
||||
Test the custom display timing first, e.g. for versions that run in 1920x1080
|
||||
(Replace `<DISPLAY_ID> ` with the primary display ID you got):
|
||||
|
||||
```bat
|
||||
nvgpu.exe display custom-resolution-test <DISPLAY_ID> 1920 1080 59.95 10
|
||||
```
|
||||
|
||||
This will test it for 10 seconds and then revert. If the result looked good, i.e. the screen didn't
|
||||
go blank or the display output was garbage, apply it:
|
||||
|
||||
```bat
|
||||
nvgpu.exe display custom-resolution-set <DISPLAY_ID> 1920 1080 59.95
|
||||
```
|
||||
|
||||
Test and verify the configuration is applied and works correctly:
|
||||
|
||||
```bat
|
||||
d3d9-monitor-check.exe cmdline refresh-rate-test 1920 1080 60
|
||||
```
|
||||
|
||||
Test if the enforced refresh rate is compatible with your display and vsync is working correctly:
|
||||
|
||||
```bat
|
||||
d3d9-monitor-check.exe cmdline vsync-test 1920 1080 60
|
||||
```
|
||||
|
||||
##### Alternative refresh rate configuration
|
||||
|
||||
If for some reason your display doesn't support 59.950 hz properly, i.e. display artifacts or vsync
|
||||
issues, you can use any other 60 hz compatible refresh rate, e.g. anything between 59.900 hz and
|
||||
60.100 hz that your display supports properly.
|
||||
|
||||
Follow the same steps [as above](#configure-and-verify-target-refresh-rate-of-59950-hz-and-vsync)
|
||||
but use a different refresh rate, e.g. 60.000 hz.
|
||||
|
||||
Verify using the `d3d9-monitor-check.exe` with the outlined steps if you need to play around to find
|
||||
a refresh rate that works for your setup.
|
||||
|
||||
For the game versions 9 to 19, you have to use the chart patch feature of bemanitools to patch
|
||||
the charts to your custom refresh rate. Otherwise, the game engine will run on your configured
|
||||
refresh rate, but it will take the non-matching refresh rate from the chart data which causes
|
||||
song de-syncing.
|
||||
|
||||
For example, to configure a refresh rate of 60.000 hz in the iidxhook config file:
|
||||
|
||||
```text
|
||||
gfx.monitor_check=60.000
|
||||
```
|
||||
|
||||
##### ATI/AMD
|
||||
|
||||
Currently, there is no tooling provided by bemanitools to configure the AMD GPU driver. The basic
|
||||
concepts of what needs to be configured still applies as outlined in the NVIDIA sections above
|
||||
though, e.g. through AMD's GPU control panel.
|
||||
|
||||
Further steps and instructions TBD
|
@ -146,16 +146,7 @@ This can be related to various issues:
|
||||
start "" /relatime "gamestart.bat"
|
||||
```
|
||||
|
||||
- Enforce v-sync enabled in your GPU settings.
|
||||
- Ensure that you have a constant refresh rate around the 60 hz (59.9xx or 60.0xx) that is not
|
||||
jumping around. Use the timebase feature of one of the newer games to check that or enable
|
||||
iidxhook's timebase and check the log output for the determined value. Run this a few times and
|
||||
check if the results differ.
|
||||
- Use iidxhook's frame rate limiter feature (see further below) to software lock the refresh rate.
|
||||
This might be necessary on Windows 7 and newer for D3D8 games, e.g. iidx 9 to 12, which seem to
|
||||
ignore GPU side v-sync.
|
||||
- Use iidxhook's auto timebase feature (see further below) or set a pre-determined value to cut down
|
||||
start-up times.
|
||||
Also refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
### The game still stutters (randomly) and drifts off-sync
|
||||
|
||||
@ -173,9 +164,7 @@ This can be caused by:
|
||||
|
||||
## My songs are offsync
|
||||
|
||||
- Make sure your machine's refresh rate is stable
|
||||
- If you don't get a close to 59.94hz refresh rate, use the software monitor check/auto timebase
|
||||
that's built into iidxhook (refer to help/config file)
|
||||
Refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## The game crashes instantly (10th, RED, HAPPY SKY)
|
||||
|
||||
@ -233,6 +222,8 @@ file) or use a CLVSD.ax codec which has the debugger checks removed.
|
||||
|
||||
## I used the auto timebase option and/or limited my refresh rate but the songs are still going offsync
|
||||
|
||||
Refer to the [iidx-syncbook](iidx-syncbook.md) if you haven't already.
|
||||
|
||||
There aren't many options left. The old games were developed for specific hardware and are not
|
||||
guaranteed to work well on (especially) newer hardware. Multiple monitor setups can also have a bad
|
||||
impact on a stable refresh rate. Try a setup with just a single monitor you want to use for gameplay
|
||||
|
@ -115,16 +115,7 @@ This can be related to various issues:
|
||||
start "" /relatime "gamestart.bat"
|
||||
```
|
||||
|
||||
- Enforce v-sync enabled in your GPU settings.
|
||||
- Ensure that you have a constant refresh rate around the 60 hz (59.9xx or 60.0xx) that is not
|
||||
jumping around. Use the timebase feature of one of the newer games to check that or enable
|
||||
iidxhook's timebase and check the log output for the determined value. Run this a few times and
|
||||
check if the results differ.
|
||||
- Use iidxhook's frame rate limiter feature (see further below) to software lock the refresh rate.
|
||||
This might be necessary on Windows 7 and newer for D3D8 games, e.g. iidx 9 to 12, which seem to
|
||||
ignore GPU side v-sync.
|
||||
- Use iidxhook's auto timebase feature (see further below) or set a pre-determined value to cut down
|
||||
start-up times.
|
||||
Also refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
### The game still stutters (randomly) and drifts off-sync
|
||||
|
||||
@ -142,9 +133,7 @@ This can be caused by:
|
||||
|
||||
## My songs are offsync
|
||||
|
||||
- Make sure your machine's refresh rate is stable
|
||||
- If you don't get a close to 59.94hz refresh rate, use the software monitor check/auto timebase
|
||||
that's built into iidxhook (refer to help/config file)
|
||||
Refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## The game crashes instantly
|
||||
|
||||
@ -192,6 +181,8 @@ CLVSD.ax codec which has the debugger checks removed.
|
||||
|
||||
## I used the auto timebase option and/or limited my refresh rate but the songs are still going offsync
|
||||
|
||||
Refer to the [iidx-syncbook](iidx-syncbook.md) if you haven't already.
|
||||
|
||||
There aren't many options left. The old games were developed for specific hardware and are not
|
||||
guaranteed to work well on (especially) newer hardware. Multiple monitor setups can also have a bad
|
||||
impact on a stable refresh rate. Try a setup with just a single monitor you want to use for gameplay
|
||||
|
@ -132,16 +132,7 @@ This can be related to various issues:
|
||||
start "" /relatime "gamestart.bat"
|
||||
```
|
||||
|
||||
- Enforce v-sync enabled in your GPU settings.
|
||||
- Ensure that you have a constant refresh rate around the 60 hz (59.9xx or 60.0xx) that is not
|
||||
jumping around. Use the timebase feature of one of the newer games to check that or enable
|
||||
iidxhook's timebase and check the log output for the determined value. Run this a few times and
|
||||
check if the results differ.
|
||||
- Use iidxhook's frame rate limiter feature (see further below) to software lock the refresh rate.
|
||||
This might be necessary on Windows 7 and newer for D3D8 games, e.g. iidx 9 to 12, which seem to
|
||||
ignore GPU side v-sync.
|
||||
- Use iidxhook's auto timebase feature (see further below) or set a pre-determined value to cut down
|
||||
start-up times.
|
||||
Also refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## "NETWORK WARNING" instead of "NETWORK OK"
|
||||
|
||||
@ -154,15 +145,7 @@ This can be caused by:
|
||||
|
||||
## My songs are offsync
|
||||
|
||||
The built-in monitor check just determines if the game should sync to either 59.94 hz (S-Video
|
||||
setting) or 60.04 hz (VGA setting). If you don't have a setup that runs on (as close as possible)
|
||||
these values:
|
||||
|
||||
- Make sure your machine's refresh rate is stable, e.g. 60.00x hz.
|
||||
- If you don't get a close to 59.94hz (S-Video setting) or 60.04 hz (VGA setting) refresh rate, go
|
||||
an set the output mode in the operator menu to "VGA" to enforce the game to run chart syncing on
|
||||
60.04 hz refresh rate (even if your setup does not have that value). Next, use the software
|
||||
monitor check/auto timebase that's built into iidxhook (refer to cmd help/configfile).
|
||||
Refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## My game runs too fast
|
||||
|
||||
@ -205,6 +188,8 @@ CLVSD.ax codec which has the debugger checks removed.
|
||||
|
||||
## I used the auto timebase option and/or limited my refresh rate but the songs are still going offsync
|
||||
|
||||
Refer to the [iidx-syncbook](iidx-syncbook.md) if you haven't already.
|
||||
|
||||
There aren't many options left. The old games were developed for specific hardware and are not
|
||||
guaranteed to work well on (especially) newer hardware. Multiple monitor setups can also have a bad
|
||||
impact on a stable refresh rate. Try a setup with just a single monitor you want to use for gameplay
|
||||
|
@ -143,16 +143,7 @@ This can be related to various issues:
|
||||
start "" /relatime "gamestart.bat"
|
||||
```
|
||||
|
||||
- Enforce v-sync enabled in your GPU settings.
|
||||
- Ensure that you have a constant refresh rate around the 60 hz (59.9xx or 60.0xx) that is not
|
||||
jumping around. Use the timebase feature of one of the newer games to check that or enable
|
||||
iidxhook's timebase and check the log output for the determined value. Run this a few times and
|
||||
check if the results differ.
|
||||
- Use iidxhook's frame rate limiter feature (see further below) to software lock the refresh rate.
|
||||
This might be necessary on Windows 7 and newer for D3D8 games, e.g. iidx 9 to 12, which seem to
|
||||
ignore GPU side v-sync.
|
||||
- Use iidxhook's auto timebase feature (see further below) or set a pre-determined value to cut down
|
||||
start-up times.
|
||||
Also refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## "NETWORK WARNING" instead of "NETWORK OK"
|
||||
|
||||
@ -165,15 +156,7 @@ This can be caused by:
|
||||
|
||||
## My songs are offsync
|
||||
|
||||
The built-in monitor check just determines if the game should sync to either 59.94 hz (S-Video
|
||||
setting) or 60.04 hz (VGA setting). If you don't have a setup that runs on (as close as possible)
|
||||
these values:
|
||||
|
||||
- Make sure your machine's refresh rate is stable, e.g. 60.00x hz.
|
||||
- If you don't get a close to 59.94hz (S-Video setting) or 60.04 hz (VGA setting) refresh rate, go
|
||||
an set the output mode in the operator menu to "VGA" to enforce the game to run chart syncing on
|
||||
60.04 hz refresh rate (even if your setup does not have that value). Next, use the software
|
||||
monitor check/auto timebase that's built into iidxhook (refer to cmd help/configfile).
|
||||
Refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## My game runs too fast
|
||||
|
||||
@ -211,6 +194,8 @@ CLVSD.ax codec which has the debugger checks removed.
|
||||
|
||||
## I used the auto timebase option and/or limited my refresh rate but the songs are still going offsync
|
||||
|
||||
Refer to the [iidx-syncbook](iidx-syncbook.md) if you haven't already.
|
||||
|
||||
There aren't many options left. The old games were developed for specific hardware and are not
|
||||
guaranteed to work well on (especially) newer hardware. Multiple monitor setups can also have a bad
|
||||
impact on a stable refresh rate. Try a setup with just a single monitor you want to use for gameplay
|
||||
|
@ -143,16 +143,7 @@ This can be related to various issues:
|
||||
start "" /relatime "gamestart.bat"
|
||||
```
|
||||
|
||||
- Enforce v-sync enabled in your GPU settings.
|
||||
- Ensure that you have a constant refresh rate around the 60 hz (59.9xx or 60.0xx) that is not
|
||||
jumping around. Use the timebase feature of one of the newer games to check that or enable
|
||||
iidxhook's timebase and check the log output for the determined value. Run this a few times and
|
||||
check if the results differ.
|
||||
- Use iidxhook's frame rate limiter feature (see further below) to software lock the refresh rate.
|
||||
This might be necessary on Windows 7 and newer for D3D8 games, e.g. iidx 9 to 12, which seem to
|
||||
ignore GPU side v-sync.
|
||||
- Use iidxhook's auto timebase feature (see further below) or set a pre-determined value to cut down
|
||||
start-up times.
|
||||
Also refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## "NETWORK WARNING" instead of "NETWORK OK"
|
||||
|
||||
@ -165,11 +156,7 @@ This can be caused by:
|
||||
|
||||
## My songs are offsync
|
||||
|
||||
From this version onwards (if you use the very final data of Lincle), the game comes with a built-in
|
||||
auto timebase option ("monitor check" on startup) which dynamically, detects the refresh rate of
|
||||
your current setup. Thus, BT5's timebase option is not included from this hook version onwards,
|
||||
anymore. Ensure that refresh rate displayed is very stable, e.g. 60.00x hz, and the game should be
|
||||
able to provide you with a smooth and sync game experience.
|
||||
Refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## My game runs too fast
|
||||
|
||||
|
@ -155,11 +155,7 @@ This can be related to various issues:
|
||||
start "" /relatime "gamestart.bat"
|
||||
```
|
||||
|
||||
- Enforce v-sync enabled in your GPU settings.
|
||||
- Ensure that you have a constant refresh rate around the 60 hz (59.9xx or 60.0xx) that is not
|
||||
jumping around. Use the timebase feature of one of the newer games to check that or enable
|
||||
iidxhook's timebase and check the log output for the determined value. Run this a few times and
|
||||
check if the results differ.
|
||||
Also refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## "NETWORK WARNING" instead of "NETWORK OK"
|
||||
|
||||
@ -172,11 +168,7 @@ This can be caused by:
|
||||
|
||||
## My songs are offsync
|
||||
|
||||
From this version onwards (or Lincle very final revision), the game comes with a built-in auto
|
||||
timebase option ("monitor check" on startup) which dynamically, detects the refresh rate of your
|
||||
current setup. Thus, BT5's timebase option is not included from this hook version onwards, anymore.
|
||||
Ensure that refresh rate displayed is very stable, e.g. 60.00x hz, and the game should be able to
|
||||
provide you with a smooth and sync game experience.
|
||||
Refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## My game runs too fast
|
||||
|
||||
|
@ -159,11 +159,7 @@ This can be related to various issues:
|
||||
start "" /relatime "gamestart.bat"
|
||||
```
|
||||
|
||||
- Enforce v-sync enabled in your GPU settings.
|
||||
- Ensure that you have a constant refresh rate around the 60 hz (59.9xx or 60.0xx) that is not
|
||||
jumping around. Use the timebase feature of one of the newer games to check that or enable
|
||||
iidxhook's timebase and check the log output for the determined value. Run this a few times and
|
||||
check if the results differ.
|
||||
Also refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## "NETWORK WARNING" instead of "NETWORK OK"
|
||||
|
||||
@ -176,11 +172,7 @@ This can be caused by:
|
||||
|
||||
## My songs are offsync
|
||||
|
||||
From IIDX 20 (or Lincle very final revision) onwards, the game comes with a built-in auto timebase
|
||||
option ("monitor check" on startup) which dynamically, detects the refresh rate of your current
|
||||
setup. Thus, BT5's timebase option is not included from this hook version onwards, anymore. Ensure
|
||||
that refresh rate displayed is very stable, e.g. 60.00x hz, and the game should be able to provide
|
||||
you with a smooth and sync game experience.
|
||||
Refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## My game runs too fast
|
||||
|
||||
|
@ -158,11 +158,7 @@ This can be related to various issues:
|
||||
start "" /relatime "gamestart.bat"
|
||||
```
|
||||
|
||||
- Enforce v-sync enabled in your GPU settings.
|
||||
- Ensure that you have a constant refresh rate around the 60 hz (59.9xx or 60.0xx) that is not
|
||||
jumping around. Use the timebase feature of one of the newer games to check that or enable
|
||||
iidxhook's timebase and check the log output for the determined value. Run this a few times and
|
||||
check if the results differ.
|
||||
Also refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## "NETWORK WARNING" instead of "NETWORK OK"
|
||||
|
||||
@ -175,11 +171,7 @@ This can be caused by:
|
||||
|
||||
## My songs are offsync
|
||||
|
||||
From IIDX 20 (or Lincle very final revision) onwards, the game comes with a built-in auto timebase
|
||||
option ("monitor check" on startup) which dynamically, detects the refresh rate of your current
|
||||
setup. Thus, BT5's timebase option is not included from this hook version onwards, anymore. Ensure
|
||||
that refresh rate displayed is very stable, e.g. 60.00x hz, and the game should be able to provide
|
||||
you with a smooth and sync game experience.
|
||||
Refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## My game runs too fast
|
||||
|
||||
|
@ -205,11 +205,7 @@ This can be related to various issues:
|
||||
start "" /relatime "gamestart.bat"
|
||||
```
|
||||
|
||||
- Enforce v-sync enabled in your GPU settings.
|
||||
- Ensure that you have a constant refresh rate around the 60 hz (59.9xx or 60.0xx) that is not
|
||||
jumping around. Use the timebase feature of one of the newer games to check that or enable
|
||||
iidxhook's timebase and check the log output for the determined value. Run this a few times and
|
||||
check if the results differ.
|
||||
Also refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## "NETWORK WARNING" instead of "NETWORK OK"
|
||||
|
||||
@ -222,11 +218,7 @@ This can be caused by:
|
||||
|
||||
## My songs are offsync
|
||||
|
||||
From IIDX 20 (or Lincle very final revision) onwards, the game comes with a built-in auto timebase
|
||||
option ("monitor check" on startup) which dynamically, detects the refresh rate of your current
|
||||
setup. Thus, BT5's timebase option is not included from this hook version onwards, anymore. Ensure
|
||||
that refresh rate displayed is very stable, e.g. 60.00x hz, and the game should be able to provide
|
||||
you with a smooth and sync game experience.
|
||||
Refer to the [iidx-syncbook](iidx-syncbook.md).
|
||||
|
||||
## My game runs too fast
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user