mirror of
https://github.com/genxium/DelayNoMore
synced 2024-12-25 11:18:55 +00:00
Fixed multiplayer mode for new dynamics calculation.
This commit is contained in:
parent
a4941c1273
commit
60866674b5
@ -135,9 +135,9 @@ type Room struct {
|
|||||||
CurDynamicsRenderFrameId int32 // [WARNING] The dynamics of backend is ALWAYS MOVING FORWARD BY ALL-CONFIRMED INPUTFRAMES (either by upsync or forced), i.e. no rollback; Moreover when "true == BackendDynamicsEnabled" we always have "Room.CurDynamicsRenderFrameId >= Room.RenderFrameId" because each "all-confirmed inputFrame" is applied on "all applicable renderFrames" in one-go hence often sees a future "renderFrame" earlier
|
CurDynamicsRenderFrameId int32 // [WARNING] The dynamics of backend is ALWAYS MOVING FORWARD BY ALL-CONFIRMED INPUTFRAMES (either by upsync or forced), i.e. no rollback; Moreover when "true == BackendDynamicsEnabled" we always have "Room.CurDynamicsRenderFrameId >= Room.RenderFrameId" because each "all-confirmed inputFrame" is applied on "all applicable renderFrames" in one-go hence often sees a future "renderFrame" earlier
|
||||||
EffectivePlayerCount int32
|
EffectivePlayerCount int32
|
||||||
DismissalWaitGroup sync.WaitGroup
|
DismissalWaitGroup sync.WaitGroup
|
||||||
InputsBuffer *battle.RingBuffer // Indices are STRICTLY consecutive
|
InputsBuffer *resolv.RingBuffer // Indices are STRICTLY consecutive
|
||||||
InputsBufferLock sync.Mutex // Guards [InputsBuffer, LatestPlayerUpsyncedInputFrameId, LastAllConfirmedInputFrameId, LastAllConfirmedInputList, LastAllConfirmedInputFrameIdWithChange, LastIndividuallyConfirmedInputList, player.LastReceivedInputFrameId, player.LastUdpReceivedInputFrameId]
|
InputsBufferLock sync.Mutex // Guards [InputsBuffer, LatestPlayerUpsyncedInputFrameId, LastAllConfirmedInputFrameId, LastAllConfirmedInputList, LastAllConfirmedInputFrameIdWithChange, LastIndividuallyConfirmedInputList, player.LastReceivedInputFrameId, player.LastUdpReceivedInputFrameId]
|
||||||
RenderFrameBuffer *battle.RingBuffer // Indices are STRICTLY consecutive
|
RenderFrameBuffer *resolv.RingBuffer // Indices are STRICTLY consecutive
|
||||||
LatestPlayerUpsyncedInputFrameId int32
|
LatestPlayerUpsyncedInputFrameId int32
|
||||||
LastAllConfirmedInputFrameId int32
|
LastAllConfirmedInputFrameId int32
|
||||||
LastAllConfirmedInputFrameIdWithChange int32
|
LastAllConfirmedInputFrameIdWithChange int32
|
||||||
@ -162,6 +162,12 @@ type Room struct {
|
|||||||
BattleUdpTunnelLock sync.Mutex
|
BattleUdpTunnelLock sync.Mutex
|
||||||
BattleUdpTunnelAddr *pb.PeerUdpAddr
|
BattleUdpTunnelAddr *pb.PeerUdpAddr
|
||||||
BattleUdpTunnel *net.UDPConn
|
BattleUdpTunnel *net.UDPConn
|
||||||
|
|
||||||
|
collisionHolder *resolv.Collision
|
||||||
|
effPushbacks []*battle.Vec2D
|
||||||
|
hardPushbackNormsArr [][]*battle.Vec2D
|
||||||
|
jumpedOrNotList []bool
|
||||||
|
dynamicRectangleColliders []*resolv.Object
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pR *Room) updateScore() {
|
func (pR *Room) updateScore() {
|
||||||
@ -796,8 +802,8 @@ func (pR *Room) OnDismissed() {
|
|||||||
pR.PlayerSecondarySignalToCloseDict = make(map[int32]SignalToCloseConnCbType)
|
pR.PlayerSecondarySignalToCloseDict = make(map[int32]SignalToCloseConnCbType)
|
||||||
pR.JoinIndexBooleanArr = make([]bool, pR.Capacity)
|
pR.JoinIndexBooleanArr = make([]bool, pR.Capacity)
|
||||||
pR.RenderCacheSize = 1024
|
pR.RenderCacheSize = 1024
|
||||||
pR.RenderFrameBuffer = battle.NewRingBuffer(pR.RenderCacheSize)
|
pR.RenderFrameBuffer = resolv.NewRingBuffer(pR.RenderCacheSize)
|
||||||
pR.InputsBuffer = battle.NewRingBuffer((pR.RenderCacheSize >> 1) + 1)
|
pR.InputsBuffer = resolv.NewRingBuffer((pR.RenderCacheSize >> 1) + 1)
|
||||||
pR.rdfIdToActuallyUsedInput = make(map[int32]*pb.InputFrameDownsync)
|
pR.rdfIdToActuallyUsedInput = make(map[int32]*pb.InputFrameDownsync)
|
||||||
pR.LastIndividuallyConfirmedInputList = make([]uint64, pR.Capacity)
|
pR.LastIndividuallyConfirmedInputList = make([]uint64, pR.Capacity)
|
||||||
|
|
||||||
@ -810,6 +816,24 @@ func (pR *Room) OnDismissed() {
|
|||||||
pR.CurDynamicsRenderFrameId = 0
|
pR.CurDynamicsRenderFrameId = 0
|
||||||
pR.NstDelayFrames = 24
|
pR.NstDelayFrames = 24
|
||||||
|
|
||||||
|
pR.collisionHolder = resolv.NewCollision()
|
||||||
|
pR.effPushbacks = make([]*battle.Vec2D, pR.Capacity)
|
||||||
|
for i := 0; i < len(pR.effPushbacks); i++ {
|
||||||
|
pR.effPushbacks[i] = &battle.Vec2D{X: 0, Y: 0}
|
||||||
|
}
|
||||||
|
pR.hardPushbackNormsArr = make([][]*battle.Vec2D, pR.Capacity)
|
||||||
|
for i := 0; i < pR.Capacity; i++ {
|
||||||
|
pR.hardPushbackNormsArr[i] = make([]*battle.Vec2D, 5)
|
||||||
|
for j := 0; j < len(pR.hardPushbackNormsArr[i]); j++ {
|
||||||
|
pR.hardPushbackNormsArr[i][j] = &battle.Vec2D{X: 0, Y: 0}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pR.jumpedOrNotList = make([]bool, pR.Capacity)
|
||||||
|
pR.dynamicRectangleColliders = make([]*resolv.Object, 64)
|
||||||
|
for i := 0; i < len(pR.dynamicRectangleColliders); i++ {
|
||||||
|
pR.dynamicRectangleColliders[i] = battle.GenerateRectCollider(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, nil, "")
|
||||||
|
}
|
||||||
|
|
||||||
serverFps := 60
|
serverFps := 60
|
||||||
pR.RollbackEstimatedDtMillis = 16.667 // Use fixed-and-low-precision to mitigate the inconsistent floating-point-number issue between Golang and JavaScript
|
pR.RollbackEstimatedDtMillis = 16.667 // Use fixed-and-low-precision to mitigate the inconsistent floating-point-number issue between Golang and JavaScript
|
||||||
pR.RollbackEstimatedDtNanos = 16666666 // A little smaller than the actual per frame time, just for logging FAST FRAME
|
pR.RollbackEstimatedDtNanos = 16666666 // A little smaller than the actual per frame time, just for logging FAST FRAME
|
||||||
@ -1356,8 +1380,7 @@ func (pR *Room) applyInputFrameDownsyncDynamics(fromRenderFrameId int32, toRende
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
nextRenderFrame := battle.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(pR.InputsBuffer, currRenderFrame, pR.Space, pR.CollisionSysMap, pR.SpaceOffsetX, pR.SpaceOffsetY, pR.CharacterConfigsArr)
|
battle.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(pR.InputsBuffer, currRenderFrame.Id, pR.Space, pR.CollisionSysMap, pR.SpaceOffsetX, pR.SpaceOffsetY, pR.CharacterConfigsArr, pR.RenderFrameBuffer, pR.collisionHolder, pR.effPushbacks, pR.hardPushbackNormsArr, pR.jumpedOrNotList, pR.dynamicRectangleColliders)
|
||||||
pR.RenderFrameBuffer.Put(nextRenderFrame)
|
|
||||||
pR.CurDynamicsRenderFrameId++
|
pR.CurDynamicsRenderFrameId++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,8 +12,9 @@ func NormVec2D(dx, dy float64) Vec2D {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ConvexPolygonStr(body *resolv.ConvexPolygon) string {
|
func ConvexPolygonStr(body *resolv.ConvexPolygon) string {
|
||||||
var s []string = make([]string, len(body.Points))
|
var s []string = make([]string, body.Points.Cnt)
|
||||||
for i, p := range body.Points {
|
for i := int32(0); i < body.Points.Cnt; i++ {
|
||||||
|
p := body.GetPointByOffset(i)
|
||||||
s[i] = fmt.Sprintf("[%.2f, %.2f]", p[0]+body.X, p[1]+body.Y)
|
s[i] = fmt.Sprintf("[%.2f, %.2f]", p[0]+body.X, p[1]+body.Y)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -461,7 +461,7 @@
|
|||||||
"array": [
|
"array": [
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
217.52040535921228,
|
210.75657517389567,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
@ -13,9 +13,9 @@ cc.Class({
|
|||||||
if (speciesName == this.speciesName) return;
|
if (speciesName == this.speciesName) return;
|
||||||
if (null != this.speciesName) {
|
if (null != this.speciesName) {
|
||||||
for (let k in this.animNode.children) {
|
for (let k in this.animNode.children) {
|
||||||
const child = this.children[k];
|
const child = this.animNode.children[k];
|
||||||
if (!child.active) continue;
|
if (!child.active) continue;
|
||||||
if (child == effAnimNode || child.name == speciesName) continue;
|
if (child == this.effAnimNode || child.name == speciesName) continue;
|
||||||
child.active = false;
|
child.active = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -367,19 +367,19 @@ cc.Class({
|
|||||||
self.lastIndividuallyConfirmedInputList = new Array(window.boundRoomCapacity).fill(0);
|
self.lastIndividuallyConfirmedInputList = new Array(window.boundRoomCapacity).fill(0);
|
||||||
|
|
||||||
self.collisionHolder = gopkgs.NewCollisionHolder();
|
self.collisionHolder = gopkgs.NewCollisionHolder();
|
||||||
// [WARNING] For "pEffPushbacks", "pHardPushbackNormsArr" and "pJumpedOrNotList", use array literal instead of "new Array" for compliance when passing into "gopkgs.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs"!
|
// [WARNING] For "effPushbacks", "hardPushbackNormsArr" and "jumpedOrNotList", use array literal instead of "new Array" for compliance when passing into "gopkgs.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs"!
|
||||||
self.pEffPushbacks = [];
|
self.effPushbacks = [];
|
||||||
for (let i = 0; i < window.boundRoomCapacity; i++) self.pEffPushbacks.push(gopkgs.NewVec2DJs(0, 0));
|
for (let i = 0; i < window.boundRoomCapacity; i++) self.effPushbacks.push(gopkgs.NewVec2DJs(0, 0));
|
||||||
self.pHardPushbackNormsArr = [];
|
self.hardPushbackNormsArr = [];
|
||||||
for (let i = 0; i < window.boundRoomCapacity; i++) {
|
for (let i = 0; i < window.boundRoomCapacity; i++) {
|
||||||
const single = [];
|
const single = [];
|
||||||
for (let j = 0; j < 5; j++) {
|
for (let j = 0; j < 5; j++) {
|
||||||
single.push(gopkgs.NewVec2DJs(0, 0));
|
single.push(gopkgs.NewVec2DJs(0, 0));
|
||||||
}
|
}
|
||||||
self.pHardPushbackNormsArr.push(single);
|
self.hardPushbackNormsArr.push(single);
|
||||||
}
|
}
|
||||||
self.pJumpedOrNotList = [];
|
self.jumpedOrNotList = [];
|
||||||
for (let i = 0; i < window.boundRoomCapacity; i++) self.pJumpedOrNotList.push(false);
|
for (let i = 0; i < window.boundRoomCapacity; i++) self.jumpedOrNotList.push(false);
|
||||||
self.dynamicRectangleColliders = gopkgs.NewDynamicRectangleColliders(64);
|
self.dynamicRectangleColliders = gopkgs.NewDynamicRectangleColliders(64);
|
||||||
|
|
||||||
self.recentRenderCache = gopkgs.NewRingBufferJs(self.renderCacheSize);
|
self.recentRenderCache = gopkgs.NewRingBufferJs(self.renderCacheSize);
|
||||||
@ -1403,8 +1403,8 @@ othersForcedDownsyncRenderFrame=${JSON.stringify(othersForcedDownsyncRenderFrame
|
|||||||
};
|
};
|
||||||
self.rdfIdToActuallyUsedInput.set(i, inputFrameDownsyncClone);
|
self.rdfIdToActuallyUsedInput.set(i, inputFrameDownsyncClone);
|
||||||
}
|
}
|
||||||
const renderRes = gopkgs.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs(self.recentInputCache, i, collisionSys, collisionSysMap, self.spaceOffsetX, self.spaceOffsetY, self.chConfigsOrderedByJoinIndex, self.recentRenderCache, self.collisionHolder, self.pEffPushbacks, self.pHardPushbackNormsArr, self.pJumpedOrNotList, self.dynamicRectangleColliders);
|
const renderRes = gopkgs.ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs(self.recentInputCache, i, collisionSys, collisionSysMap, self.spaceOffsetX, self.spaceOffsetY, self.chConfigsOrderedByJoinIndex, self.recentRenderCache, self.collisionHolder, self.effPushbacks, self.hardPushbackNormsArr, self.jumpedOrNotList, self.dynamicRectangleColliders);
|
||||||
const nextRdf = gopkgs.GetRoomDownsyncFrame(self.recentRenderCache, self.renderFrameId + 1);
|
const nextRdf = gopkgs.GetRoomDownsyncFrame(self.recentRenderCache, i + 1);
|
||||||
|
|
||||||
if (true == isChasing) {
|
if (true == isChasing) {
|
||||||
// [WARNING] Move the cursor "self.chaserRenderFrameId" when "true == isChasing", keep in mind that "self.chaserRenderFrameId" is not monotonic!
|
// [WARNING] Move the cursor "self.chaserRenderFrameId" when "true == isChasing", keep in mind that "self.chaserRenderFrameId" is not monotonic!
|
||||||
|
File diff suppressed because one or more lines are too long
@ -571,7 +571,7 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *resolv.Rin
|
|||||||
var ret *RoomDownsyncFrame = nil
|
var ret *RoomDownsyncFrame = nil
|
||||||
candidate := renderFrameBuffer.GetByFrameId(nextRenderFrameId)
|
candidate := renderFrameBuffer.GetByFrameId(nextRenderFrameId)
|
||||||
if nil == candidate {
|
if nil == candidate {
|
||||||
// Lazy alloc heap-mem for holder
|
// Lazy alloc heap-mem for holder, will be called on each "nextRenderFrameId == renderFrameBuffer.EdFrameId"
|
||||||
ret = NewPreallocatedRoomDownsyncFrame(roomCapacity, 64, 64)
|
ret = NewPreallocatedRoomDownsyncFrame(roomCapacity, 64, 64)
|
||||||
renderFrameBuffer.SetByFrameId(ret, nextRenderFrameId)
|
renderFrameBuffer.SetByFrameId(ret, nextRenderFrameId)
|
||||||
} else {
|
} else {
|
||||||
|
@ -4,6 +4,9 @@ import (
|
|||||||
"resolv"
|
"resolv"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/*
|
||||||
|
[WARNING] NOT USED ANYWHERE YET!!!
|
||||||
|
*/
|
||||||
type InplaceRingBuffer struct {
|
type InplaceRingBuffer struct {
|
||||||
Ed int32 // write index, open index
|
Ed int32 // write index, open index
|
||||||
St int32 // read index, closed index
|
St int32 // read index, closed index
|
||||||
|
Loading…
Reference in New Issue
Block a user