Я работаю над игровым движком, слабо унаследованным от Quake 2, добавляя некоторые вещи, такие как скриптовые эффекты (позволяя серверу детально задавать специальные эффекты клиенту, вместо того, чтобы иметь только ограниченное количество жестко закодированных эффектов, которые клиент способен.) Это компромисс эффективности сети для гибкости.
Я столкнулся с интересным барьером. Видите, максимальный размер пакета составляет 2800 байт, и только один может выходить на одного клиента на кадр.
Вот сценарий для создания эффекта "искры" (может быть полезен для искр от пуль, электрических ударов и т. Д.)
http://pastebin.com/m7acdf519 (Если вы этого не понимаете, не переживайте; это мой собственный синтаксис, который не имеет отношения к вопросу, который я задаю.)
Я сделал все возможное, чтобы уменьшить размер этого скрипта. Я даже сократил имена переменных до отдельных букв. Но результат составляет ровно 405 байтов. Это означает, что вы можете разместить не более 6 из них на кадр. Я также имею в виду некоторые изменения на стороне сервера, которые могли бы сократить его еще на 12, и изменение протокола, которое могло бы спасти еще 6. Хотя экономия будет зависеть от того, с каким сценарием вы работаете.
Однако из этих 387 байтов я считаю, что только 41 будет уникальным при многократном использовании эффекта. Другими словами, это главный кандидат на сжатие.
Так получилось, что R1Q2 (обратно совместимый движок Quake 2 с расширенным сетевым протоколом) имеет код сжатия Zlib. Я мог бы поднять этот код или, по крайней мере, следовать ему как справочнику.
Но разве Злиб обязательно лучший выбор здесь? Я могу придумать хотя бы одну альтернативу, LZMA, и их может быть просто больше.
Требования:
- Должно быть очень быстрым (должен иметь очень маленький удар по производительности, если работает более 100 раз в секунду).
- Необходимо собрать как можно больше данных в 2800 байт
- Небольшой след метаданных
- GPL совместимый
Злиб выглядит хорошо, но есть ли что-нибудь лучше? Имейте в виду, что ни один из этого кода еще не объединяется, поэтому есть много места для экспериментов.
Спасибо,
-Макс
РЕДАКТИРОВАТЬ: Спасибо тем, кто предложил компилировать скрипты в байт-код. Я должен был прояснить это - да, я делаю это. Если вам нравится, вы можете просмотреть соответствующий исходный код на моем веб-сайте, хотя он по-прежнему не является «симпатичным».
Это код на стороне сервера:
Lua компонент: http://meliaserlow.dyndns.tv:8000/alienarena/lua_source/lua/scriptedfx.lua
Компонент C: http://meliaserlow.dyndns.tv:8000/alienarena/lua_source/game/g_scriptedfx.c
Для конкретного примера сценария, который я разместил, это приводит к уменьшению источника в 1172 байта до 405 байтов - но все еще недостаточно. (Имейте в виду, что я хочу разместить как можно больше из них в 2800 байт!)
EDIT2: нет никакой гарантии, что какой-либо данный пакет прибудет. Каждый пакет должен содержать «состояние мира», не полагаясь на информацию, переданную в предыдущих пакетах. Как правило, эти сценарии будут использоваться для сообщения "конфетка глаз". Если для одного места нет места, он выпадает из пакета, и в этом нет ничего страшного. Но если их бросить слишком много, все начинает выглядеть странно, и это нежелательно.