Просто It's not much, but it's honest work без седого мужика теряет магию.Dara, другого дяди не было? я не такой уж и седой)
Онлайн До фикса После фикса
-------------------------------------
22 12.5 TPS 12.5 TPS
112 0.2 TPS 12.6 TPS
281 0.05 TPS 12.5 TPS
-------------------------------------
Параметр [ GC-profile ] [ Lock-profile ]
------------------------------------------------------------
Аллокации 15.43 MB/s 9.39 MB/s
Аллокаций в секунду 302,595/s 52,642/s
Загрузка кадра 73.17% 84.18%
p99 58.54 ms 67.34 ms
------------------------------------------------------------
В обоих режимах видно, что серверу приходится очень тяжело. В первом случае — что GC тонет в мусоре, а во втором — что конкуренция за блокировки аффектит весь сервер.
А это ещё не реальный онлайнГарантированно паузы GC и особенно на большом онлайне будут видны, уже кстати проверено на 1 проекте tencent при 1к+ онлайне и одновременном выполнение действий видно было как летели ошибки и паузы сборщика мусора, а к ним добавится latency spikes и засорение памяти временными объектами
Параметр [ Non-fight (1k) ] [ Fight (1k) ] [ Simulation (1k) ] [ Simulation (3k) ]
------------------------------------------------------------------------------------------------------------
Аллокации 1.38 MB/s 2.54 MB/s 4.12 MB/s 13.48 MB/s
Аллокаций в секунду 57,412/s 91,894/s 148,230/s 449,112/s
Загрузка кадра 22.14% 38.92% 54.85% 93.12%
p99 14.28 ms 26.41 ms 41.17 ms 78.54 ms
------------------------------------------------------------------------------------------------------------
kick, спасибо за веру в проект и в меня
Зависит от развития анального отверстия. Проверь возможно тебе уже и не страшно.а вера в экскаватор поможет удалить гланды через жопу не летально?
func (g *Geo) CanMove(from, to Vec3) bool {
prevX, prevY, prevZ := from.X, from.Y, from.Z
first, ok := true, true
TraverseCells(from.X, from.Y, to.X, to.Y, func(cx, cy int32, _ float64) bool {
if first {
prevX, prevY, prevZ = cx, cy, g.HeightAt(cx, cy, prevZ)
first = false
return true
}
dx, dy := cx - prevX, cy - prevY
if dx == 0 && dy == 0 { return true }
if dx != 0 && dy != 0 {
nz, dok := g.canDiag(prevX, prevY, prevZ, dx, dy)
if !dok { ok = false; return false }
prevX, prevY, prevZ = cx, cy, nz
return true
}
var bit uint8
switch {
case dx == 1: bit = NSWE_EAST
case dx == -1: bit = NSWE_WEST
case dy == 1: bit = NSWE_SOUTH
case dy == -1: bit = NSWE_NORTH
}
nz, sok := g.canStep(prevX, prevY, prevZ, cx, cy, bit)
if !sok { ok = false; return false }
prevX, prevY, prevZ = cx, cy, nz
return true
})
func (g *Geo) canStep(x, y, z, nx, ny int32, dirBit uint8) (int32, bool) {
if g.NSWEAt(x, y, z)&dirBit == 0 { return 0, false }
if nx < 0 || ny < 0 || nx >= g.Width || ny >= g.Height { return 0, false }
l := g.LayerAtJump(nx, ny, z)
if l == nil || l.NSWE == 0 { return 0, false }
dz := l.Height - z
if dz < -JumpMaxHeight || dz > JumpMaxHeight { return 0, false }
return l.Height, true
}
может лучше все таки на java ? Не так печально будет все по реализации.False, моя текущая реализация далека от идеала т.к. там есть некоторые проблемы на коротких дистанциях.
А так, специально для тебя:
Код:func (g *Geo) CanMove(from, to Vec3) bool { prevX, prevY, prevZ := from.X, from.Y, from.Z first, ok := true, true TraverseCells(from.X, from.Y, to.X, to.Y, func(cx, cy int32, _ float64) bool { if first { prevX, prevY, prevZ = cx, cy, g.HeightAt(cx, cy, prevZ) first = false return true } dx, dy := cx - prevX, cy - prevY if dx == 0 && dy == 0 { return true } if dx != 0 && dy != 0 { nz, dok := g.canDiag(prevX, prevY, prevZ, dx, dy) if !dok { ok = false; return false } prevX, prevY, prevZ = cx, cy, nz return true } var bit uint8 switch { case dx == 1: bit = NSWE_EAST case dx == -1: bit = NSWE_WEST case dy == 1: bit = NSWE_SOUTH case dy == -1: bit = NSWE_NORTH } nz, sok := g.canStep(prevX, prevY, prevZ, cx, cy, bit) if !sok { ok = false; return false } prevX, prevY, prevZ = cx, cy, nz return true })Код:func (g *Geo) canStep(x, y, z, nx, ny int32, dirBit uint8) (int32, bool) { if g.NSWEAt(x, y, z)&dirBit == 0 { return 0, false } if nx < 0 || ny < 0 || nx >= g.Width || ny >= g.Height { return 0, false } l := g.LayerAtJump(nx, ny, z) if l == nil || l.NSWE == 0 { return 0, false } dz := l.Height - z if dz < -JumpMaxHeight || dz > JumpMaxHeight { return 0, false } return l.Height, true }
что ты знаешь про хобби людей? есть мужики, которые стоят на пероне вокзала, и проверяют, вовремя ли приехал поезд каждый. и это не работники или проверяющие. или хобби- хорсинг погугли. л2 на ГО - еще не самый плохой вариантможет лучше все таки на java ? Не так печально будет все по реализации.
Зато у тебя есть теперь официальная причина чтобы потом забросить проектспасибо за веру в проект и в меня
┌─────────────────┬────────────┐
│ Метрика │ Значение │
├─────────────────┼────────────┤
│ online │ 3500 │
├─────────────────┼────────────┤
│ TPS % │ 100% │
├─────────────────┼────────────┤
│ budget max % │ 49% │
├─────────────────┼────────────┤
│ heap max │ 1.46 GB │
├─────────────────┼────────────┤
│ p99 │ 22-28 ms │
├─────────────────┼────────────┤
│ combat │ 60740 cyc. │
└─────────────────┴────────────┘
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?