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

Meh, опять эмулятор OC

ECS

329 просмотров

Еще мой дед говаривал, что каждый кодер на ОС просто обязан начать писать собственный эмуль для самоутверждения. Не желая изменять семейным ценностям, я тоже окунулся с головой в эту клоаку. Вообще в существующих эмуляторах лично меня люто бесит возня с ручной компиляцией, докачиванием всяческих либ по типу openssl, а также отсутствие возможности запуска нескольких виртуальных компиков в едином пространстве с масштабированием экранов, не говоря уже про пересылку данных между ними посредством не менее виртуальных модемов. Поэтому почесав репу, собрав JavaFX + LuaJ, накатав несколько компонентов, на данный момент я заимел следующие зачатки проекта:

 

  • Библиотеки computer, component, unicode
  • Компоненты computer, eeprom, filesystem, gpu, modem, screen, keyboard
  • Имитация системных сигналов по типу touch/drag/drop/key_down/key_up/scroll/modem_message с поддержкой pullSignal/pushSignal
  • Пересылка сетевых пакетов между имеющимися машинами в рабочем пространстве через modem.send/broadcast
  • BSOD для "unrecoverable error"
  • Звуковая система а-ля "комп в мире кубача", имитирующая звуки доступа к диску, и прикольно шумящая на фоне для антуража
  • Создание/сохранение/загрузка виртуальных машин с сериализацией данных имеющихся компонентов. Ну, всяких там адресов, разрешений видях, размеров, координат и т.п.
  • Кнопочка включения (!)

 

Разумеется, компоненты имеют далеко не все методы, их написание - дело долгосрочное. Но поскольку этот раздел называется блогом, то, кажется, никто не мешает мне писать о запланированном. В идеале хочу замутить компоненты internet, tunnel и data, позволить юзерам выбирать пути к прошивке виртуального EEPROM и содержимому жесткого диска. Также остается открытым вопрос о лимитировании памяти: я понятия не имею, как это реализовать на LuaJ и ублюдочной Яве без обожаемого sizeof(). Городить костыли в виде JavaAgent + Instrumentation.getObjectSize не хочется, но, видимо, придется. Ну, и если у кого-то имеются занятные предложения по функционалу софтины - буду рад.

 

Сырцы:

https://github.com/IgorTimofeev/OpenComputersVM

 

Скриншотик:

 

7dsXjvM.png

 

 

  • Like 6
  • Thanks 1


19 комментариев


Рекомендованные комментарии

Вот взял и нагадил мне тут Порчей - теперь точно рантаймы посыпятся

  • Like 1

Поделиться комментарием


Ссылка на комментарий

Надеюсь этот эмулятор будет менее 300 Мб. Ждем с нетерпением.

Поделиться комментарием


Ссылка на комментарий
41 минуту назад, Asior сказал:

Надеюсь этот эмулятор будет менее 300 Мб

На данный момент 3 с копейками. Запакованные в jar'ник опенось и картиночки чуть раздуют, конечно, но не до таких масштабов

Поделиться комментарием


Ссылка на комментарий

Насчет помощи, загляни в ирку попробуй пообщаться с человеком @Totoro может чем подскажет. У него есть активный опыт сборки эмулятора, который щас проходит активное допиливание и жесткие тесты.

Поделиться комментарием


Ссылка на комментарий

Офигенно выглядит! Так держать.

P.S. Не, Асиор, тут другой совсем другой кисель, по другому замешанный.

Поделиться комментарием


Ссылка на комментарий
5 минут назад, ECS сказал:

@Totoro, о, а что это вы там мутите такое? Я бы с радостью потырил фичи

 

Ну это та самая онлайновая штука, на которую тебе Механик вроде ссылку кидал. Ocelot. Где сейчас коллаборатив и коммунизм. 😃

Сорцы пока закрыты, я нигде не постил инфу, но если ты добавишься к нам в группу на GitLab, то сможешь их полистать.

 

Написано оно на Scala, с максимальным переиспользованием кода из самого OpenComputers. Поэтому там нет проблем с лимитированием ресурсов и прочим - используется либа Сангара Eris через пропатченный Сангаром JNLua. Как в самом моде.

Теоретически ты бы мог взять ядро Оцелота (проект ocelot-brain) и подключить в свой проект как библиотеку, и тогда у тебя был бы готовый эмулятор, и осталось бы только обернуть в симпатичный интерфейс. Эта штука - это по сути OpenComputers из которого выдран весь Майнкрафт и добавлен библиотечный API. Но самому конечно интереснее запилить. )

  • Like 2

Поделиться комментарием


Ссылка на комментарий
2 часа назад, Totoro сказал:

Ну это та самая онлайновая штука, на которую тебе Механик вроде ссылку кидал. Ocelot.

 

Ссылку он хоть и кидал, а про "ето Тоторина штука" не упомянул, зараза. Хороший Тотора, графон мы уважаем ❤️

 

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

Поделиться комментарием


Ссылка на комментарий
3 минуты назад, ECS сказал:

Ссылку он хоть и кидал, а про "ето Тоторина штука" не упомянул, зараза. Хороший Тотора, графон мы уважаем ❤️

 

Спасибо )
Я пока переписываю фронтенд на WebGL - будет летать. А то сейчас рендерит через канвас с большими тормозами.

А потом буду усложнять и делать как у тебя - с несколькими компами, с отдельными юзер-учетками... Ну короче наведу полный фарш.

 

5 минут назад, ECS сказал:

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

 

Даа, я тебя понимаю. )

У меня, даже с учетом того что весь критический код был по сути перекопипащен у Сангара, и это позволило мне по минимуму въезжать в что там и как работает, ушло три недели на то чтобы оно завелось в полном объеме.
Мелькала мысль, что проще забить и написать самому с нуля.

Поделиться комментарием


Ссылка на комментарий
2 минуты назад, Totoro сказал:

А потом буду усложнять и делать как у тебя - с несколькими компами, с отдельными юзер-учетками... Ну короче наведу полный фарш.

 

Звучит оч воодушевляюще. Надеюсь, там будет иметься опция "я позволяю майнить крипту через свой бровсер в обмен на дополнительный виртуальный компик" для ну ваще полнейшего фарша?

Поделиться комментарием


Ссылка на комментарий
7 минут назад, ECS сказал:

 

Звучит оч воодушевляюще. Надеюсь, там будет иметься опция "я позволяю майнить крипту через свой бровсер в обмен на дополнительный виртуальный компик" для ну ваще полнейшего фарша?

 

Почему нет?

Любой каприз за ваши деньги.

Надо только завести кошелек в криптовалюте.

Поделиться комментарием


Ссылка на комментарий

@Totoro Нашел в логах ирки запись об ошибке, которая внезапно заимелась и у меня. Стесняюсь спросить, как ты разрешил сию проблему

 

yQO6cos.png

Поделиться комментарием


Ссылка на комментарий
7 часов назад, ECS сказал:

@Totoro Нашел в логах ирки запись об ошибке, которая внезапно заимелась и у меня. Стесняюсь спросить, как ты разрешил сию проблему

 

А хрен его знает. Два года назад это было уже.

Скорее всего я неправильно указывал пути к бинарным файлам Эриса (которые dll-шки). Они должны лежать в ресурсах и эта папка должна быть отмечена как папка с ресурсами проекта. И грузить их надо как ресурс.

Ну или, если не хочется чтобы они JAR-ник утяжеляли - вытащить их в какую-то подпапку в папке проекта, указать относительный путь до туда и грузить как файл.

Для примера, в Оцелоте (и в OpenComputers) они лежат в папке ресурсов, в подпапке "assets/opencomputers/lib/". 64-битный DLL для Lua 5.3 будет тут: "assets/opencomputers/lib/lua53/native.64.dll".

А вот так я его гружу потом:

    val libraryUrl = classOf[Machine].getResource(s"/assets/${Settings.resourceDomain}/lib/$version/$libraryName")
    if (libraryUrl == null) {
      Ocelot.log.warn(s"Native library with name '$version/$libraryName' not found.")
      return
    }

Потом создается временный файл в папке с проектом, потому что DLL не будут работать нормально, если грузить их прямо изнутри JAR файла.

Туда копируется DLLшка.

После этого она грузится:

      LuaStateFactory.synchronized {
        prepareLoad(currentLib)
        try {
          create().close()
        } catch {
          case t: Throwable => Ocelot.log.trace("Something went wrong!", t)
        }
      }

Функция prepareLoad выглядит так:

  private def prepareLoad(lib: String): Unit = jnlua.NativeSupport.getInstance().setLoader(() => {
    System.load(lib)
  })

Функция create по сути вызывает конструктор стейта и передает ему значение для максимума доступной Луа памяти:

override protected def create(maxMemory: Option[Int]): LuaStateFiveThree = maxMemory.fold(new jnlua.LuaStateFiveThree())(new jnlua.LuaStateFiveThree(_))

Можно сократить до "new jnlua.LuaStateFiveThree(maxMemory)" где "maxMemory" это int.

 

Короче можно вот тут посмотреть в деталях как инициализация идет:
https://github.com/MightyPirates/OpenComputers/blob/master-MC1.12/src/main/scala/li/cil/oc/server/machine/luac/LuaStateFactory.scala

Поделиться комментарием


Ссылка на комментарий
3 часа назад, Totoro сказал:

Скорее всего я неправильно указывал пути к бинарным файлам Эриса (которые dll-шки). Они должны лежать в ресурсах и эта папка должна быть отмечена как папка с ресурсами проекта. И грузить их надо как ресурс.

 

Спасибо, однако я не настолько форумчанин, чтобы не уметь грузить ресурсы по корректным путям хд

 

Тем более до временных файлов я еще не дошел, тут либа даже по абсолютному пути не желает корректно работать: при линковке lua52/native.dylib никаких проблем не возникает - прям бери и пиши эмуль на здоровье, а с lua53/native.64.dylib консоль уже орет благим матом на unsatisfied link. Для меня это несколько... нелогично что ли. Чо делать-то? Забить и остаться на 5.2?

public static void main(String[] a) {
  NativeSupport.getInstance().setLoader(() -> {
    System.load("/Users/igor/Documents/GitHub/jnlua/src/com/company/lib/lua53/native.64.dylib");
  });

  // Что так
  new LuaStateFiveThree(8 * 1024 * 1024);  
  
  // Что эдак
  new LuaState(8 * 1024 * 1024);
}

OC2yNHS.png

Поделиться комментарием


Ссылка на комментарий

На 32 либа даже и не думает линковаться, архитекторы всякие лажают xx40ZtF.png

Поделиться комментарием


Ссылка на комментарий

С переменным успехом работа продолжается:

  • Перенес основную логику на сангаровский JNLua вместо LuaJ, добавил лимитирование оперативки
  • Переосмыслил систему виртуализации: теперь каждая машина - это отдельное окошко со своими параметрами, сохраняемыми в конфиге
  • Запилил опцию изменения пропорций виртуального экрана для screen.getAspectRatio(), а то эмуляторы обычно выдают 1, 1 по дефолту
  • Реализовал компонент tunnel, который, в общем-то,  ничем не отличается от модема. Возможно, если нервы не сдадут, в будущем добавлю систему энергозатрат - и тогда связанная карта будет жрать овердофигища ресурсов
  • Сделал выбор имени игрока, от лица которого осуществляется управление компом
  • Добавил фичу скрытия тулбара справа, чтоб ничто не отвлекало взор, так сказать

Багов, конечно, жопой жуй: не всегда корректно читаются файлы в бинарном режиме, многие фичи по типу computer.addUser() являются не более чем функциями-заглушками, а еще странно читаются экранные события при вертикальной ориентации. Ну, по крайней мере, опенось уже запускается. И гляньте, какой чудный FPS:

 

XYrtjHf.png

  • Like 7

Поделиться комментарием


Ссылка на комментарий

Софтина почти готова: если глюки и встретятся, то без особого буллшита по отношению к пользователю. Список изменений:

  • Создание машины происходит с чистой копией OpenOS и дефолтным кодом EEPROM
  • Добавлена кнопка удаления созданной машины из конфига с сохранением контента
  • Добавлен слайдер регулировки громкости звуков компов
  • Реализовано изменение путей к HDD/EEPROM (не муляж даже, ага)
  • Допилен компонент internet для загрузки всех необходимостей. Еще поддержку сокетов зафигачить - и будет конфетка

Ссылочка, если кто захочет затестить: 

https://github.com/IgorTimofeev/OpenComputersVM/releases

  • Like 2

Поделиться комментарием


Ссылка на комментарий

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

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

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

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

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

Войти

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

Войти сейчас
×