Перейти к публикации
Форум - ComputerCraft
RccHD

testing WinOS v0.0.1 beta

Рекомендованные сообщения

В этой теме будет обсуждение жутких багов, которые вы найдете в операционке WinOS(Да, я решил дать такое название)
Ссылка на "Процесс разработки данной ОС"

 

Вот немного подробностей об получившейся "операционке":



Фичи

1. Возможность запускать 99% программ, которые изначально были написаны под OpenOS

2. Конфиг-менеджер(про него ниже)

3. Сервисы(подробнее ниже)

4. Возможность запуска нескольких программ одновременно. Каждая из программ будет запущена в виртуальном изолированном окружении

5. Есть переключение рабочих столов

6. Тайловый оконный менеджер



Вспомогательные программы

/usr/bin/workspace


Использование:

workspace <N : число>

Пример:

workspace 3

Описание:
После выполнения "workspace N" менеджер окон переключится на рабочий стол N, либо пользователю будет сообщено, что рабочего стола с номером N не существует



/usr/bin/split


Использование:

split <опция: v или h> <N: число>

Примеры:

split v 50
split h 33

Описание:
Эта утилита позволяет поделить текущее окно на 2 части.


Если указана опция v (по вертикали):
Окно будет разделено на 2 окна.
Первое окно будет иметь ширину N%, а второе окно -- (100 - N)%
Высота созданных окон будет равна высоте окна до выполнения команды split ( т.е. не изменится )

split1.gif?raw=true



Если указана опция h (по горизонтали):
Окно будет разделено на 2 окна.
Первое окно будет иметь высоту N%, а второе окно -- (100 - N)%
Ширина созданных окон будет равна ширине окна до выполнения команды split ( т.е. не изменится )

split2.gif?raw=true



Сервисы в WinOS

Сервис -- это программа, которая работает в фоне и делает что-то важное ( или не важное ).
Главное отличие серсиса от обычной программы -- сервисы имеют полный доступ к глобальным переменным. Сервисы могут использовать GPU, event, component напрямую, в то время как программы запущенные стандартным способом будут иметь доступ к имитированным(подмененным) версиям компонент компьютера.

Сервисы в WinOS нужны для различных менюшек, таймеров, слушателей событий и прочих программ, которые по каким-то причинам должны иметь прямой доступ к компонентам компьютера.
Программы-сервисы должны быть расположены в директории /WinOS/service/

Пример сервиса topbar.lua:

 

-- /WinOS/service/topbar.lua
local computer = require("computer")
local event = require("event")
local fs = require("filesystem")
local gpu = require("component").gpu
local process = require("process")
local state = {
    title = "WinOS: ",
    workspace = 1
}
local function draw()
    local w, h = gpu.getResolution()
    local workspaceIndex = state.workspace
    local manager = WinOS.manager -- менеджер окон
    local workspaceName = manager.workspaces[workspaceIndex]:sub(1, 8)
    local sec = computer.uptime()
    local ws = "[#"..tostring(workspaceIndex)..":"..workspaceName.."]"
    local mem = "Free mem: "..tostring(math.floor(computer.freeMemory() / computer.totalMemory() * 100))
        local function timeFormat(v)
        local s = tostring(math.floor(v))
        if s:len() == 1 then return "0"..s
        else return s:sub(1,2) end
    end
    local time = "Uptime: "..timeFormat(sec / 60)..":"..timeFormat(sec % 60)
    -- рисует простенькую панель
    -- на ней будет отображено номер и название текущего раб. стола
    -- а также % свободной ОЗУ и время работы компа
    gpu.setBackground(0xddaaaa)
    gpu.setForeground(0x441111)
    gpu.fill(1, 1, w, 1, " ")
    gpu.set(2, 1, ws)
            gpu.set(w - #time - 1, 1, time)
    gpu.set(w - #time - #mem - 4, 1, mem.." | ")
end
local ltime = 0
while true do
    local timer = computer.uptime()
    if timer > ltime + 0.1 then
        -- перерисовка каждые 100мс
        local oldbg = gpu.getBackground() -- BUGFIX
        local oldfg = gpu.getForeground() -- BUGFIX

        xpcall(draw)

        gpu.setBackground(oldbg) -- BUGFIX
        gpu.setForeground(oldfg) -- BUGFIX
        ltime = timer
    end
    local e = {event.pull(0.3)}
    -- Обновить внутреннее состояние панельки
    -- при событии 'WinOS_workspacechange'
    if e[1] == "WinOS_workspacechange" then
        state.workspace = e[2]
    end
end

 





Конфиг-менеджер в WinOS

Менеджер конфигов нужен для того, чтобы пользователь мог поменять поведение или внешний вид системы. В настоящей момент менеджер конфигов позволяет менять основные цвета системы, а также дает возможность регистрировать сочетания клавиш для выполнения каких-либо действий.

Дефолтный конфиг в WinOS. Расположение файла /WinOS/config.lua

 

-- /WinOS/config.lua
local computer = require("computer")
local myconfig = {
    -- Отступ 1px для /WinOS/services/topbar.lua
    paddingTop = 1,    -- отступ сверху экрана
    paddingBottom = 0, -- снизу
    paddingLeft = 0,   -- слева
    paddingRight = 0,  -- справа
    focusedWindowBorder = 0x7799bb, -- цвет рамки выбранного окна
    windowBorder = 0xddaaaa,        -- цвет рамки невыбранного окна
    
    -- имена рабочих столов
    workspaces = {"Main", "Games", "?????", "Special"},
    onstart = function()
        -- Системная библиотека сервисов
        local service = require("WinOS.core.service")
        -- Запустить сервис topbar
        service.run("topbar.lua")
        -- topbar.lua будет запущен в фоне
        -- расположение файла:
        -- /WinOS/service/topbar.lua
    end,

    onevent = function(e) -- Обработчик нажатий клавиш
        local currentWindow = WinOS.manager.focusedWindow
        local kb = require("keyboard")

        local ctrl = kb.isControlDown()
        local k_R = e[1] == "key_up" and e[4] == 19
        local k_G = e[1] == "key_up" and e[4] == 34

        -- <Ctrl + G> чтобы Вкл/Выкл виртуальную GPU
        if ctrl and k_G then
            currentWindow.gpu_enabled = not currentWindow.gpu_enabled

            -- Если gpu_enabled == false, то изображение на внутреннем холсте этого окна не будет отрисовываться.
            --
            -- Можно использовать эту настройку для уменьшения потребления ОЗУ,
            -- а также для того, чтобы другие программы работали быстрее
            WinOS.manager.updateView()
        end
        
        -- <Ctrl + R> чтобы "убить" текущую программу
        -- вместо нее будет запущен терминал
        if ctrl and k_R then
            currentWindow.kill()
            currentWindow.runTerm()
            currentWindow.gpu_enabled = true -- Включить виртуальную GPU
            WinOS.manager.updateView()
        end
    end
}

return myconfig

 





Установка тестовой версии системы

Чтобы установить WinOS v0.0.1, запустите инсталлятор с pastebin
( я скопипастил инсталлятор от ECS и поменял имена переменных :D )

pastebin run Df9a2c01

Во избежание различных ошибок связанных с проблемами совместимости, в стандартную поставку тестовой версии WinOS включена OpenOS 1.6.7

Минимальные требования при установке:
1. Любая версия OpenOS
2. 2МБ оперативной памяти
3. Интернет-карта
4. Монитор и gpu третьего уровня
5. все то, что нужно для работы с OpenOS ( питание к компу, клавиатура и пр. )
6. Новая версия мода OpenComputers

Чтобы запустить WinOS напишите в консоли

/WinOS/init.lua

Недостатки текущей версии WinOS

1. Очень сырая реализация
2. Много скрытых багов
3. Есть проблема связанная отрисовкой контента всех окон одновременно.

Так как нет возможности определения оптимального момента для перерисовки изображения на экране, отрисовка присходит в цикле 15 раз в секунду.
Из-за этого ОЗУ компьютера расходуется пилообразным образом. За секунду накапливается много мусора в виде неиспользуемых переменных(около 650кб для самого большого разрешения экрана). Однако сбощик мусора успевает все "почистить".
Если в момент пикового потребления ОЗУ запустить "тяжелую" программу, которая использует много оперативки, то сначала будет сделана сборка мусора, а только потом будет запущена программа.
Однако иногда бывают сбои: если на компе запустить отрисовщик-рандомайзер ( заполняет весь экран рандомными пикселями ), то сборщик мусора не успеет освободить ОЗУ, и произойдет краш.
Вывод: не стоит запускать отрисовщики-рандмайзеры ( особенно во весь экран ).


4. Пока не реализована возможность убрать окно с экрана, чтобы остальные окна заняли свободное пространство.
5. Пока еще не реализована возможность использования нескольких клавиатур и нескольких GPU
6. Баги! Тысячи их!
7. Из-за того, что используется виртуальная GPU ( буфер ), операция gpu.copy работает от 2 до 6 раз медленнее :(
Однако все остальные операции, наоборот, работают в 1.5-2 раза быстрее ( из-за оптимизации отрисовки через буфер изменений )


Обращение к критикам с форума
Критика приветствуется. Однако не забывайте предлагать какие-то идеи.
Воспринимайте beta-версию WinOS как экспериментальную разработку, а не как полноценную операционную систему, которую я рекомендую всем использовать. (но лично я точно буду использовать WinOS при игре на серверах)


Картиночки:



Включение и выключение GPU:

virtual_gpu.gif?raw=true





Удобство при отладке и редактировании программ. Разделил экран на области, запустил редактор кода и интерпретатор Lua -- и вот тебе IDE :lol:

handmade_ide.gif?raw=true





На всякий случай продублирую команду для скачивания инсталлятора

pastebin run Df9a2c01
Изменено пользователем Alex
  • Like 9

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кто пробовал установить? Хочу feedback!

Может я выложил нерабочий инсталлятор или ОС не запускается, и даже не узнаю об этом. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

- Не работает вставка из буфера обмена в консоль (колёсиком мыши)

- Не запускает команды

19477815.jpg
 
19477879.jpg


Прочитав пост полностью, оказалось что нужно было инициализатор OS запустить командой /WinOS/init.lua , вбив ручками и запустив, появилось окно что и на скрине ниже, только было всё чёрное, ну я немного потыкал по клаве и нажав enter, отобразился красный текст (часики в углу работают норм)

19477901.jpg

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

- Не запускает команды

 

 

19477815.jpg19477879.jpg

 

Ты ОС не запустил. Чтобы эти команды работали, нужно запускать /WinOS/init.lua сначала :)

 

 

Прочитав пост полностью, оказалось что нужно было инициализатор OS запустить командой /WinOS/init.lua , вбив ручками и запустив, появилось окно что и на скрине ниже, только было всё чёрное, ну я немного потыкал по клаве и нажав enter, отобразился красный текст (часики в углу работают норм)

 

19477901.jpg

 

Букв не видно из-за проблем совместимости версий OpenOS. Попробую пофиксить

 

 

Какая у тебя версия OpenOS?

Изменено пользователем RccHD

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

Какая у тебя версия OpenOS?
 

OpenOS 1.6.7

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×