나는 퀘이크 2에서 느슨하게 내려온 게임 엔진에서 스크립트 효과와 같은 몇 가지를 추가하고 있습니다 (서버가 특수 클라이언트가 할 수있는 하드 코딩 된 효과의 수가 제한적이 아니라 클라이언트에 세부적으로 영향을줍니다.) 이는 유연성을위한 네트워크 효율성의 균형입니다.매우 작은 양의 데이터 (3-4 키브)에 가장 적합한 압축 라이브러리는 무엇입니까
나는 흥미로운 장벽을 맞았습니다. 최대 패킷 크기는 2800 바이트이며 하나의 프레임 당 클라이언트 당 하나 밖에 나갈 수 없습니다.
다음은 "불꽃"효과 (불꽃 충돌, 전기 충격 등)에 유용한 스크립트입니다. http://pastebin.com/m7acdf519 (이해가되지 않으면 땀을 흘리지 말고 사용자 정의 구문은 내가 만든 질문과 관련이 없습니다.)
해당 스크립트의 크기를 줄이기 위해 가능한 모든 작업을 수행했습니다. 변수 이름을 한 글자로 줄였습니다. 그러나 결과는 정확히 405 바이트입니다. 이것은 프레임 당 최대 6 개에 맞출 수 있음을 의미합니다. 또 다른 서버 측 변경 사항을 고려하여 서버 측 변경 사항을 12 가지로 줄일 수 있었고 프로토콜 변경으로 인해 다른 6 가지를 줄일 수있었습니다. 절약 효과는 어떤 스크립트를 사용하는지에 따라 달라질 수 있습니다.
그러나 387 바이트 중 41 개만 효과의 여러 용도간에 고유 할 것으로 추산됩니다. 다시 말해 압축에 가장 적합한 후보입니다.
R1Q2 (확장 네트워크 프로토콜이있는 이전 버전과 호환되는 Quake 2 엔진)에는 Zlib 압축 코드가 있습니다. 나는이 코드를 들어 올리거나 적어도 그것을 참조로 따라갈 수있다.
하지만 Zlib이 가장 좋은 선택일까요? 나는 적어도 하나의 대안 인 LZMA를 생각할 수 있으며, 더 쉽게 될 수 있습니다.
요구 사항 :
- 가 매우 빠른이어야합니다
- 2800 바이트
- 소형에 가능한 한 많은 데이터를 벼락 공부를해야합니다 (100 회 두 번째를 실행하면 매우 작은 성능 저하가 있어야합니다.) 메타 데이터 공간
- GPL Zlib의 좋은 찾고 있지만, 거기에 더 나은 아무것도입니다
호환? 이 코드는 아직 병합되지 않으므로 실험을위한 충분한 공간이 있습니다.
감사합니다, - 최대
편집 : 바이트 코드로 스크립트를 컴파일 제안 사람들에게 감사합니다. 나는 이것을 분명히해야했다. 예, 나는 이것을하고 있습니다. 내 웹 사이트에서 관련 소스 코드를 탐색 할 수 있습니다. 여전히 "유용"하지는 않습니다.
루아 구성 요소 : http://meliaserlow.dyndns.tv:8000/alienarena/lua_source/lua/scriptedfx.lua이
C 성분 : 나는 게시 된 특정 스크립트 예를 들어 http://meliaserlow.dyndns.tv:8000/alienarena/lua_source/game/g_scriptedfx.c
, 이것은 아래 여전히 405 bytes-- 충분히 작은하지에 1172 바이트 소스 가져
이 서버 측 코드입니다. (가능한 한 많은 수를 2800 바이트에 맞춰야한다는 것을 명심하십시오.)
EDIT2 : 주어진 패킷이 도착할 것이라는 보장은 없습니다.각 패킷은 이전 패킷에서 전달 된 정보에 의존하지 않고 "세계의 상태"를 포함해야합니다. 일반적으로이 스크립트는 "눈 사탕"을 전달하는 데 사용됩니다. 하나를위한 여지가 없다면, 그것은 패킷에서 떨어지면 큰 문제가 아닙니다. 그러나 너무 많은 것이 떨어지면, 일들이 시각적으로 이상하게 보이기 시작하며 바람직하지 않습니다.
압축면에서 빠르거나 압축 해제시에만 필요합니까? –
압축 속도가 더 중요하다고 말할 수 있습니다. 클라이언트마다 프레임 당 각 클라이언트에 대해 서로 다른 패킷이 압축되기 때문에 (클라이언트가 프레임 당 하나의 패킷을 압축 해제해야합니다.) –
이것은 오래되었지만 궁금합니다. 왜 전체 스크립트를 보내야합니까? 플레이어가 연결될 때 (또는 게임 중간에 게임을 추가해도 각 게임을 한 번만 보내면) 한 번에 프레임 단위로 처리 한 다음 스크립트 ID와 매개 변수를 보내면됩니까? – Leushenko