Jump to content

[Ayuda] Solucion a los loops grandes/coroutines


Recommended Posts

Hola buenas, a falta de la necesidad de un descompresor de archivos zip en mta (lo cual me sorprende que en pleno 2018 aun no tenga uno), me vi en la obligacion de usar una libreria existente. Necesito saber como reescribir parte de la funcion getb() puesto que el loop que genera en archivos superiores a 2mb puede llegar a ser realmente gigantesco y MTA por consiguiente termina abortandolo. He visto que hay formas de hacerlo con coroutines (pausandolas y resumiendolas), pero no logro entender como adaptar parte de las funciones que estan dentro de la funcion principal, puesto que estan en OOP, lo cual para mi sigue siendo medio chino.
Ojalas me puedan echar una mano con esto, mas alla de que parte del codigo ya haya estado hecho, la verdad es que me tomo bastante tiempo adaptarlo a las funciones de MTA y escribir todo el resto, horas y horas de testeo. Se tambien que con debug.setHook(nil) se pueden forzar loops largos pero el lag que generaria realmente no lo compensa.

-- file = string obtenido desde fileRead

local function bitstream_init(file)
	local bs = {
		file = file,
		buf = nil,
		len = nil,
		pos = 1,
		b = 0,  
		n = 0,  
	}
      function bs:flushb(n)
          self.n = self.n - n
          self.b = bitRShift(self.b,n)
      end
		function bs:getb(n)
			while self.n < n do
				if self.pos > self.len then
					self.buf = self.file:read(4096)
					self.len = self.buf:len()
					self.pos = 1
				end
				self.b = self.b + bitLShift(self.buf:byte(self.pos),self.n)
				self.pos = self.pos + 1
				self.n = self.n + 8
			end
			local ret = bitAnd(self.b,bitLShift(1,n)-1)
			self.n = self.n - n
			self.b = bitRShift(self.b,n)
			return ret
		end
	function bs:getv(hufftable,n)
		while self.n < n do
			if self.pos > self.len then
				self.buf = self.file:read(4096)
				self.len = self.buf:len()
				self.pos = 1
			end
			self.b = self.b + bitLShift(self.buf:byte(self.pos),self.n)
			self.pos = self.pos + 1
			self.n = self.n + 8
		end
		local h = reverse[bitAnd(self.b,255)]
		local l = reverse[bitAnd(bitRShift(self.b,8),255)]
		local v = bitAnd(bitRShift(bitLShift(h,8)+l,16-n),bitLShift(1,n)-1)
		local e = hufftable[v]
		local len = bitAnd(e,15)
		local ret = bitRShift(e,4)
		self.n = self.n - len
		self.b = bitRShift(self.b,len)
		return ret
	end
	function bs:close()
		if self.file then
			self.file:close()
		end
	end
	if type(file) == "string" then
		bs.file = nil
		bs.buf = file
	end
	bs.len = bs.buf:len()
	return bs
end


Gracias de antemano!

 

Edited by [?]Itachi
Link to comment

Se que ya solucionaste tú tema, pero todavía no entiendo cual fue tu problema con los ZIP. Espero y en tú servidor no estés poniendo los zips directo a la carpeta de resources, ya que esto te va a generar una carpeta el re dope en otro directorio, donde va a estar descomprimido. También estaría bueno que dejes la solución para que otros la puedan encontrar a futuro. Suerte.

Link to comment
  • 2 weeks later...
On 13/5/2018 at 12:44, Platin - xNikoXD said:

Se que ya solucionaste tú tema, pero todavía no entiendo cual fue tu problema con los ZIP. Espero y en tú servidor no estés poniendo los zips directo a la carpeta de resources, ya que esto te va a generar una carpeta el re dope en otro directorio, donde va a estar descomprimido. También estaría bueno que dejes la solución para que otros la puedan encontrar a futuro. Suerte.

Creo que ahi dice bien claro cual era mi problema con los zips: el modulo para extraerlos generaba un loop gigantesco el cual MTA aborta. Con la ayuda de un par de tutoriales de coroutines logre hacerlo. Mi intencion era hacer un sistema de subida de archivos de la mano con dropbox, la verdad dudo que alguien alguna vez implemente esto por 3 razones algo triviales, la primera es el uso de CPU para extraer archivos de mas de 2mb, la segunda que para los jugadores esto podria ser algo tedioso (sobretodo para el jugador promedio de MTA que se le rompe el mundo cuando un server pesa mas de 20mb), y la tercera que la mayoria usan subidas desde las web de los servidores y se ahorran todo este trabajo. Esto en todo caso no fue mas que un experimento para ver si es que era posible hacer todo este sistema, y vaya que lo fue.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...