Оптимизация обнаружения обновлений файловC#

Место общения программистов C#
Ответить
Anonymous
 Оптимизация обнаружения обновлений файлов

Сообщение Anonymous »

Я работаю над средством запуска игр на C#, которое гарантирует постоянное обновление игры Unity без повторной загрузки всех ее файлов при каждом обновлении. Каждый раз при создании новой версии я генерирую и загружаю файл JSON, который сопоставляет каждый файл игры с его 8-значной контрольной суммой CRC32.
Со стороны пользователя, локально повторно вычисляя контрольную сумму и сравнивая ее со значениями в онлайн-JSON, я могу проверить, какие файлы отличаются (будь то из-за обновления или вмешательства пользователя), и загрузить только те, которые отличаются.
< предварительно class="lang-json Prettyprint-override">

Код: Выделить всё

"checksums" :
{
"path/file.ext" : "ABCDEFGH",
...
}
Процесс работает, но я хотел бы ускорить вычисление контрольной суммы, которое для примерно 500 файлов (всего около 500 МБ) занимает около 30 секунд моя машина (и, вероятно, больше у большинства конечных пользователей). Это значение рассчитывается, как только открывается панель запуска, а это означает, что если обновлений нет, пользователь застревает в ожидании завершения, прежде чем он сможет запустить настоящую игру. Я предполагаю, что CRC32 уже достаточно быстр, и что мое узкое место полностью связано с вводом-выводом. Я также читаю файлы с помощью File.ReadAllBytesAsync(), у которого есть свои проблемы.

Код: Выделить всё

public static async UniTask GetChecksumAsync(string _filePath)
{
byte[] fileBytes = await File.ReadAllBytesAsync(_filePath);
uint crcValue = ComputeChecksum(fileBytes);
return crcValue.ToString("X8");
}
Что я уже пробовал
  • Прежде чем вычислять контрольные суммы, я сначала сравниваю версии. txt с его онлайн-аналогом. Предполагая, что большинство пользователей не будут трогать файлы игры, этого должно быть достаточно, чтобы знать, есть ли обновление для загрузки или нет. Но даже если и есть, контрольные суммы все равно придется вычислять.
  • Вместо того, чтобы читать содержимое файла, я подумал, что можно просто использовать FileInfo , чтобы прочитать дату последнего изменения и объединить ее с размером в байтах, пропуская любую контрольную сумму. Очевидно, что это происходит намного быстрее (с 30 с до 60 мс). К сожалению, когда файл загружается на компьютер пользователя, его дата последнего изменения также обновляется в соответствии с меткой времени загрузки. Кроме того, это не всегда работает должным образом, поскольку эти значения иногда не обновляются операционной системой мгновенно.
  • Я использую Azure Blobs как служба хранилища, чтобы я мог читать поля ETag или ContentMD5, которые Azure предоставляет для каждого файла. Тем не менее, мне придется пересчитывать их локально, чтобы сравнить, но это не решает проблему.
Проверка файлов игры на предмет вмешательства пользователя не является строгой необходимостью. Я был бы доволен решением, которое было бы быстрым и определяло, какие файлы следует обновить.
Существует ли отраслевой стандарт для обработки обнаружения обновлений? Как бы вы это сделали?

Подробнее здесь: https://stackoverflow.com/questions/793 ... -detection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»