перепиши этот код в единый цикл за раз отрисовывающий все значения ticks и если надо рисующий под ними  числа.             -- Отрисовка основных делений
            for x = ticks.main.startX, ticks.main.endX, ticks.main.width do
                renderDrawLine(speedometer.posX + x, speedometer.posY + ticks.main.startY, speedometer.posX + x, speedometer.posY + ticks.main.endY, 1, theme.text )
            end

            -- Отрисовка промежуточных делений
            for x = ticks.secondary.startX, ticks.secondary.endX, ticks.main.width do
                renderDrawLine(speedometer.posX + x, speedometer.posY + ticks.secondary.startY, speedometer.posX + x, speedometer.posY + ticks.secondary.endY, 1, theme.text)
            end

            -- Отрисовка чисел скорости
            for speed = 0, speedometer.maxSpeed, ticks.main.width do
                local length = renderGetFontDrawTextLength(fonts.small, tostring(speed))
                local height = renderGetFontDrawHeight(fonts.small)
                renderFontDrawText(
					fonts.small,
					tostring(speed),
					speedometer.posX + speed + speedBar.offsetX - (length / 2),
					speedometer.posY + labels.speedOffsetY - (height / 2),
					theme.text
				)
            end у меня есть небольшие референсы того, какие данные из таблиц оно должно использовать. сейчас оно использует - local ticks = {
    main = {
        width = 20,
        startX = 20,
        endX = 180,
		milesPerTick = 20
        startY = 35,
        endY = 40
    },
    secondary = {
        width = 10,
        startX = 30,
        endX = 180,
		milesPerTick = 20
        startY = 35,
        endY = 38
    }
}, должно чтото вроде local ticks = {
    main = {
        -- width = 20,
        -- startX = 20,
        -- endX = 180,
		milesPerTick = 20,
        -- startY = 35,
		height = 10,
        -- endY = 40
		padding = 'end'
    },
    secondary = {
        -- width = 10,
        -- startX = 30,
        -- endX = 180,
		milesPerTick = 20,
        -- startY = 35,
		height = 3,
        -- endY = 38
		padding = 'end'
    }
} где заккоментированные значения не используются,  высота - значение вертикальной длинны линии, а начало линии(верхняя ее точка, от которой измеряется высота) берется в зависимости от allign либо из центра speedBar, либо из конца, либо из начала. по вертикали)  	для понимания вот тебе вся база, неизмененнная. local fonts = {
    small = renderCreateFont('Arial', 6.5, 0),
    medium = renderCreateFont('Arial', 8.125),
    large = renderCreateFont('Arial', 16.25, 0)
}

local speedometer = {
    maxSpeed = 160,
    width = 200,
    height = 70,
    posX = 1200,
    posY = 730,
    borderWidth = 1.1
}

local speedBar = {
	allign = 'center', 
	padding = 20,
--  width = 160,
    height = 25,
    offsetX = speedometer.width/2,
    offsetY = 10
}

local ticks = {
    main = {
        -- width = 20,
        -- startX = 20,
        -- endX = 180,
		milesPerTick = 20,
        -- startY = 35,
		height = 10,
        -- endY = 40
		padding = 'end'
    },
    secondary = {
        -- width = 10,
        -- startX = 30,
        -- endX = 180,
		milesPerTick = 20,
        -- startY = 35,
		height = 3,
        -- endY = 38
		padding = 'end'
    }
}

local labels = {
    speedOffsetY = 48,
    currentSpeedOffsetY = 10 + speedBar.height / 2,
    labelOffsetY = 62
}