Технически в опенкомпах нет потоков, и все ОСи могут лишь софтверно "скакать" с одной операции на другую, периодически блокируя друг друга и выполняя таски по списку. То есть тут всё блокирующее. Если тебя устроит просто отображать TPS раз в N сек, то заюзай таймер. Код для опеноси:
local event = require("event")
local computer = require("computer")
local component = require("component")
local gpu = component.gpu
-- Возвращает кол-во реальных (не игровых) наносекунд, прошедших с 00:00:00 01.01.1970 до момента изменения файла на диске
local function getRealTimestamp()
-- Получаем виртуального компонента filesystem, где можно создавать временную помойку
local proxy = component.proxy(computer.tmpAddress())
local path = "timestamp.tmp"
-- Создаем временный файл
proxy.close(proxy.open(path, "wb"))
-- Получаем дату изменения
local lastModified = proxy.lastModified(path)
-- Удаляем его
proxy.remove(path)
return lastModified
end
-- Стартуем фоновый таймер, обновляющийся раз в 1 сек
local interval = 1
local lastModified = getRealTimestamp()
event.timer(
interval,
function()
-- Примерное значение TPS рассчитывается как расхождение между желаемым интервалом в 1 сек и фактическим,
-- полученным через разницу в датах изменения временного файла
local tps = interval / (getRealTimestamp() - lastModified) * 20000
-- Выводим значение TPS на экран
local oldForeground = gpu.getForeground()
gpu.setForeground(0xFFFFFF)
gpu.set(1, 1, "TPS: " .. math.floor(tps + 0.5))
gpu.setForeground(oldForeground)
-- Все операции вывода на экран занимают время, лучше обновить переменную ещё раз для точности
lastModified = getRealTimestamp()
end
)
Профит:
И для майноси:
local computer = require("Computer")
local component = require("Component")
local GUI = require("GUI")
local system = require("System")
-- Функция та же
local function getRealTimestamp()
local proxy = component.proxy(computer.tmpAddress())
local path = "timestamp.tmp"
proxy.close(proxy.open(path, "wb"))
local lastModified = proxy.lastModified(path)
proxy.remove(path)
return lastModified
end
-- Добавляем окошко программы в UI
local workspace, window, menu = system.addWindow(GUI.filledWindow(1, 1, 60, 20, 0xE1E1E1))
-- Создаем текстовый виджет по центру окошка
local layout = window:addChild(GUI.layout(1, 1, window.width, window.height, 1, 1))
local text = layout:addChild(GUI.text(1, 1, 0x4B4B4B, "Тут будет TPS"))
-- Вместо event.timer юзаем computer.uptime
local uptime = computer.uptime()
-- С файликами история та же
local lastModified = getRealTimestamp()
local interval = 1
text.eventHandler = function(workspace, text, e1, ...)
-- Вычисляем, сколько сек прошло с последнего события
local deltaTime = computer.uptime() - uptime
-- Если прошло больше ожидаемого интервала
if deltaTime > interval then
-- Вычисляем TPS
local tps = deltaTime / (getRealTimestamp() - lastModified) * 20000
-- Обновляем текстовый виджет
text.text = "TPS: " .. math.floor(tps + 0.5)
text.width = #text.text
workspace:draw()
-- Обновляем переменные
lastModified = getRealTimestamp()
uptime = computer.uptime()
end
end
workspace:draw()
Результат: