85 lines
2.3 KiB
TypeScript
85 lines
2.3 KiB
TypeScript
import * as fs from "fs";
|
|
import { performance } from "perf_hooks";
|
|
import { createSnakeFromCells } from "@snk/types/snake";
|
|
import { realistic as grid } from "@snk/types/__fixtures__/grid";
|
|
import { AnimationOptions, createGif } from "..";
|
|
import { getBestRoute } from "@snk/solver/getBestRoute";
|
|
import { getPathToPose } from "@snk/solver/getPathToPose";
|
|
import type { Options as DrawOptions } from "@snk/draw/drawWorld";
|
|
|
|
let snake = createSnakeFromCells(
|
|
Array.from({ length: 4 }, (_, i) => ({ x: i, y: -1 }))
|
|
);
|
|
|
|
// const chain = [snake];
|
|
// for (let y = -1; y < grid.height; y++) {
|
|
// snake = nextSnake(snake, 0, 1);
|
|
// chain.push(snake);
|
|
|
|
// for (let x = grid.width - 1; x--; ) {
|
|
// snake = nextSnake(snake, (y + 100) % 2 ? 1 : -1, 0);
|
|
// chain.push(snake);
|
|
// }
|
|
// }
|
|
|
|
const chain = getBestRoute(grid, snake)!;
|
|
chain.push(...getPathToPose(chain.slice(-1)[0], snake)!);
|
|
|
|
const drawOptions: DrawOptions = {
|
|
sizeDotBorderRadius: 2,
|
|
sizeCell: 16,
|
|
sizeDot: 12,
|
|
colorDotBorder: "#1b1f230a",
|
|
colorDots: { 1: "#9be9a8", 2: "#40c463", 3: "#30a14e", 4: "#216e39" },
|
|
colorEmpty: "#ebedf0",
|
|
colorSnake: "purple",
|
|
};
|
|
|
|
const animationOptions: AnimationOptions = { frameDuration: 100, step: 1 };
|
|
|
|
(async () => {
|
|
for (
|
|
let length = 10;
|
|
length < chain.length;
|
|
length += Math.floor((chain.length - 10) / 3 / 10) * 10
|
|
) {
|
|
const stats: number[] = [];
|
|
|
|
let buffer: Buffer;
|
|
const start = Date.now();
|
|
const chainL = chain.slice(0, length);
|
|
for (let k = 0; k < 10 && (Date.now() - start < 10 * 1000 || k < 2); k++) {
|
|
const s = performance.now();
|
|
buffer = await createGif(
|
|
grid,
|
|
null,
|
|
chainL,
|
|
drawOptions,
|
|
animationOptions
|
|
);
|
|
stats.push(performance.now() - s);
|
|
}
|
|
|
|
console.log(
|
|
[
|
|
"---",
|
|
`grid dimension: ${grid.width}x${grid.height}`,
|
|
`chain length: ${length}`,
|
|
`resulting size: ${(buffer!.length / 1024).toFixed(1)}ko`,
|
|
`generation duration (mean): ${(
|
|
stats.reduce((s, x) => x + s) / stats.length
|
|
).toLocaleString(undefined, {
|
|
maximumFractionDigits: 0,
|
|
})}ms`,
|
|
"",
|
|
].join("\n"),
|
|
stats
|
|
);
|
|
|
|
fs.writeFileSync(
|
|
`__tests__/__snapshots__/benchmark-output-${length}.gif`,
|
|
buffer!
|
|
);
|
|
}
|
|
})();
|