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

ProgramCrafter

Пользователи
  • Публикации

    245
  • Зарегистрирован

  • Посещение

  • Победитель дней

    41

Сообщения, опубликованные пользователем ProgramCrafter


  1. 10 минут назад, red2211 сказал:

    Мы получаем то же значение что и при делении количество тепла в реакторе на теплоёмкость реактора

    Не совсем. Если в реакторе есть пластины обшивки, они увеличат максимальную теплоёмкость, и значения формул начнут расходиться.

    • Нравится 1

  2. В 24.02.2021 в 16:18, Totoro сказал:

    Выглядит как будто в какой-то момент сокет отвалился.

    Скорее всего, причина здесь проще: до библиотеки (может быть, не проверял) не доходит событие internet_ready.

     

    Проверял свой Thundernet и столкнулся с той же проблемой: программа не получает часть сообщений.

    Причём:

    1) на ocelot.fomalhaut.me всё работает хорошо;

    2) интернет во время теста работал нормально, без потерь пакетов вообще;

    3) при посылке сообщения через веб-мордочку оно доходит примерно в трети случаев.


  3. Вышла версия "0.0.1.5"!

     

    Из нового - добавлена поддержка Stem (т.е. теперь компьютеры могут подключаться через интернет).

    Для работы нужна библиотека stem, установленная в системе.

     

    P.S. Все ссылки остались прежними.

    • Нравится 1
    • Одобряю 1

  4. Судя по коду, переменные border1, ..., border4, bar и text_p глобальные.

     

    При первом вызове функции для первого прогрессбара компоненты создаются и записываются в глобальные переменные.

    При первом вызове для второго прогрессбара новые компоненты записываются поверх старых в те же переменные.

    После этого на каждом этапе обновляется только второй прогрессбар, первый остаётся на месте.

    • Одобряю 1

  5. 1 час назад, Zer0Galaxy сказал:

    Кто или что определяет, является ли компьютер корнем или нет?

    Если компьютер начал принимать входящие подключения (запустил run_server), но не подключился ни к какому другому узлу (не запускал connect/не нашёл того, к кому можно подключиться), то он автоматически становится корнем.

     

    1 час назад, Zer0Galaxy сказал:

    Можно ли объединить две сети в одну? Кто при этом станет корнем?

    Тот компьютер (корень), который вызвал метод connect, станет подчинённым. Корнем, соответственно, останется другой.

    Однако сейчас это не реализовано - сети не объединяются.

     

    1 час назад, Zer0Galaxy сказал:

    Правильно ли я понял, что корень должен знать пути абсолютно ко всем абонентам сети?

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

     

    1 час назад, Zer0Galaxy сказал:

    А что будет если корень выключить?

    Сеть разорвётся на несколько поддеревьев, внутри каждого из них доставка сообщений будет работать.

     

    1 час назад, Zer0Galaxy сказал:

    Как осуществляется связь между серверами?

    Любым удобным образом: сетевая карта, Stem или вообще звёздные врата.

    Чтобы добавить свой интерфейс, надо отредактировать файл th_interfaces.lua: добавить туда компонент, как на строках 51-54.

     

    4 часа назад, AtomicScience сказал:

    Разве такая сложная система адресации необходима?

    Придумывал я её, чтобы исключить коллизии для всех возможных вариантов. Да, можно сократить адреса, но не знаю, будет ли это иметь смысл.

     

    1 час назад, AtomicScience сказал:

    А если заменить числа произвольными строками, то можно получить что-то вроде computerCraftServer.LagodromVasi.MainComputer - вот и удобочитаемые домены, считайте, подъехали

    Можно завести какой-нибудь DNS-сервер, который будет переводить названия доменов в адреса компьютеров. Но я планирую сделать это вне рамок Thunderlib.


  6. На форуме в последнее время начали появляться темы с сетевыми библиотеками и браузерами.

    Продолжу это движение (да, скоро и мой браузер будет). Итак, представляю вам ThunderNet!

     

    Кстати, анонс уже был: вот это сообщение как раз рассказывало про пришествие ThunderNet.

    ovC2Jdp.png

     

    ThunderNet - это сеть, позволяющая объединить множество компьютеров OC, даже на разных серверах.

    По топологии это (почти) дерево, при этом корнем может быть любой компьютер. Уровней может быть любое количество.

    Компьютеры взаимодействуют по некоторому каналу: сетевая/соединённая карта/красный камень/Stem/звёздные врата и т.д.

     

    Идентификация происходит при помощи MUID (Minecraft-Unique IDentifiers): кодов, уникальных для каждого запуска на каждом компьютере OC.

    Скрытый текст

    MUID состоит из следующих элементов:

    - 14 бит - разность времени сервера и реального с точностью до 6 секунд

    - 32 бита - IP сервера

    - 4 бита - версия OpenComputers

    - 1 бит - версия Lua

    - 128 бит - адрес компьютера как компонента

    - 128 бит - адрес EEPROM

    - 128 бит - адрес загрузочного диска

    - 4 бита - вид подключения к ThunderNet

    - 7 бит - средний пинг до корневого узла ThunderNet

    - 128 бит - случайные данные

    - 128 бит - адрес временной ФС (папки /tmp)

     

    Спецификация протокола:

    1. Подключение к сети:

    — WTC <uid> (Want-To-Connect)
    
    Ближайшие компьютеры запоминают этого соседа и отвечают (или не отвечают)
    — CAC <uid> <level> (Can-Accept-Connection)
        (level - глубина дерева от корня до отвечающего компьютера);
    
    Подключаемый компьютер подтверждает соединение:
    — AC  <uid> (Accept-Connection)
    
    Отвечающий компьютер ("родитель") отправляет сообщение до корня:
    — UCA <uid> (Underlying-Connection-Accepted)
    
    Все компьютеры от корня до отвечающего запоминают, в каком направлении посылать сообщение новому.

    2. Пересылка сообщений:

    — RM  <message> <target-uid> (Retranslate-Message)
    
    Компьютер, получивший такое сообщение, должен:
    1) Если он знает путь до <target-uid>, переслать этот пакет по пути.
    2) Если он не знает путь и не является корнем, отправить этот пакет родителю.
    3) Если он не знает путь и является корнем, забыть это сообщение (потому что куда его отправить? некуда.)
    
    При получении сообщения с target-uid, равным uid текущего компьютера, библиотека вызывает событие:
    thunderlib_incoming <message>

    3. Отключение от сети:

    — DC  <disconnected-uid>
    
    Компьютеры выше по дереву забывают путь до указанного компьютера и его потомков.

     

    Моя реализация этого протокола:

    Библиотека сейчас состоит из трёх файлов: th_inform.lua, thlib.lua и th_interfaces.lua.

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

     

    Важное замечание: все методы Thunderlib являются синхронными, т.е. блокируют вызывающий поток!

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

    Документация по методам:

    thunderlib.connect([is_timeout])  - подключение к ThunderNet
    thunderlib.disconnect()           - отключение
        Отключение после использования крайне рекомендовано!
        В противном случае у компьютеров выше в иерархии может кончиться память.
    thunderlib.send(<address>,<data>) - посылка сообщения заданному компьютеру по его MUID
    thunderlib.run_server([is_timeout[, allow_connections]]) - запуск сервера ThunderNet
        Сервер нужен для приёма входящих подключений и обнаружения соседних компьютеров.
    
    thunderlib.uid()                  - возвращает MUID текущего компьютера
    thunderlib.parent_node()          - возвращает MUID родительского компьютера

     

    • Нравится 3
    • В шоке 3
    • Грусть 1

  7. 2 часа назад, Totoro сказал:

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

    Какие-то странные проблемы. Это точно не сеть, не VPN и сомнительно, что брандмауэр:

    - Ocelot Desktop (Lua 5.2) работает замечательно;

    - OCEmu (Lua 5.2) не принимает входящие сообщения, но может отправлять;

    - Minecraft 1.7.10 (Lua 5.3) работает замечательно.

     

    P.S. Я проверял всё с локального компьютера.

    • Нравится 1

  8. 22 часа назад, Bs0Dd сказал:

    Браузер делается НЕ ПОД СТАНДАРТ HTML, т.е. смотреть на нем обычный интернет не выйдет

    Я пришёл ровно к тому же, но у меня получился другой формат страниц, более похожий на Python.

    Интересно, будет ли потом битва браузеров. Представляю себе: половина страниц в одном формате, половина в другом.

     

    page:
        addr: "browser:about"
        desc: "О TigerFox"
        
        styles:
            style:
                properties: "@ 5 nil * 0x0 0xFFFF00"
                id: "styles_test"
        
        script:
            command: "client.test_style = searchID[[styles_test]]"
        
        rect:
            properties: "@ 0 0  | 60 20  * 0x333333 0xAAAAAA"
         
            text:
                properties: "@ 1 1"
                txt: "TigerFox - удобный браузер для OpenComputers."
    • Нравится 2

  9. Нашлась пара багов. Не знаю, как один из них стабильно воспроизводить, но назову.

     

    1. Менее страшный: ошибка или зависание во время выхода из эмулятора.

    2. Более страшный: некоторые сейвы отказываются грузиться. В сейве два включенных компьютера, на каждом OpenOS установлена на диск.

     

    Логи stderr (открыт сейв "NostdWorkspace", открываю "StdWorkspace"):

    Скрытый текст

    Exception in thread "Thread-10" java.io.FileNotFoundException: D:\Ocelot\NostdWorkspace\480d7bb1-2c59-4969-8a7e-7111c32a6f93\lib\core\lua_shell.lua (Системе не удается найти указанный путь)
        at java.io.RandomAccessFile.open0(Native Method)
        at java.io.RandomAccessFile.open(Unknown Source)
        at java.io.RandomAccessFile.<init>(Unknown Source)
        at totoro.ocelot.brain.entity.fs.FileInputStreamFileSystem$FileChannel.<init>(FileInputStreamFileSystem.scala:51)
        at totoro.ocelot.brain.entity.fs.FileInputStreamFileSystem.openInputChannel(FileInputStreamFileSystem.scala:48)
        at totoro.ocelot.brain.entity.fs.FileInputStreamFileSystem.openInputChannel$(FileInputStreamFileSystem.scala:48)
        at totoro.ocelot.brain.entity.fs.FileSystemAPI$ReadWriteFileSystem.openInputChannel(FileSystemAPI.scala:253)
        at totoro.ocelot.brain.entity.fs.FileSystemAPI$ReadWriteFileSystem.openInputChannel(FileSystemAPI.scala:253)
        at totoro.ocelot.brain.entity.fs.InputStreamFileSystem.$anonfun$load$2(InputStreamFileSystem.scala:65)
        at scala.collection.immutable.Vector.foreach(Vector.scala:1794)
        at totoro.ocelot.brain.entity.fs.InputStreamFileSystem.load(InputStreamFileSystem.scala:61)
        at totoro.ocelot.brain.entity.fs.InputStreamFileSystem.load$(InputStreamFileSystem.scala:58)
        at totoro.ocelot.brain.entity.fs.FileSystemAPI$ReadWriteFileSystem.totoro$ocelot$brain$entity$fs$OutputStreamFileSystem$$super$load(FileSystemAPI.scala:253)
        at totoro.ocelot.brain.entity.fs.OutputStreamFileSystem.load(OutputStreamFileSystem.scala:51)
        at totoro.ocelot.brain.entity.fs.OutputStreamFileSystem.load$(OutputStreamFileSystem.scala:50)
        at totoro.ocelot.brain.entity.fs.FileSystemAPI$ReadWriteFileSystem.totoro$ocelot$brain$entity$fs$Capacity$$super$load(FileSystemAPI.scala:253)
        at totoro.ocelot.brain.entity.fs.Capacity.load(Capacity.scala:58)
        at totoro.ocelot.brain.entity.fs.Capacity.load$(Capacity.scala:55)
        at totoro.ocelot.brain.entity.fs.FileSystemAPI$ReadWriteFileSystem.load(FileSystemAPI.scala:253)
        at totoro.ocelot.brain.entity.fs.FileSystem.load(FileSystem.scala:319)
        at totoro.ocelot.brain.entity.traits.DiskManaged.load(DiskManaged.scala:84)
        at totoro.ocelot.brain.entity.traits.DiskManaged.load$(DiskManaged.scala:75)
        at totoro.ocelot.brain.entity.HDDManaged.totoro$ocelot$brain$entity$traits$Tiered$$super$load(HDDManaged.scala:6)
        at totoro.ocelot.brain.entity.traits.Tiered.load(Tiered.scala:26)
        at totoro.ocelot.brain.entity.traits.Tiered.load$(Tiered.scala:25)
        at totoro.ocelot.brain.entity.HDDManaged.load(HDDManaged.scala:6)
        at totoro.ocelot.brain.nbt.persistence.NBTPersistence$.load(NBTPersistence.scala:68)
        at totoro.ocelot.brain.nbt.persistence.NBTPersistence$.load(NBTPersistence.scala:64)
        at totoro.ocelot.brain.entity.traits.Inventory.$anonfun$load$1(Inventory.scala:87)
        at totoro.ocelot.brain.entity.traits.Inventory.$anonfun$load$1$adapted(Inventory.scala:86)
        at totoro.ocelot.brain.nbt.ExtendedNBT$ExtendedNBTTagList.foreach(ExtendedNBT.scala:248)
        at totoro.ocelot.brain.entity.traits.Inventory.load(Inventory.scala:86)
        at totoro.ocelot.brain.entity.traits.Inventory.load$(Inventory.scala:84)
        at totoro.ocelot.brain.entity.Case.totoro$ocelot$brain$entity$traits$Entity$$super$load(Case.scala:10)
        at totoro.ocelot.brain.entity.traits.Entity.load(Entity.scala:34)
        at totoro.ocelot.brain.entity.traits.Entity.load$(Entity.scala:33)
        at totoro.ocelot.brain.entity.Case.totoro$ocelot$brain$entity$traits$Computer$$super$load(Case.scala:10)
        at totoro.ocelot.brain.entity.traits.Computer.load(Computer.scala:76)
        at totoro.ocelot.brain.entity.traits.Computer.load$(Computer.scala:75)
        at totoro.ocelot.brain.entity.Case.totoro$ocelot$brain$entity$traits$Tiered$$super$load(Case.scala:10)
        at totoro.ocelot.brain.entity.traits.Tiered.load(Tiered.scala:26)
        at totoro.ocelot.brain.entity.traits.Tiered.load$(Tiered.scala:25)
        at totoro.ocelot.brain.entity.Case.load(Case.scala:33)
        at totoro.ocelot.brain.nbt.persistence.NBTPersistence$.load(NBTPersistence.scala:68)
        at totoro.ocelot.brain.nbt.persistence.NBTPersistence$.load(NBTPersistence.scala:64)
        at totoro.ocelot.brain.workspace.Workspace.$anonfun$load$1(Workspace.scala:165)
        at totoro.ocelot.brain.workspace.Workspace.$anonfun$load$1$adapted(Workspace.scala:164)
        at totoro.ocelot.brain.nbt.ExtendedNBT$ExtendedNBTTagList.foreach(ExtendedNBT.scala:248)
        at totoro.ocelot.brain.workspace.Workspace.load(Workspace.scala:164)
        at ocelot.desktop.OcelotDesktop$.loadWorld(OcelotDesktop.scala:97)
        at ocelot.desktop.OcelotDesktop$.$anonfun$open$1(OcelotDesktop.scala:161)
        at ocelot.desktop.OcelotDesktop$.$anonfun$open$1$adapted(OcelotDesktop.scala:156)
        at ocelot.desktop.OcelotDesktop$.$anonfun$chooseDirectory$1(OcelotDesktop.scala:179)
        at java.lang.Thread.run(Unknown Source)

     

    Stdout при закрытии с ошибкой:

    Скрытый текст

    16:23:40.737 [main] INFO  ocelot.desktop.OcelotDesktop$ - Starting up Ocelot Desktop
    16:23:40.777 [main] INFO  totoro.ocelot.brain.Ocelot$ - Brain initialization...
    16:23:40.777 [main] INFO  totoro.ocelot.brain.Ocelot$ - Version: 0.6.5
    16:23:40.777 [main] INFO  totoro.ocelot.brain.Ocelot$ - Loading configuration...
    16:23:41.037 [main] INFO  totoro.ocelot.brain.Ocelot$ - Registering available machine architectures...
    16:23:42.747 [main] INFO  totoro.ocelot.brain.Ocelot$ - Found a compatible native library: 'Ocelot-0.6.5-lua52-native.64.dll'.
    16:23:42.827 [main] INFO  totoro.ocelot.brain.Ocelot$ - Found a compatible native library: 'Ocelot-0.6.5-lua53-native.64.dll'.
    16:23:42.827 [main] INFO  totoro.ocelot.brain.Ocelot$ - Registering loot (floppies and EEPROMs with standard OpenComputers software)...
    16:23:42.827 [main] INFO  totoro.ocelot.brain.Ocelot$ - Registering entity constructors (for persistence purposes)...
    16:23:42.857 [main] INFO  totoro.ocelot.brain.Ocelot$ - Initializing unicode wcwidth.
    16:23:42.867 [main] INFO  totoro.ocelot.brain.Ocelot$ - Initializing font glyph widths.
    16:23:42.897 [main] WARN  totoro.ocelot.brain.Ocelot$ - Invalid glyph char code detected in font.hex. Expected 0<= charCode <10000, got: 1D300
    16:23:42.897 [main] WARN  totoro.ocelot.brain.Ocelot$ - 87 total invalid glyph char codes detected in font.hex
    16:23:42.897 [main] INFO  totoro.ocelot.brain.Ocelot$ - glyph width ready.
    16:23:42.907 [main] INFO  totoro.ocelot.brain.Ocelot$ - Initialization finished.
    16:23:42.907 [main] INFO  ocelot.desktop.ColorScheme$ - Loading color scheme
    16:23:42.917 [main] INFO  ocelot.desktop.ColorScheme$ - Loaded 39 colors
    16:23:42.947 [main] INFO  ocelot.desktop.util.Ticker - Setting tick interval to 50.0 ms (20.0 s^-1)
    16:23:42.947 [main] INFO  ocelot.desktop.util.Ticker - Setting tick interval to 16.666666 ms (60.000004 s^-1)
    16:23:43.487 [main] INFO  ocelot.desktop.ui.UiHandler$ - Loaded window icons of sizes 256, 128, 64, 32, 16
    16:23:43.807 [main] INFO  ocelot.desktop.ui.UiHandler$ - Created window with Size2D [   800,00 x   600,00 ]
    16:23:43.807 [main] INFO  ocelot.desktop.ui.UiHandler$ - OpenGL vendor: NVIDIA Corporation
    16:23:43.807 [main] INFO  ocelot.desktop.ui.UiHandler$ - OpenGL renderer: GeForce 8800 GTX/PCIe/SSE2
    16:23:43.807 [main] INFO  ocelot.desktop.util.Spritesheet$ - Loading sprites
    16:23:43.867 [main] INFO  ocelot.desktop.util.Spritesheet$ - Loaded 108 sprites
    16:23:43.877 [main] INFO  ocelot.desktop.graphics.ShaderProgram - Loading shader program (general)
    16:23:43.907 [main] INFO  ocelot.desktop.util.Font - Loading font unscii-16
    16:23:44.067 [main] INFO  ocelot.desktop.util.Font - Packed 8942 glyphs into 1536x1536 1-bit texture (294912 bytes)
    16:23:44.097 [main] INFO  ocelot.desktop.util.Font - Loading font unscii-8
    16:23:44.117 [main] INFO  ocelot.desktop.util.Font - Packed 2005 glyphs into 1536x1536 1-bit texture (294912 bytes)
    16:23:44.217 [main] INFO  ocelot.desktop.ui.UiHandler$ - OpenAL device: OpenAL Soft
    16:23:44.227 [Thread-3] INFO  ocelot.desktop.util.Ticker - Setting tick interval to 50.0 ms (20.0 s^-1)
    16:23:44.227 [Thread-3] INFO  ocelot.desktop.util.Ticker - Setting tick interval to 50.0 ms (20.0 s^-1)
    16:25:44.109 [main] INFO  ocelot.desktop.OcelotDesktop$ - Cleaning up
    16:25:44.110 [main] DEBUG ocelot.desktop.graphics.Texture - Destroyed texture (ID: 1)
    16:25:44.110 [main] DEBUG ocelot.desktop.graphics.ShaderProgram - Destroyed shader program (general)
    16:25:44.110 [main] DEBUG ocelot.desktop.graphics.mesh.VertexArray - Destroyed VAO (ID: 1)
    16:25:44.111 [main] DEBUG ocelot.desktop.graphics.Texture - Destroyed texture (ID: 2)
    16:25:44.111 [main] DEBUG ocelot.desktop.graphics.Texture - Destroyed texture (ID: 3)
    16:25:44.111 [main] DEBUG ocelot.desktop.graphics.Texture - Destroyed texture (ID: 4)
    16:25:44.129 [main] ERROR ocelot.desktop.OcelotDesktop$ - java.io.IOException: Unable to delete file: C:\Users\***\AppData\Local\Temp\ocelot-desktop2808142413485854439\OpenAL64.dll
        at org.apache.commons.io.FileUtils.forceDelete(FileUtils.java:2400)
        at org.apache.commons.io.FileUtils.cleanDirectory(FileUtils.java:1721)
        at org.apache.commons.io.FileUtils.deleteDirectory(FileUtils.java:1617)
        at ocelot.desktop.ui.UiHandler$.terminate(UiHandler.scala:218)
        at ocelot.desktop.OcelotDesktop$.mainInner(OcelotDesktop.scala:58)
        at ocelot.desktop.OcelotDesktop$.main(OcelotDesktop.scala:65)
        at ocelot.desktop.OcelotDesktop.main(OcelotDesktop.scala)

     

    При зависании лог такой же, но заканчивается перед надписью "Cleaning up".

     

    Версия Java:

    Скрытый текст

    java version "1.8.0_241"
    Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
    Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)

     

    • Нравится 1

  10. В 03.01.2021 в 18:29, Doob сказал:

    Чтобы избавиться от древовидной структуры надо придумать, как обходить кольца при поиске пути.

    Я сделал макет хранилища, и у меня возникла такая идея: можно каждый раз перемещать предметы в ближайший к конечному сундук, который ещё не посещён. Такой алгоритм будет работать, если в середине сети нет тупиков, в которые предмет мог бы заскочить.


  11. Я думаю, можно ещё пошаманить с функцией magic и не рассчитывать максимальную и минимальную плотность камня.

    Если

    1 час назад, Doob сказал:

    2112 * (R - H) / D

    это выражение - это RANDOM_BYTE, то его можно перед взятием дробной части проверить и на попадание в диапазон [-128; 127].

    • Нравится 2

  12. В 02.01.2021 в 13:36, ZO125 сказал:

    А такое чудо от потери событий не спасет?

    Спасёт, но с двумя оговорками:

    1. События должны быть нужны только одной программе. Если доставлять события всем программам, то yield надо делать на каждую программу и на каждое событие (вдруг каждая программа обрабатывает нажатие клавиши по секунде?) Тогда и начнётся пропуск части событий.

    2. Вредоносные программы по-прежнему будут нагружать сервер и получать TLWY, а при этом могут крашиться любые компы.


  13. 9 часов назад, hohserg сказал:

    Предлагаешь сделать среду выполнения луа внутри среды выполнения луа?

    Или так, или вообще переписать OpenComputers и сделать среду выполнения Lua на Java. (Кстати, тогда не понадобится та dll, которая идёт в комплекте с модом.)

     

    1 час назад, eu_tomat сказал:

    Куда возвращать управление?

    @hohserg предлагает возвращать управление джаве, но это невозможно из-за ограничений самого Lua: coroutine.yield нельзя вызывать из кода, запущенного библиотекой debug. Возможно, в этом есть и своя логика: во время выполнения той функции checkDeadline управление принадлежит не пользовательскому коду, и yield может прервать не тот поток.


  14. 6 часов назад, hohserg сказал:

    Как это может помочь с TLWY?

    Идея состоит вот в чём: код запускаемой программы компилируется стандартной функцией load, а выполняется уже системой (то есть система выполняет роль виртуальной машины Lua). После интерпретирования каждой K-ой команды байткода система уступает управление с помощью coroutine.yield. Таким образом, прерывания будут происходить независимо от кода программы и достаточно часто, чтобы не вылетать в нормальных условиях.

     

    Бонус - можно заново написать библиотеку debug, чтобы отлаживать пользовательские программы.

     

    Хотя сразу возникает проблема с подачей событий: они начнут или пропускаться, или активно копиться в буфере. Если несколько игроков будут активно тормошить компьютер, он может вылететь с нехваткой памяти.


  15. Disclaimer:

    1. Ниже в этой теме может встречаться код, который может нанести ущерб вашему серверу. Эти образцы предоставлены лишь в ознакомительных целях! Я не несу ответственности за положенные ими сервера Майнкрафта.

    2. Я не залазил глубоко в исходники OpenComputers, поэтому могу где-то ошибаться.

     

    Одна из часто встречающихся проблем в OpenComputers - превышение таймаута выполнения программы. При этом выбрасывается ошибка TLWY (too long without yielding).

    При лагах сервера эта ошибка может возникать совершенно случайным образом, иногда даже в консоли OpenOS. Иногда компьютер может вообще выключиться с синим экраном.

     

    Чтобы создать стабильную систему, проблему TLWY надо решить. У меня были такие идеи:

    1. Обёртки из pcall. Это будет некрасиво выглядеть и понизит максимальную глубину рекурсии.

    2. Принудительная вставка yield в код. Проблемы такого подхода - потеря множества событий и необходимость парсинга кода.

    3. Принудительное прерывание кода по обращениям к глобальным переменным. Проблема - невозможность отследить вызов анонимной функции.

        Например, так не прервать код (function(f) return f(f) end)(function(f) return f(f) end).

    4. Интерпретировать байткод Lua. Самое доступное решение, но надо знать формат байткода и обновлять с выходом каждой версии Lua.

    5. Переписать виртуальную машину Lua так, чтобы она сама уступала управление другим потокам (тогда ошибка TLWY уйдёт в прошлое). Для этого надо договориться с разработчиками OpenComputers и уметь программировать на Java.

     

    Есть ли какие-то варианты избежания TLWY, которые я упустил?

    • В шоке 1

  16. В 27.04.2020 в 23:03, Totoro сказал:

    Рендер новый уже есть

    Новый рендер действительно похож на Minecraft. Единственное, что мне не нравится - это неограниченное потребление памяти браузером - достаточно запустить такой код, и реальный компьютер станет лагать:

    while true do
      for i = 1, 50 do
        print(string.char(math.random(56, 126)))
      end
      os.sleep(0)
    end

     


  17. @hohserg Закинул: https://pastebin.com/raw/qdYmD7Bw

    Только что перепроверил, вроде все тесты работают. Единственная странность - что Юникод рендерится дольше, чем простой ASCII, хотя вызовов к gpu.set остаётся столько же. Возможно, быстрее исчерпывается бюджет вызовов, но это сомнительно.

    • Нравится 1
    • Спасибо 1

  18. В 26.08.2020 в 21:55, Totoro сказал:

    Скажи какие там по дефолту input на сторонах и какие лимиты по output.

    Только что проверил в майне. Стандартные значения входов (если редстоун не подключен / не запитан) равны 0.

     

    Лимиты по output - от -2 147 483 648 до 2 147 483 647. При превышении лимита значение приводится к этим порогам (ошибок нет).

    При этом для красной пыли реальное значение напряжённости (в мире, а не для компьютера) приводится к диапазону от 0 до 15.

    • Нравится 2
×
×
  • Создать...