Changes Focused on Boosting Game Performance
In Update 49 we are making significant changes to how melee and missile combat is calculated to address long-term community and development team concerns about game performance. If you're curious, we've included a long form explanation as to what these changes entail on the back end, but if you're interested in just the changes and the results, here's what we've found:
Before this change: Simulations of a raid group proccing on-hit effects use approx 99.965% processing per-instance and produce an effects queue, which causes combat processing lag for all players on the same server while the queue is processed.
After this change: Simulations of a raid group proccing on-hit effects use approx 50% available processing per-instance (still well within the green zone of server frames per second) and rarely if ever hit an effects queue.
An important thing to note when going into this is that when an effects queue happens, it does not only affect your instance, but every other instance on the server that your instance is being processed by. Server in this case does not refer to world, such as Ghallanda or Sarlona or Wayfinder, but the actual machines that process DDO and share the load of each instance between them.
This also alleviates a source of client lag (floaty text queue), so if you play with floaty text off to alleviate client strain, this will prevent that strain by removing pressure from the floaty text queue.
Background Information
We've dedicated a lot of time to investigating and alleviating specific sources of reproducible lag within DDO in recent months. One of the most frequent causes of lag happens when an Effects Queue forms. This means that players have applied a ton of on-hit effects to a monster and the game has reached a buffer and must clear its queue in order to continue processing new information.
You can see this happen in raid groups; the party jumps in, opens up with a ton of active attacks and on-hit effects, and the game begins to degrade in performance almost immediately. It is also worth noting that this kind of lag has two separate portions: Client Combat Lag (which can be alleviated by turning off Floaty Text in your settings) and Server Combat Lag. We are specifically targeting Server based lag with this change. Behind the scenes, the server crunches damage, effects, and debuffs in a big queue. We can measure how efficient the server is at processing this queue by measuring the server frames.
To begin researching and addressing the root causes we put together simulations of a standard raid group and their on-hit profiles. Simulations of a raid group attacking a single target quickly ran into the same kind of performance problems that have become prevalent in raid groups, so we knew we had a reliable test case. What we found was that the amount of damage dealt didn't matter, it was about the frequency that effects were being applied. It didn't matter if a simulation was against one target or many - if the effects queue was in trouble the rest of the instance had its performance significantly impacted. That means lag for not just you and your group but for other people on the server.
What's Changing
- Doublestrike and Doubleshot will no longer apply a full subsequent "attack" as part of your attack chain. Instead, when a player Doublestrikes or Doubleshots (for brevity, we will call this a multi-hit from now on, just remember that this applies for all melee and all ranged) the game will instead multiply the base amount of damage dealt (first number and sneak attack) by the amount of multi-hits generated. This means that a player who deals an average of 100 damage on their first hit will now deal 200, or 300 damage, or however many multi-hits multiplied by their base damage, when their multi-hit goes off.
- When a multi-hit happens, you'll see an icon of two swords next to your damage in the floaty text, similar to how Point Blank Shot provides its feedback.
- Abilities that apply additional ranged projectiles (Shuriken Expertise and Advanced Ninja Training) no longer apply multiple hits or projectiles. Instead, just as if they had been purely Doubleshot scalars, they will simply be additional chances to multi-hit.
- Effects that trigger on-hit will also have their damage multiplied comparatively. This means that if you deal 10 Law damage on each hit, on a doublestrike, it will deal 20.
- Repeating Crossbows and the Dual Crossbow style still fire 3 or 2 full projectiles (so you'll still see 3 numbers or 2 numbers, respectively) and are still affected by their Doubleshot penalties of 66% and 50%, respectively.
- A player's 100% effective Doublestrike cap still applies in this system.
- Offhand strikes will still be a separate "hit" and will roll their own damage from their own weapon and can still Doublestrike. However, we have removed the stat Offhand Doublestrike from the game. Your offhand now Doublestrikes at 50% of the Doublestrike of your mainhand. This means that if you have a 50% chance to produce an offhand strike, and 100% Doublestrike, your offhand will hit 50% of the time for 50% Doublestrike (so a 50% chance to deal double damage). Abilities and enhancements that used to provide Offhand Doublestrike no longer do so.
- Shields still cannot Doublestrike.
- Strikethrough attacks still proc their own Doublestrike roll individually per target struck.
- The main reasoning behind these changes (letting repeaters and offhand strikes still proc rather than fully condensing) is that we want to keep our damage numbers appropriate to the amount of animations that a player actually produces.
A major effect of this change is that you will see much spikier damage across the board. The multi-hit calculation takes the original roll into account when determining damage, which means that you'll see much higher highs and much lower lows. Attacks that crit will multiply that increased damage, so you'll see much higher numbers on those attacks. Attacks that miss will deal no damage, as before, but rather than a multi-hit giving a chance for a second strike to deal damage, they will still deal no damage, as the original strike has missed.
These changes eliminate the Floaty-text queue in practice. Players who are used to seeing damage numbers scroll by on a delay will see the system replaced with numbers that are current. This will make DPS easier to estimate from a series of hits, and there will simply be fewer numbers to add up and adjust.
The Crunchy Details
Curious as to what's actually happening when a player attacks? Currently, when a player Doublestrikes or Doubleshots, we actually handle those types of attacks through very different flows. Both melee and missile attacks use something that we call a detect-attack to deal their regular damage, but how they get there is very different. Right now, a player “Doublestrikes” when their attack scripts use their Doublestrike stat to determine if they fire off another detect-attack. A player “Doubleshots” when the Missile Attacker code gets to the part in the code where we determine how many "Missiles" are a part of the projectile. From there, the scripts use the number of missiles to determine how many times they use a detect-attack.
Now, when a player “attacks” (from the detect-attack callback or elsewhere) the determination to Doublestrike or Doubleshot is made within that single attack call. The appropriate stats are queried, even the weird ones like the Shuriken multi-throw feats, and the appropriate adjustments to the chances are made such as the Doubleshot penalty from using a repeater or dual crossbow. From there, we determine how many “extra attacks” you have rolled, and if you have any bonus “attacks,” we multiply the damage you would deal by that amount.
We also have to do some funky stuff to get the damage of procs to double or triple or quadruple, and that starts in the same place where we calculate the number of effective hits. The combat code saves the number of hits and passes it down the chain until it gets to the place where effects actually deal their damage. From there, the effect will understand how many times it needs to be multiplied.
So, for comparison: Before, a melee character swings with his weapon, and Doublestrikes, which would be two detect-attacks, two damage rolls, and two series of on-hit effect triggers. Under these changes, the player attacks, Doublestrikes, and double damage is dealt, but only one set of on-hit-effects trigger because, to the game, only one “attack” took place.
What this means in practice is that no matter how many projectiles a shuriken thrower uses, or a dual-crossbow player fires, the maximum rate of an on-hit effect is now directly linked to your actual attack speed, and therefore, is significantly reduced. This has the potential to greatly reduce the amount of actual “attacks” in DDO without greatly disrupting player behavior.
Summary
The end result of this change should be improved gameplay on the performance end. Furthermore, the numbers you see while dealing damage will more accurately reflect what's happening in the moment, and you should be able to make calculations more quickly. We hope that you'll give this a solid try on Lamannia and look forward to your feedback, both on the usability of this change and any change in performance therein.