edit
This commit is contained in:
@@ -195,7 +195,34 @@
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
function calculateOptimalLocationSize() {
|
||||
// 1. Получаем размеры видимой области
|
||||
const width = window.innerWidth;
|
||||
const height = window.innerHeight;
|
||||
|
||||
// 2. Получаем текущий размер шрифта (из состояния или напрямую из настроек)
|
||||
// Если размер шрифта еще не задан, используем 18px по умолчанию
|
||||
const fontSize = state.currentFontSize || 18;
|
||||
|
||||
// 3. Эмпирический коэффициент:
|
||||
// На 1 квадратный пиксель при 18-м шрифте приходится примерно 0.005 - 0.007 символа.
|
||||
// Мы рассчитываем "площадь" одного символа.
|
||||
// Чем больше шрифт, тем больше места занимает символ (квадратичная зависимость).
|
||||
const charArea = (fontSize * fontSize) * 0.55;
|
||||
|
||||
// 4. Рассчитываем общую вместимость экрана в символах
|
||||
const screenArea = width * height;
|
||||
let charactersPerScreen = Math.floor(screenArea / charArea);
|
||||
|
||||
// 5. Ограничиваем значения для стабильности epub.js
|
||||
// Минимум 400 (чтобы не плодить тысячи локаций на маленьких текстах)
|
||||
// Максимум 1500 (чтобы избежать "залипания" на больших экранах)
|
||||
const finalSize = Math.max(400, Math.min(1500, charactersPerScreen));
|
||||
|
||||
debugLog(`Расчет локации: Экран ${width}x${height}, Шрифт ${fontSize}px => Размер локации: ${finalSize}`);
|
||||
|
||||
return finalSize;
|
||||
}
|
||||
// ========== MESSAGE BRIDGE (Связь с приложением) ==========
|
||||
function sendMessage(action, data) { // Отправка данных в нативный код (C# / Swift / Kotlin)
|
||||
const message = JSON.stringify({ action, data: data || {} });
|
||||
@@ -299,8 +326,10 @@
|
||||
} else {
|
||||
debugLog("Кэша нет, считаем в фоне...");
|
||||
// Используем setTimeout, чтобы не блокировать поток отрисовки
|
||||
const dynamicSize = calculateOptimalLocationSize();
|
||||
// Запускаем генерацию с динамическим размером
|
||||
setTimeout(() => {
|
||||
state.book.locations.generate(2000).then(() => {
|
||||
state.book.locations.generate(dynamicSize).then(() => {
|
||||
state.totalPages = state.book.locations.length();
|
||||
const locationsToSave = state.book.locations.save();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user