|
3 | 3 | { |
4 | 4 | "cell_type": "code", |
5 | 5 | "execution_count": null, |
6 | | - "metadata": { |
7 | | - "ExecuteTime": { |
8 | | - "end_time": "2025-08-16T04:33:07.335326Z", |
9 | | - "start_time": "2025-08-16T04:33:04.692050Z" |
10 | | - } |
11 | | - }, |
| 6 | + "metadata": {}, |
12 | 7 | "outputs": [], |
13 | 8 | "source": [ |
14 | 9 | "import com.hopskipnfall.*\n", |
|
60 | 55 | { |
61 | 56 | "cell_type": "code", |
62 | 57 | "execution_count": null, |
63 | | - "metadata": { |
64 | | - "ExecuteTime": { |
65 | | - "end_time": "2025-08-16T04:34:27.493147Z", |
66 | | - "start_time": "2025-08-16T04:33:07.351490Z" |
67 | | - } |
68 | | - }, |
| 58 | + "metadata": {}, |
69 | 59 | "outputs": [], |
70 | 60 | "source": [ |
71 | 61 | "%useLatestDescriptors\n", |
|
119 | 109 | { |
120 | 110 | "cell_type": "code", |
121 | 111 | "execution_count": null, |
122 | | - "metadata": { |
123 | | - "ExecuteTime": { |
124 | | - "end_time": "2025-08-16T04:34:29.938788Z", |
125 | | - "start_time": "2025-08-16T04:34:29.586695Z" |
126 | | - } |
127 | | - }, |
| 112 | + "metadata": {}, |
128 | 113 | "outputs": [], |
129 | 114 | "source": [ |
130 | 115 | "import org.emulinker.proto.Event.EventTypeCase.*\n", |
131 | 116 | "import java.io.FileInputStream\n", |
132 | 117 | "import org.emulinker.proto.GameLog\n", |
133 | 118 | "\n", |
134 | | - "val log: GameLog = FileInputStream(\"gamelog_1p_1f.bin\").use { GameLog.parseFrom(it.readBytes()) }\n", |
| 119 | + "val log: GameLog = FileInputStream(\"gamelog_2p_1f.bin\").use { GameLog.parseFrom(it.readBytes()) }\n", |
135 | 120 | "val events = log.eventsList\n", |
136 | 121 | "\n", |
137 | 122 | "println(\"Game configuration:\")\n", |
|
148 | 133 | { |
149 | 134 | "cell_type": "code", |
150 | 135 | "execution_count": null, |
151 | | - "metadata": { |
152 | | - "ExecuteTime": { |
153 | | - "end_time": "2025-08-16T04:34:32.428746Z", |
154 | | - "start_time": "2025-08-16T04:34:32.187285Z" |
155 | | - } |
156 | | - }, |
| 136 | + "metadata": {}, |
157 | 137 | "outputs": [], |
158 | 138 | "source": [ |
159 | 139 | "import org.emulinker.proto.Event\n", |
160 | 140 | "import org.jetbrains.kotlinx.dataframe.api.dataFrameOf\n", |
161 | 141 | "import org.jetbrains.kotlinx.dataframe.api.toDataFrame\n", |
162 | 142 | "\n", |
163 | | - "val summaries = events.filter { it.eventTypeCase == LAGSTAT_SUMMARY }\n", |
| 143 | + "val summaries = events.filter { it.eventTypeCase == LAGSTAT_SUMMARY && it.lagstatSummary.gameLagMs < 2000 }\n", |
164 | 144 | "\n", |
165 | 145 | "val time = column<Long>(\"Timestamp (ns)\")\n", |
166 | 146 | "val observedLag = column<Double>(\"Observed lag (ms)\")\n", |
167 | 147 | "val player1Lag = column<Double>(\"Player 1 attributed lag (ms)\")\n", |
| 148 | + "val player2Lag = column<Double>(\"Player 2 attributed lag (ms)\")\n", |
168 | 149 | "\n", |
169 | 150 | "val df = dataFrameOf(\n", |
170 | 151 | " time.name() to summaries.map { it.timestampNs },\n", |
171 | 152 | " observedLag.name() to summaries.map { it.lagstatSummary.gameLagMs },\n", |
172 | | - " player1Lag.name() to summaries.map { it.lagstatSummary.playerAttributedLagsList.single().attributedLagMs }\n", |
| 153 | + " player1Lag.name() to summaries.map { it.lagstatSummary.getPlayerAttributedLags(0).attributedLagMs },\n", |
| 154 | + " player2Lag.name() to summaries.map { it.lagstatSummary.getPlayerAttributedLags(1).attributedLagMs }\n", |
173 | 155 | ")\n", |
174 | 156 | "\n", |
175 | 157 | "df.plot {\n", |
|
183 | 165 | " y(player1Lag)\n", |
184 | 166 | " color = Color.BLUE\n", |
185 | 167 | " }\n", |
| 168 | + " points {\n", |
| 169 | + " y(player2Lag)\n", |
| 170 | + " color = Color.RED\n", |
| 171 | + " }\n", |
186 | 172 | " layout {\n", |
187 | 173 | " title = \"Server-measured lag\"\n", |
| 174 | + " subtitle = \"Grey is server, blue is p1, red is p2\"\n", |
188 | 175 | " }\n", |
189 | 176 | "}" |
190 | 177 | ] |
|
0 commit comments