Cheat Engine Forum Index Cheat Engine
The Official Site of Cheat Engine
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 


custom printer with faster luaEngine 'print'

 
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine Extensions
View previous topic :: View next topic  
Author Message
panraven
Grandmaster Cheater
Reputation: 55

Joined: 01 Oct 2008
Posts: 943

PostPosted: Thu Nov 16, 2023 7:37 am    Post subject: custom printer with faster luaEngine 'print' Reply with quote

The motivation of this extension is to speed up ce's normal 'print', which will output to the LuaEngine UI form.

The main function is 'new_printer(printer, sPrint)' where 'sPrint' is a function to convert inputs into some formatted string, then 'printer' is the function to output the string.

Each call of 'new_printer' will create a new function that equivalent to normal 'print', but may has differnet format, and different output target (for instance, it can be a memo in your custom form).

For 'sPrint' function, the extension provide 2 formation function, you may try make your own formation, eg. to expand/serialize table content ;
Code:

for input ('a',1,nil,true), the sample outputs are
normal   : a 1
num_sprt : [1] a, [2] 1, [3] nil, [4] true
    sprt : a,   1,   nil,   true



test code:
Code:

--[[
local oo = {}
local cc = 1
for ii =1,4 do
  cc = cc * 10
  local str = 'abc'
  local now1 = os.clock()
  math.randomseed(1)
  for i=1,cc do
    prt(i,str:rep(math.random(10,30),', '))
  end
  now1 = os.clock()-now1
  local now2 = os.clock()
  math.randomseed(1)
  for i=1,cc do
    print(i,str:rep(math.random(10,30),', '))
  end
  now2 = os.clock()-now2
  oo[1+#oo] = string.format('%8d:- prt:%10.4f, print:%10.4f, %6.2f%% ', cc, now1, now2, now2/now1*100)
end
createTimer(5000,print, table.concat(oo,'\n\r'))
--]]
--[[ sample result
      10:- prt:    0.0090, print:    0.0800,  888.88%

     100:- prt:    0.0760, print:    1.1080, 1457.89%

    1000:- prt:    0.8600, print:   12.0580, 1402.09%

   10000:- prt:    9.4840, print:  119.8530, 1263.73%
--]]



Other global:
- original_print : as named, the ce's original 'print' function; in case original 'print' changed, it can be restore with this variable;
- sprt : 'sPrint' formator to split items with tab;
- num_sprt : 'sPrint' formator to prefix items with the order number [1],[2], ... etc
- lua_engine_printer : 'printer' to speed up normal 'print';
- luaEngineprint : the default 'print' function with printer = lua_engine_printer and sPrint = num_sprt
- prt : alias of luaEngineprint

The script has not change the original 'print'.

GOOD:
- faster print using the default 'prt'
- show some variable that may be invincible in normal 'print'

BAD:
- the output of 'new_printer' function has a delay (max 1sec idle) to print;
- there can be make multiple 'print' to output to same target (a memo in a form), but since there is a delay, their mixed output may be out of order, eg.
'prt' and normal 'print' output to the same LuaEngine mOutput ui;
- unlike the default print this is not threadsafe/selfsynchronizing. Do not use outside of the main thread

Save this lua src into a *.lua file in ce's autorun directory
Code:

local function to_nvar(...)return select('#', ...), ... end
original_print = original_print or print
function sprt(...)
  local n, fs, tab = select('#',...), '%s',',\t'
  return string.format(fs:rep(n, tab), ...)
end

local function fmap_aux(fn, n, nxt, ...)
  if n>0 then return fn(nxt), fmap_aux(fn, n-1, ...)end
end
local function fmap(fn,...)return fmap_aux(fn, to_nvar(...))end
local function fmap_idx_aux(fn, i, n, nxt, ...)
  if n>0 then return i, fn(nxt), fmap_idx_aux(fn, i+1, n-1, ...)end
end
local function fmap_idx(fn,...)return fmap_idx_aux(fn, 1, to_nvar(...))end
local function iden(...)return ... end
function num_sprt(...)
  local n, fs, tab = select('#',...), '[%d] %s',', '
  return string.format(fs:rep(n, tab), fmap_idx(iden, ...))
end

function lua_engine_printer(str)
  str = type(str)=='string' and str or ''
  local ls = getLuaEngine().mOutput.Lines
  ls.beginUpdate()
  ls.Text = ls.Count>0 and table.concat({ls.Text, str}, '\n') or str
  ls.endUpdate()
  if ls.Count > 0 then -- to update displayed
    local last_idx = ls.Count - 1
    local last_line = ls.getString(last_idx)
    ls.delete(last_idx)
    original_print(last_line)
  else
    original_print''
    ls.delete(0)
  end
end

function new_printer(printer, sPrint)
  printer, sPrint = printer or original_print, sPrint or num_sprt
  local tmr, buf, cnt, max, nxt, sum = synchronize(createTimer), {}, 1, 500, os.clock(), 0
  local function flush()
    sum = 0, printer(table.concat(buf, '\n'))
    for i=cnt,1,-1 do buf[i]=nil end
    cnt = 1
  end
  tmr.Interval, tmr.Enabled, tmr.OnTimer = 500, true, function(tm)
    if cnt > 1 and os.clock() > nxt or cnt > max then flush()end
  end
  return function(...)
    local str = sPrint(...) or ''
    sum = sum + str:len()
    cnt, buf[cnt], nxt = cnt + 1,  str, os.clock() + 1
    getLuaEngine().Caption = string.format('Lua Engine / %d / %d',cnt-1, sum)
  end
end

luaEngineprint = new_printer(lua_engine_printer, num_sprt)
prt = luaEngineprint

_________________
- Retarded.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Cheat Engine Forum Index -> Cheat Engine Extensions All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group

CE Wiki   IRC (#CEF)   Twitter
Third party websites