Перейти к содержимому
RccHD

Разработка новой операционной системы. WinOS.

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

Переменная весит сколько весит ссылка в ОS.

А вот объект на который ссылается переменная весит в зависимости от типа.

Как ты понимаешь ссылка это не объект на стеке и она ссылается на объект в твоей мапе который ты и так хранишь.

nil помогает в том случае если у тебя переменная находится в скопе из которого ты часами не выходишь.

 

Для справки: каждая переменная-указатель на таблицу или функцию в Lua весит в равной мере 9 байт.

 

А теперь немного сухих расчетов: представим простейшую трехмерную сцену из восьми кубиков. Каждый куб имеет 8 вершин, каждая вершина - это трехмерная таблица-вектор с числовой индексацией, в сумме кушающая 40 (table) + 8 (double) * 3 = 64 байта. Все вершины заносятся в массив вершин сцены для минимизации расхода памяти. Также каждый куб имеет таблицу-линковщик, содержащую индексы вершин, образующие треугольники для отрисовки куба в количестве 12 штук. Каждый треугольник с ссылками на три вершины - это такой же трехмерный вектор, кушающий все так же 64 байта. Итого получаем 64 * 8 = 512 байт на вершины и 64 * 12 = 768 байт на линковку вершин, итого 1280 байт на куб. Сколько у нас там их? Восемь? Итого трехмерная сцена выжрет 1280 * 8 = 10240 байт = 10 КБайт. Это тот минимум, который необходим для старта отрисовки графики, материалы и текстуры для простоты рассматривать не будем. Если же использовать локальные переменные-сокращалки, то расход памяти взлетит по экспоненте.

 

Чтобы пруфануть это более наглядно, привожу выдержку из кода движка, содержащую основной цикл, отвечающий за получение соответствующих вершин через треугольники:

for triangleIndex = 1, #OCGL.triangles do
	vertex1[1], vertex1[2], vertex1[3] = renderer.viewport.xCenter + OCGL.vertices[OCGL.triangles[triangleIndex][1]][1], renderer.viewport.yCenter - OCGL.vertices[OCGL.triangles[triangleIndex][1]][2], OCGL.vertices[OCGL.triangles[triangleIndex][1]][3]
	vertex2[1], vertex2[2], vertex2[3] = renderer.viewport.xCenter + OCGL.vertices[OCGL.triangles[triangleIndex][2]][1], renderer.viewport.yCenter - OCGL.vertices[OCGL.triangles[triangleIndex][2]][2], OCGL.vertices[OCGL.triangles[triangleIndex][2]][3]
	vertex3[1], vertex3[2], vertex3[3] = renderer.viewport.xCenter + OCGL.vertices[OCGL.triangles[triangleIndex][3]][1], renderer.viewport.yCenter - OCGL.vertices[OCGL.triangles[triangleIndex][3]][2], OCGL.vertices[OCGL.triangles[triangleIndex][3]][3]
	material = OCGL.triangles[triangleIndex][4]

...

Также привожу скриншот с результирующим FPS в 7 единиц и расходом оперативной памяти в 46% от максимального запаса (4 Мб)

 

IXkJ4qZ.png?1

 

 

А теперь намутим-ка локальных сокращений для минимизации нагрузки на ЦП:

local ti, ve1, ve2, ve3
for triangleIndex = 1, #OCGL.triangles do
	
	ti = OCGL.triangles[triangleIndex]
	ve1, ve2, ve3 = OCGL.vertices[ti[1]], OCGL.vertices[ti[2]], OCGL.vertices[ti[3]]

	vertex1[1], vertex1[2], vertex1[3] = renderer.viewport.xCenter + ve1[1], renderer.viewport.yCenter - ve1[2], ve1[3]
	vertex2[1], vertex2[2], vertex2[3] = renderer.viewport.xCenter + ve2[1], renderer.viewport.yCenter - ve2[2], ve2[3]
	vertex3[1], vertex3[2], vertex3[3] = renderer.viewport.xCenter + ve3[1], renderer.viewport.yCenter - ve3[2], ve3[3]
	material = OCGL.triangles[triangleIndex][4]

...

Результат плачевный. Не замечено ни прироста, ни убыли значений FPS, однако расход памяти возрос до 61%. Магия? Нет, особенности конкретного ЯП и его интеграции в виде мода.

 

tq3OUxU.png?1

  • Нравится 1
  • В шоке 1

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


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

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

  • Нравится 2

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


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

Во, первых это ты сам решил что "все программы придется адаптировать", я такого не писал Я постараюсь написать такую ОС, на которой можно будет запустить большинство программ без доработки

Словом «все», взятым в кавычки, я надеялся выразить свою иронию. Но твоя новая формулировка меня устраивает: большинство программ – это не все программы, тем более с таким выделением жирным шрифтом:

Важно: все OpenOS-программы можно будет запустить на моей OC

Многозадачность можно реализовать двумя путями:

 

1) Подменить load своей функцией, автоматически расставляющей по всему коду вызовы yielding. Недостатки этого способа в том, что он провоцирует повышенное потребление памяти и процессорного времени, и годится не для любого кода. Достоинство в том, что потенциально он может спасти систему от падения в TLWY из-за одного кривого приложения.

 

2) Подменить буквально все методы всех компонент, которые неявно выполняют уступку времени. Начать, конечно, следует с computer.pullsignal, но этого недостаточно. Например, есть программы, которые не выполняют sleep/listen, а длительно работать без TLWY им позволяют обращения к периферии. Если ты готов подменить методы всех компонент, добавляя в каждый из них вызов yielding – пожимаю руку. Еще надо не забыть, что периферия может динамически подключаться и отключаться от компьютера, и таблицы методов нужно будет подменять на лету.

 

Предполагаю, что ты выбрал второй способ, удовлетворившись подменой pullsignal, да gpu

 

Приведи пример такой коллизии. Я пока не придумал ни одного

Например, есть два редстоун-адаптера и два приложения, работающих с ними. Как ты планируешь обеспечить каждому из приложений доступ к нужному адаптеру, изолировав от другого?
  • Нравится 1

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


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

Многозадачность можно реализовать двумя путями:

 

Есть третий принципиально отличающийся вариант: обработка нескольких приложений-окон в общем потоке-контейнере. Из плюсов тут стоит выделить максимальное быстродействие, т.к. выполнение скрипта не будет искусственно замедлено множественными yield() в подмененных функциях, а также простоту написания такого концепта. Из минусов - поддерживать многозадачность будет лишь то ПО, которое написано под данную ОС, все остальное будет работать в штатном режиме. А также имеет место быть стабильный краш главного потока при краше любого из приложений - проблема решается изоляцией пространства приложения от контейнера и кешированием его состояния.

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


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

 

 

Есть третий принципиально отличающийся вариант: обработка нескольких приложений-окон в общем потоке-контейнере

Есть пример рабочей реализации? Чтобы две-три программы работали, рисовали графику. Я бы посмотрел исходники  :D  

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


Ссылка на сообщение
Поделиться на других сайтах
Есть пример рабочей реализации? Чтобы две-три программы работали, рисовали графику. Я бы посмотрел исходники

 

А то. Как раз даже гифочка припасена на всякий пожарный. Вся ОСька по сути - это один жирный контейнер, а палитра и магазин приложений - вложенные контейнеры, стилизованные под окна. Сырец либы тут, дока тут

 

hTFGCqj.gif

Изменено пользователем ECS
  • Нравится 4

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


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

 

 

есть программы, которые не выполняют sleep/listen, а длительно работать без TLWY им позволяют обращения к периф

Это что за программы? Есть пример? Я привык, что всегда нужно pullSignal писать в программе, чтобы она работала 

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


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

Это что за программы? Есть пример? Я привык, что всегда нужно pullSignal писать в программе, чтобы она работала 

local redstone = require("component").redstone
while true do
  redstone.setOutput(1, math.random(15))
end 

Что примечательно, эту софтину возможно завершить только путем отсоединения редстоун-компонента. Как верно подметил eu_tomat, каждое обращение к нему ведет себя аналогично .pullSignal(), однако не вызывает его

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


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

Вот еще интересный, красочный пример. Запустил две змейки на одном компе:

 

vokoscreen-2017-09-02_06-15-30.gif

 

Проблема только в том, что обе змейки реагируют на нажатия клавиш, но эта проблема легко решаемая :)

 

P.S. Программу "змейка" я скачал с форума и запустил в своей ОС без каких-либо доработок

Кто-то ещё помнит про мои змейки

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


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

Кто-то ещё помнит про мои змейки

Эти змейки почти идеально подходят для тестирования моего оконного менеджера.

Так как в них использованы самые разные функции (gpu, term, event)

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


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

Реализовал часть функций оконного менеджера. Реализовал переключение окон
vokoscreen-2017-09-03_14-28-08.gif

Изменено пользователем RccHD
  • Нравится 3

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


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

Реализовал часть функций оконного менеджера. Реализовал переключение окон

vokoscreen-2017-09-03_14-28-08.gif

О боже, я ждал это джва года.

Удачи с разработкой! Надеюсь не забросишь проект.

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


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

Как определить "графическую" ширину пикселя? Например "х" имеет ширину 1, а какой-нибудь иероглиф -- ширину 2

 

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


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

я ждал это джва года.

А я взял и сделал за 3 дня :P

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


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

@@RccHD, делай конфиг на Lua и переключение кнопками. 

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


Ссылка на сообщение
Поделиться на других сайтах
@@RccHD, делай конфиг на Lua и переключение кнопками.

Да!!! Ты написал именно то, чем я сейчас занимаюсь. Будет офигенный кастомизируемый оконный менеджер. Можно будет свои сочетания клавиш регистрировать

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


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

Решил еще добавить возможность ставить приложения на паузу(coroutine позволяют и такое делать)

Кроме того, что любую программу можно поставить на паузу, можно будет еще 'выключать графику' этой программы

 

Пример использования: запустил 4 программы сразу и комп начал лагать. Взял и вырубил всем 4 программам графику, при этом все неграфические процессы продолжат работу. И все ок, комп перестанет лагать. Так как именно операции с графикой обычно тормозят систему

  • Нравится 3

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


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

Вот это мне нравится. Человек задумал - человек запилил. =)
А то наплодят 100500 тем, а толку - нуль. Ни одного завалящего скриншотика.

  • Нравится 1

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


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

Вот это мне нравится. Человек задумал - человек запилил. =)

А то наплодят 100500 тем, а толку - нуль. Ни одного завалящего скриншотика.

Просто пока у меня есть этот энтузиазм я могу запилить что угодно хоть за пару дней. Постараюсь побыстрее закончить ОС пока не пропал настрой

  • Нравится 2

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


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

Решил еще добавить возможность ставить приложения на паузу(coroutine позволяют и такое делать)

Кроме того, что любую программу можно поставить на паузу, можно будет еще 'выключать графику' этой программы

 

Пример использования: запустил 4 программы сразу и комп начал лагать. Взял и вырубил всем 4 программам графику, при этом все неграфические процессы продолжат работу. И все ок, комп перестанет лагать. Так как именно операции с графикой обычно тормозят систему

Какие могут быть подводные камни?

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


Ссылка на сообщение
Поделиться на других сайтах
Гость
Эта тема закрыта для публикации сообщений.

×
×
  • Создать...