Reduced externalization cost.

This commit is contained in:
genxium
2023-02-16 22:23:12 +08:00
parent 4e0928cb1b
commit c6b98855af
5 changed files with 335 additions and 114 deletions

View File

@@ -579,38 +579,37 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer *resolv.Rin
nextRenderFramePlayers := ret.PlayersArr
// Make a copy first
for i, currPlayerDownsync := range currRenderFrame.PlayersArr {
nextRenderFramePlayers[i] = &PlayerDownsync{
Id: currPlayerDownsync.Id,
VirtualGridX: currPlayerDownsync.VirtualGridX,
VirtualGridY: currPlayerDownsync.VirtualGridY,
DirX: currPlayerDownsync.DirX,
DirY: currPlayerDownsync.DirY,
VelX: currPlayerDownsync.VelX,
VelY: currPlayerDownsync.VelY,
CharacterState: currPlayerDownsync.CharacterState,
InAir: true,
OnWall: false,
Speed: currPlayerDownsync.Speed,
BattleState: currPlayerDownsync.BattleState,
Score: currPlayerDownsync.Score,
Removed: currPlayerDownsync.Removed,
JoinIndex: currPlayerDownsync.JoinIndex,
Hp: currPlayerDownsync.Hp,
MaxHp: currPlayerDownsync.MaxHp,
FramesToRecover: currPlayerDownsync.FramesToRecover - 1,
FramesInChState: currPlayerDownsync.FramesInChState + 1,
ActiveSkillId: currPlayerDownsync.ActiveSkillId,
ActiveSkillHit: currPlayerDownsync.ActiveSkillHit,
FramesInvinsible: currPlayerDownsync.FramesInvinsible - 1,
BulletTeamId: currPlayerDownsync.BulletTeamId,
ChCollisionTeamId: currPlayerDownsync.ChCollisionTeamId,
RevivalVirtualGridX: currPlayerDownsync.RevivalVirtualGridX,
RevivalVirtualGridY: currPlayerDownsync.RevivalVirtualGridY,
ColliderRadius: currPlayerDownsync.ColliderRadius,
OnWallNormX: currPlayerDownsync.OnWallNormX,
OnWallNormY: currPlayerDownsync.OnWallNormY,
CapturedByInertia: currPlayerDownsync.CapturedByInertia,
}
nextRenderFramePlayers[i].Id = currPlayerDownsync.Id
nextRenderFramePlayers[i].VirtualGridX = currPlayerDownsync.VirtualGridX
nextRenderFramePlayers[i].VirtualGridY = currPlayerDownsync.VirtualGridY
nextRenderFramePlayers[i].DirX = currPlayerDownsync.DirX
nextRenderFramePlayers[i].DirY = currPlayerDownsync.DirY
nextRenderFramePlayers[i].VelX = currPlayerDownsync.VelX
nextRenderFramePlayers[i].VelY = currPlayerDownsync.VelY
nextRenderFramePlayers[i].CharacterState = currPlayerDownsync.CharacterState
nextRenderFramePlayers[i].InAir = true
nextRenderFramePlayers[i].OnWall = false
nextRenderFramePlayers[i].Speed = currPlayerDownsync.Speed
nextRenderFramePlayers[i].BattleState = currPlayerDownsync.BattleState
nextRenderFramePlayers[i].Score = currPlayerDownsync.Score
nextRenderFramePlayers[i].Removed = currPlayerDownsync.Removed
nextRenderFramePlayers[i].JoinIndex = currPlayerDownsync.JoinIndex
nextRenderFramePlayers[i].Hp = currPlayerDownsync.Hp
nextRenderFramePlayers[i].MaxHp = currPlayerDownsync.MaxHp
nextRenderFramePlayers[i].FramesToRecover = currPlayerDownsync.FramesToRecover - 1
nextRenderFramePlayers[i].FramesInChState = currPlayerDownsync.FramesInChState + 1
nextRenderFramePlayers[i].ActiveSkillId = currPlayerDownsync.ActiveSkillId
nextRenderFramePlayers[i].ActiveSkillHit = currPlayerDownsync.ActiveSkillHit
nextRenderFramePlayers[i].FramesInvinsible = currPlayerDownsync.FramesInvinsible - 1
nextRenderFramePlayers[i].BulletTeamId = currPlayerDownsync.BulletTeamId
nextRenderFramePlayers[i].ChCollisionTeamId = currPlayerDownsync.ChCollisionTeamId
nextRenderFramePlayers[i].RevivalVirtualGridX = currPlayerDownsync.RevivalVirtualGridX
nextRenderFramePlayers[i].RevivalVirtualGridY = currPlayerDownsync.RevivalVirtualGridY
nextRenderFramePlayers[i].ColliderRadius = currPlayerDownsync.ColliderRadius
nextRenderFramePlayers[i].OnWallNormX = currPlayerDownsync.OnWallNormX
nextRenderFramePlayers[i].OnWallNormY = currPlayerDownsync.OnWallNormY
nextRenderFramePlayers[i].CapturedByInertia = currPlayerDownsync.CapturedByInertia
if nextRenderFramePlayers[i].FramesToRecover < 0 {
nextRenderFramePlayers[i].FramesToRecover = 0
}

View File

@@ -98,7 +98,7 @@ func GenerateConvexPolygonColliderJs(unalignedSrc *Polygon2D, spaceOffsetX, spac
func GetCharacterConfigsOrderedByJoinIndex(speciesIdList []int) []*js.Object {
ret := make([]*js.Object, len(speciesIdList), len(speciesIdList))
for i, speciesId := range speciesIdList {
ret[i] = js.MakeWrapper(Characters[speciesId])
ret[i] = js.MakeFullWrapper(Characters[speciesId])
}
return ret
}
@@ -108,6 +108,47 @@ func ApplyInputFrameDownsyncDynamicsOnSingleRenderFrameJs(inputsBuffer *resolv.R
return ApplyInputFrameDownsyncDynamicsOnSingleRenderFrame(inputsBuffer, currRenderFrameId, collisionSys, collisionSysMap, collisionSpaceOffsetX, collisionSpaceOffsetY, chConfigsOrderedByJoinIndex, renderFrameBuffer, collision, effPushbacks, hardPushbackNormsArr, jumpedOrNotList)
}
func GetRoomDownsyncFrame(renderFrameBuffer *resolv.RingBuffer, frameId int32) *js.Object {
// [WARNING] Calling "renderFrameBuffer.GetByFrameId(frameId)" directly from transpiled frontend code would automatically invoke the expensive "$externalize" and "$mapArray"! See profiling result for more details.
candidate := renderFrameBuffer.GetByFrameId(frameId)
if nil == candidate {
return nil
}
return js.MakeWrapper(candidate.(*RoomDownsyncFrame))
}
func GetInputFrameDownsync(inputsBuffer *resolv.RingBuffer, inputFrameId int32) *js.Object {
candidate := inputsBuffer.GetByFrameId(inputFrameId)
if nil == candidate {
return nil
}
return js.MakeWrapper(candidate.(*InputFrameDownsync))
}
func GetInput(ifd *InputFrameDownsync, i int) uint64 {
// [WARNING] Calling "ifd.GetInputList()" directly from transpiled frontend code would make a copy of the array.
return ifd.InputList[i]
}
func GetPlayer(rdf *RoomDownsyncFrame, i int) *js.Object {
// [WARNING] Calling "rdf.GetPlayersArr()" directly from transpiled frontend code would automatically invoke the expensive "$externalize" and "$mapArray"! See profiling result for more details.
return js.MakeWrapper(rdf.PlayersArr[i])
}
func GetMeleeBullet(rdf *RoomDownsyncFrame, i int) *js.Object {
if TERMINATING_BULLET_LOCAL_ID == rdf.MeleeBullets[i].GetBulletLocalId() {
return nil
}
return js.MakeWrapper(rdf.MeleeBullets[i])
}
func GetFireballBullet(rdf *RoomDownsyncFrame, i int) *js.Object {
if TERMINATING_BULLET_LOCAL_ID == rdf.FireballBullets[i].GetBulletLocalId() {
return nil
}
return js.MakeWrapper(rdf.FireballBullets[i])
}
func main() {
js.Global.Set("gopkgs", map[string]interface{}{
"NewVec2DJs": NewVec2DJs,
@@ -136,5 +177,11 @@ func main() {
"ConvertToLastUsedRenderFrameId": ConvertToLastUsedRenderFrameId,
"ShouldGenerateInputFrameUpsync": ShouldGenerateInputFrameUpsync,
"IsGeneralBulletActive": IsGeneralBulletActive,
"GetRoomDownsyncFrame": GetRoomDownsyncFrame,
"GetInputFrameDownsync": GetInputFrameDownsync,
"GetPlayer": GetPlayer,
"GetMeleeBullet": GetMeleeBullet,
"GetFireballBullet": GetFireballBullet,
"GetInput": GetInput,
})
}