-
Notifications
You must be signed in to change notification settings - Fork 351
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
WIP: Support >60Hz (2nd try) #585
base: master
Are you sure you want to change the base?
Conversation
This time I was lazy and kept |
Ok, I think I have fixed the "Switching game modes can trigger a fake black screen" issue, by fixing how com_frameTime is calculated. At least on my (Linux) PC, the framerate is extremely stable now (with vsync disabled), but not at the rate configured with com_gameHz, but the next multiple of I guess I should try using floating point (double) times at least for the async tics, but probably I should also try how that all works on Windows and how it interacts with vsync. However, all this somehow feels wrong: I can't find it right now, but I think there are comments in the code stating that the tics are supposed to be incremented at 60Hz, and that this is supposed to be independent of the render framerate. On the other other hand, I don't see the point of that whole async thread for incrementing tics, no matter if the renderer is running in sync with the game or not. |
the console cursor also changes the flashing frequency with different values for com_gameHz |
74f40bd
to
f8fa12f
Compare
true, I've also noticed this already, will add it to the list (I also know why it happens, just doing other changes first) |
f8fa12f
to
c7e184e
Compare
I've pushed lots of changes in the last hours. Another is that the framerates should now be very close to what's configured with com_gameHz (unless VSync or a slow computer slow it down), because the timing of frame starts is now done with much more precision than full milliseconds. Most times in the game and engine still use full (integer) milliseconds, like before, so I wonder if this causes any issues or if starting the frames at the correct time is good enough for things to run smoothly. |
0916ab0
to
0bffae3
Compare
looks goot so far, played up to 1st airlock in mars city underground. There is an issue with the air supply though. It can be manipulated by changing com_gameHz while being outside com_gameHz 500 -> cycle airlock then set com_gameHz to a lower value changing com_gameHz to a higher value than configured has ofc the opposide effectl |
(rebased this branch again, to current master, so it includes the fix for #587) I'll look at the oxygen issue. |
Thanks for testing by the way, I appreciate that you're doing this, and how thorough you are! :) By the way, does dhewm3 at higher framerates feel smooth? |
It was a coincidence, I changed the setting while i was still in the airlock, but after I already initiated the airlock cycle. Desktop is set to 144Hz. I would not want to go back to 60Hz. |
I do, it's just that some code (incl. some scripts) uses the game tics that are incremented each frame, and at a higher framerate they increment faster.. But maybe I could change the logic to use a floating point tic number and then scale the added value each frame (at 120Hz add 0.5 instead of 1 tic), so the target tic would remain the same.. I just hope this isn't used by too much code besides the oxygen. Or I'd have to re-evaluate going back to 60Hz tics for the game code and only render at a higher framerate, but I'm not sure if this is feasible (and if there is even a point to that: what use are 120fps if nothing changes every second frame? but maybe something can be done without increasing the tic, I'll have to look at how the prediction code for multiplayer works, it might be related to this..)
why not? |
aaaaah. damn. No stutter, nothing. Feels very good so far. |
Here is a build for Windows: dhewm3-1.5.4pre-highfps_win32.zip This contains both the soft particles changes and this high FPS stuff. Other new features:
|
Based on the comment from @dezo2 at #250 (comment) I tested d3xp Erebus4 and yes, that new Imp near the start of the level definitely doesn't spawn (or drop?) like it should when running at 120 or 144 or 240 fps (it still seems to work fine at 60). It should come out of the black hole that arrow is pointing to: It eventually is there, at least if I stand directly below that hole, but at 60fps it drops down that hole pretty soon after that panel from the ceiling falls down after entering the room. Something else I noticed is that things completely fall apart when I change com_gameHz while the game is running (loading a savegame again fixes it). No idea what's going on there, or if the issue is in the scripts or C++ code or whatever. |
I got finally some time before going back to work so I just want to thank you Daniel for working on this. I tested the base game briefly and the game movement seems fine. What I found so far using com_gameHz 200 and 240 with VSync on a 240Hz VRR monitor: The crane at the start of map alphalabs3 doesn' t come up when I press the button and crashes the game (something about binding an object to itself). Which is strange because the chaingun firing rate is OK, so the scripts should be adjusted. There is a slight problem with 240Hz using VSync in cutscenes, where the audio sync (lipsync) drifts after a while even with default com_fixedTic 0. This is minor and can be fixed by running the engine at 200Hz (5ms int) - you can test it with map mars_city2 at the start, the survivor up the ladder there speaks relativelly long. I also noticed very brief frame skips when the Hz does not match the integer framerate like 240Hz and again they dissapear when using 200Hz or by setting com_fixedTic 1. The frequency of the skips seems to match the difference between int and float frametimes so at 240Hz 4.1666ms they are realtivelly far between. The imp in RoE should come down if you kick the panel under the hole - seems like the spawn is somehow tied to the panel position as it lands differently when it falls down before the imp at FPS >60. I will continue testing when I have some time. |
The crane crash is not caused by the scripts after all, I tried it with my old code and it needs the SetSteerSpeed adjustment in Physics_AF.h, it was this line in the code: But I thought you did something similar it in your new code, so not sure what's going on. |
Thanks for testing!
Hmm interesting theory - maybe the panel blocks the spawn position or something?
I just realized: I replaced that code with |
Just pushed a commit that fixes the crane (I tested the crane and didn't have crashes with 120, 240 or 60fps) |
Updated Windows build: dhewm3-1.5.4pre-highfps2_win32.zip By the way, some suggestions for testing:
|
Tested RoE yesterday with com_gameHz 200 and was able to run from start to finish without problems (apart from that one blocked imp in erebus4). No crashes or game breaking bugs, enemies went up/down the stairs to find me, grabber/slowmo/oxygen/enviro suit/machinery/elevators/bridges all worked as expected, so to me the code is already very usable. I will also try the base game but don't really expect any major problems there. BTW thanks for the F10 hidden menu tip, didn't even know about it. As for the second blocked imp, it's in the base game, map recycling2 (-494.73 1410.72 -11.75) 190.2, right after interaction with the left screen. Imp should jump out of his closet, but with FPS >= 85 (11ms) he will be blocked with a panel he tried to kick out. So similar situation to than one in RoE. Not sure if this can be fixed without breaking something else in the physics code. |
I just wanna point out that the original Doom 3 can now run at higher fps than BFG edition. What a time to be alive in. |
I may have found a fix for the blocked imps and potentially other enemies hidden behind wals and panels. This was caused by the STOP_SPEED in physics being too low for higher FPS, so by replacing a line in the source files Physics_RigidBody.cpp (base and d3xp): |
Crap, celebrated too soon. It works with 200 FPS but not with 144 or 120. The physics code is seriously weird. The STOP_SPEED has to be the culprit for these problems. |
Smoothes things out a bit, but also makes deviations more visible in the min/max frametimes of com_showFPS 2
in dezo2's code it was SetSteerSpeed(const float speed) { steerSpeed = speed * 60.0f / USERCMD_HZ; } I replaced it with `steerSpeed = speed * gameLocal.gameTicScale;` but gameTicScale is gameHz/60, not 60/gameHz, so it must be `steerSpeed = speed / gameLocal.gameTicScale;` Same for STOP_TIME.
turns out it should be `10.0f * gameLocal.gameTicScale` instead of `10.0f / gameLocal.gameTicScale` after all, probably, at least it seems to work better according to dhewm#585 (comment) (Doesn't fix the issues with all framerates though, apparently 200fps work better now, but 144 or 200 don't) Moved the calculation into a function so if further adjustments are needed it's easier to do
in preparation of trying out TDM's fixes
they have *lots* of changes to physics code, partly to support mantling and movement in water, so it's not that easy to tell which are relevant for us. These are in things already identified as unstable here, so I'm hopeful that they help..
many thanks to dezo2 for suggesting these fixes! I think in the StepMove() case it's more of a hack than a fix - *maybe* the correct thing would be to accumulate the deltas over multiple frames when you got blocked, or something like this? - but as long as it doesn't break anything else I don't care..
at high framerates, grabbed stuff often fell down before being in front of the Grabber (where it could be thrown away again) Thanks to @dezo2 (again!) for pushing me in the right direction!
based on a patch from @dezo2, who took the general idea from D3BFG this works around the problem that for most framerates, with integer frametimes, gameHz * frametime doesn't add up to 1000ms (e.g. 120Hz * 8ms = 960ms), by making some frames a millisecond longer
it's still possible, but a warning is shown and the setting in the menu only goes up to 250 now. Apart from physics getting wonkier the higher the framerate is, >250Hz breaks slow motion effects in RoE (d3xp), because it divides frametimes by four, and as the frametimes are integers, for >250Hz they're <= 3, so divided by four that's 0, which isn't good. Furthermore, I moved that setting to the Video settings, so it's closer to related settings like VSync and display refreshrate. While at it, I made sure that `com_showFPS 2` can be configured in the menu as well (it still assumed it's a bool). Last but not least I fixed a misleading variable name in Win_InitTime()
to prevent them from jumping so much at high framerates
The changes in this branch breaks the Game API, so it won't be in a 1.5.x release.
it already mostly worked, but picking up oxygen bottles gave too little oxygen at >60fps and changing com_gameHz while being "outside" would screw up the remaining oxygen and the implementation was needlessly invasive anyway. I reverted most changes, turned idPlayer::airTics into a float (so they are now virtual 60Hz tics instead of actual number of tics) and adjusted the code that increases or decreases the airTics (idPlayer::UpdateAir()) to scale the values added/subtracted accordingly. Apart from that it's only a few changes to accomodate the fact that it's a float now.
it only returns Sys_MillisecondsPrecise() casted to unsigned int anyway.
4c34484
to
7ac7047
Compare
Just a quick note: I configured automatic builds for dhewm3, so whenever changes are pushed to the master branch or an open pull request (like this one), new binaries for x86_64 Linux and 32 and 64bit (x86 and x86_64 aka x64) Windows are automatically built. (There's a also a build for arm64 macOS, but I have no idea if that works without adding SDL2 and OpenAL-Soft to the app bundle somehow, and also it's probably not signed.. so the automated Mac build is mostly to make sure dhewm3 compiles on that platform at all) You can find the builds at https://github.com/dhewm/dhewm3/actions and after selecting a "workflow run", the resulting binaries can be downloaded under "Artifacts". |
I also noticed this at 60fps in dhewm3 1.5.4 |
The only thing I noticed in the latest automated win64 build 1bd8ca6, tested at 144Hz, are two Imp encounters in Recycling 2, the the wall panels block the Imps paths. The first Imp encounter corresponds to 9:49 in this playthrough video https://youtu.be/qNAcdZQG0-s?si=Qk3p181neGotICe6&t=589 Dezo 2 reported about the second Imp encounter here: #585 (comment) |
|
Even with this change, I think you will find that NPCs still move far too quickly on sloped surfaces. You can see this with the trites that appear during the second vacuum in Communications Transfer. |
Hello Daniel. I am not a developer but wanted to give you my 2 cents on testing DHEWM3 in various versions with 120 fps. First of all I wanna say thanks for your work for the community. However I want to note that there are severe performance issues with high FPS dlls since the first one I tried that only worked for version 1.5.1. This was supplied from the user DEZO2 and here are the link: #230 I dont know what the difference is from his approach to every other I tested from 1.5.2 to current 1.5.4. But his version runs very fast and smooth and does not max out the 1 cpu core the game runs on. This is the best dll to date performance wise. Now I have a 14900KS running 5.9 Ghz but with every other DLL in 4K with other mods it just tanks the 1 cpu core and gives a very bad game experience... the game comes down into slowmotion often and all the way down to 60fps which will result in 50% game speed with the dll. I just wanted you to know I think you should pursue his way of doing it. Now I have both Base Doom 3 and ROE running perfect with 1.5.1 and his dll. But the Lost Mission addon requires unfortunatly at least 1.5.2 to not make bugs and the last Hell Outpost simply dosent work on the 1.5.1 version. But the com_gamehz is very bad in performance and this is on the fastest cpu on the market at this time. Anyway I just wanted to give you my 2 cents on it and hope you guys may want to pursue that technique instead. |
I just wanted you to know I tested all the fast fps DLLs since 1.5.1 and this DLL made by DEZO2 is the best by far! I just completed the game with his and there were absolutly no bugs or errors or major timing issues. However every dll I tested since 1.5.2 made by others based on (I think!) com_gamehz has be very bad in performance and made a lot of timming issues. You should try his DLL and 1.5.1 here: #230 I have a 14900KS at 5.9 Ghz and with all other dlls from 1.5.2 the performance tanks 1 cpu core and slow mo the game quite often with other mods enabled in 4K. Because how its made it sometimes goes down to 60fps resulting in 50% game speed which is unplayable and very annoying. But with 1.5.1 DEZO2 dll I had NO performance issues with same mods and 4K. And the game ran incredibly well! I also completed ROE with same DLL with no bugs or timing isses. The only thins is that the Lost mission addon has severe bugs on the last mission in particular HELL OUTPOST and will simply not load on 1.5.2 .. SO thats very annoying.. All the mods I combined for the test were.. REDUX 20th, SIkkmod shaders, Runners Doom, High poly models. SO quite a pack and graphic orgie haha! :) But it can manage fine in 120 fps with no frame drop in 4K with DEZO2 DLL. |
Note that the current builds of this branch are either this one:
Or, even more up-to-date, the latest "artifacts" of an automated build of this branch from https://github.com/dhewm/dhewm3/actions?query=branch%3Akickstart-my-hertz You'll need both the dhewm3.exe and the DLLs (base.dll and/or d3xp.dll)! If you're having performance problems, it might be worth a try to disable soft particles ( |
Try changing your anti-aliasing settings first. In my case it helped a lot |
Thanks, I play without the AA. With it, its a no go haha! The reason why its extra demanding on my setup is because I use this mod also in 4K called RUNNERS DOOM. It enhances all plasma and demon plasma shot significantly. But the slow down is most noticeable in larger room/ areas. But again the first 1.5.1 dll does not have these issues.. I can run full on with absolutely no fps drop. Although I can see the CPU can be in the 90s% it (luckily) never reaches 100% ... But I was not aware of the soft particle thing.. maybe thats it? IT would sure make sense.. I am about to test it now. |
Ok, I have now done some very thorough testing! It seems like no matter which DLL I choose it will make the FPS slowdown in a particular "test place "I found. Its much worse than other places apparently and that is the LOST MISSION HELL and HELL Outpost. Even with the 1.5.1 it does the same! I also tried with soft particles off.. I went through all versions and no difference. So I guess I just found the meanest place to test it. Lost Mission Hell (huge open area right at the start) I dont know if the latest dll´s are based on the same thing? or is there a difference between the versions? 1.5.1, 1.5.2, 1.5.4? 1.6.0? Because other places I did notice much much better performance with 1.5.1 compared to 1.5.2 .. I have not tested so much other places and with later builds like 1.5.4 etc... But I just completed the base game with REDUX 20th and much more and it performed much much better, actually perfect compared to 1.5.2 com_gamehz But a side note... Remember when I said that 1.5.1 did not work with final level in LOST MISSION HELL_OUTPOST? Well now after testing all the version including 1.5.4, 1.6.0 and latest build 1.6.0 I can confirm neither of those work with that final level! However strange enough 1.5.2 works! the reason why it does not work is because there are some warnings and errors with the LOST MISSION scripts, I can see that its the final boss script. And apparently Doom3.exe and 1.5.2 kind of ignores that were all other DHEWM3 version HALT the game. (This is also with a clean install and clean LOST MISSION 1.4 ... Just for your information.. I dont know if its a custom version but the filename was: unlocked-fps-rw-v0.1.0-dhewm3-1.5.2_win32. I got it somewhere from in here. Its just a shame the latest does not work with this final level, at least in my testing. Unfortunatly the 1.5.2 unlocked-fps-rw-v0.1.0-dhewm3-1.5.2_win32 has the worst performance of them all. This goes down in my "plasma" test to the 20s fps (with mods). These test are in a huge open area at the start LE_HELL Lost Mission, but also rest of mission in lesser amout but "unplayable".. So there has to be a difference in how these DLLs operate. But the hell missions are for some reason more tough than the others. But this LE HELL is brutal .. I just tried completely vanilla also wiht 1.5.2 and it max out the 1 cpu core also when much "action" on screen. Also when I have mods I noticed that plasma particles and BFG particles etc. are really demanding for the CPU? Have no idea why, as I thought it was done by the GPU. This runners mod makes some beautiful BFG and plasma shoots but they almost push the CPU to the limit in many cases?! Could it be scripting? Or just the way it works the DLL? But thanks for the 1.6.0 ! I really appreciate it .. I will begin over with the base game with mods and let you know how it works for me! :) Now that I just completed with 1.5.1 flawless. I will try with the 1.6.0+ (latest build) you linked! Thanks again! Its great stuff! I remember for years back when I came to the conclusion that I could not play Doom 3 anymore due to 60fps after I got used to 120- So to see you guys take this game to next level with the whole DHEWM3 and 120 fps DLL is really really sweet. This combined with REDUX 20th etc. is amazing! I am sure even John Carmack would say this is PRETTY cool and nice! :D The way he probably imagined the game (maybe) but couldnt due to technical limitations back then. But running this with NVTRUEHDR and REDUX 4K 120fps is incredible! I am running this on a 42" OLED LG C2 as a monitor! :) This game was created for "perfect black". But 20 years! .. crazy.. |
Based on @dezo2's patch (see also), but adjusted to make the framerate configurable with the
com_gameHz
CVar + my own fixes, also some ideas from Stradex' branch.Very much WIP, and no guarantees this will work out
TODO
Potential bugs that have been observed with various attempts of running dhewm3 with >60Hz and that are worth testing:
com_fixedTic -1
, might not be relevant here?)I can still reproduce this bug. I think it's related to counting tics (com_ticNumber
?) and then multiplying it with USERCMD_MSEC and comparing the result to Sys_Milliseconds() or something, combined with one mod having a differentcom_gameHz
value than the other, so tics are longer/shorter. Needs more investigation..Should be fixed
But at least (unlike in Stradex/simonedibilio's branch) they don't break every time you change
com_gameHz
, so from now on they should be stable again.idGame::RunFrame()
multiple times if com_gameHz is too low