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

OC: Привязка разных видеокарт к разным мониторам

Вопрос

Всем привет!
Играю на своем сервере с модом OC, но возникла проблема - две видеокарты(1 и 2 уровень) и два монитора(1 и 2) "конфликтуют". В итоге при включении ПК или сервера(И то, и другое есть) инициализация проходит на одном мониторе(рандомно), а отображается все на другом. Т.е., если запускаю GPU-программы, то они могут либо ошибку вызвать(Если монитор 1 уровня) или показать(2 уровень).
Как мне сделать так, что-бы вся текстовые(1 уровня видеокарта) вводились/выводилась только через монитор 1 уровня, а вся графическая(Кнопки, там) на другой, 2 уровня?
P.S.Про component.gpu.bind("adress") знаю, но работает как-то криво.

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

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


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

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

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

 

Я не могу понять из твоих постов, что именно вызывает трудности.

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

В таком случае можно просто положить в корень диска файл autorun.lua, который будет жестко биндить нужный монитор к основной видеокарте. Адреса можно вписать вручную, используя первые четыре уникальных символа адреса, и далее автоматически получая полный адрес в программе через команду component.get("xxxx").

 

(Будет полезен этот сайт: http://ocdoc.cil.li/api:component)

 

 

 

Эвенты от мониторов (события touch/drag) и клавиатур (key_down/key_up) вообще обрабатываются вне зависимости от наличия привязанной видеокарты. Адрес компонента, который отправлил эвент, всегда идет вторым параметром в этом самом эвенте (как ты несомненно знаешь).

 

На этом принципе работает моя программа Smart Lock. Она использует всего две видеокарты - одна привязана к "консольному монитору", через который пользователь может вводить команды с клавиатуры. Вторая видеокарта в любой момент работы программы может быть привязана к любому из нескольких десятков мониторов-замков в системе.

В тот момент, когда пользователь "звонит" в дверь, программа определяет адрес монитора, с которого пришел "звонок" и биндит в нему видеокарту номер 2. Далее уже идет отрисовка графики через эту видеокарту на нужный монитор.

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

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


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

Если мониторы принадлежат разным компьютерам - можно разнести их распределителем или свитчем.

Если мониторы и карты принадлежат одному компьютеру - надо биндить.

 

Загвоздка в том, что если написать просто component.gpu.bind() - он обратится только к одной видеокарте - той, которую считает "основной".

Поэтому сначала надо получить список видеокарт компьютера - их компонентов, точнее.

local component = require('component')

-- создаем таблички для хранения адресов компонентов
local gpu = {}
local screen = {}

-- получаем список видеокарт
for address, componentType in component.list("gpu") do
  table.insert(gpu, address)
end
-- получаем список мониторов (можно и вручную составить в принципе)
for address, componentType in component.list("screen") do
  table.insert(screen, address)
end

-- биндим попарно
-- (контрольные проверки не делаются, поэтому, во избежание ошибок,
-- мониторов и карт должно быть одинаковое количество)
for number, address in pairs(gpu) do
  component.proxy(address).bind(screen[number])
end

Есть еще один путь - можно оставить в компьютере только одну видеокарту. И биндить ее к нужному монитору перед рисованием.

Но тогда надо следить за разрешением (разрешение монитора при биндинге карты изменяется на разрешение карты).

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


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

Если мониторы принадлежат разным компьютерам - можно разнести их распределителем или свитчем.

Если мониторы и карты принадлежат одному компьютеру - надо биндить.

 

Загвоздка в том, что если написать просто component.gpu.bind() - он обратится только к одной видеокарте - той, которую считает "основной".

Поэтому сначала надо получить список видеокарт компьютера - их компонентов, точнее.

local component = require('component')

-- создаем таблички для хранения адресов компонентов
local gpu = {}
local screen = {}

-- получаем список видеокарт
for address, componentType in component.list("gpu") do
  table.insert(gpu, address)
end
-- получаем список мониторов (можно и вручную составить в принципе)
for address, componentType in component.list("screen") do
  table.insert(screen, address)
end

-- биндим попарно
-- (контрольные проверки не делаются, поэтому, во избежание ошибок,
-- мониторов и карт должно быть одинаковое количество)
for number, address in pairs(gpu) do
  component.proxy(address).bind(screen[number])
end

Есть еще один путь - можно оставить в компьютере только одну видеокарту. И биндить ее к нужному монитору перед рисованием.

Но тогда надо следить за разрешением (разрешение монитора при биндинге карты изменяется на разрешение карты).

Если честно - не особо помогло. Придется садомазохизмом заниматься. Ведь мне нужно, что бы на одном мониторе программа все время работала(2 уровня), а на втором полный доступ к клавиатуре.

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


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

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

 

Я не могу понять из твоих постов, что именно вызывает трудности.

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

В таком случае можно просто положить в корень диска файл autorun.lua, который будет жестко биндить нужный монитор к основной видеокарте. Адреса можно вписать вручную, используя первые четыре уникальных символа адреса, и далее автоматически получая полный адрес в программе через команду component.get("xxxx").

 

(Будет полезен этот сайт: http://ocdoc.cil.li/api:component)

 

 

 

Эвенты от мониторов (события touch/drag) и клавиатур (key_down/key_up) вообще обрабатываются вне зависимости от наличия привязанной видеокарты. Адрес компонента, который отправлил эвент, всегда идет вторым параметром в этом самом эвенте (как ты несомненно знаешь).

 

На этом принципе работает моя программа Smart Lock. Она использует всего две видеокарты - одна привязана к "консольному монитору", через который пользователь может вводить команды с клавиатуры. Вторая видеокарта в любой момент работы программы может быть привязана к любому из нескольких десятков мониторов-замков в системе.

В тот момент, когда пользователь "звонит" в дверь, программа определяет адрес монитора, с которого пришел "звонок" и биндит в нему видеокарту номер 2. Далее уже идет отрисовка графики через эту видеокарту на нужный монитор.

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

Спасибо. А теперь пойду еще вопросы создам.(Вдруг у кого такие-же возникнут вопросы) :smile9:  :D

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


Ссылка на сообщение
Поделиться на других сайтах
В 08.05.2015 в 10:12, Totoro сказал:

Если мониторы принадлежат разным компьютерам - можно разнести их распределителем или свитчем.

Если мониторы и карты принадлежат одному компьютеру - надо биндить.

 

Загвоздка в том, что если написать просто component.gpu.bind() - он обратится только к одной видеокарте - той, которую считает "основной".

Поэтому сначала надо получить список видеокарт компьютера - их компонентов, точнее.


local component = require('component')

-- создаем таблички для хранения адресов компонентов
local gpu = {}
local screen = {}

-- получаем список видеокарт
for address, componentType in component.list("gpu") do
  table.insert(gpu, address)
end
-- получаем список мониторов (можно и вручную составить в принципе)
for address, componentType in component.list("screen") do
  table.insert(screen, address)
end

-- биндим попарно
-- (контрольные проверки не делаются, поэтому, во избежание ошибок,
-- мониторов и карт должно быть одинаковое количество)
for number, address in pairs(gpu) do
  component.proxy(address).bind(screen[number])
end

Есть еще один путь - можно оставить в компьютере только одну видеокарту. И биндить ее к нужному монитору перед рисованием.

Но тогда надо следить за разрешением (разрешение монитора при биндинге карты изменяется на разрешение карты).

А у меня такой вопрос:

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

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


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, mololkins сказал:

А у меня такой вопрос:

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
20 часов назад, eu_tomat сказал:

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
31 минуту назад, mololkins сказал:

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

Значит, я не понял вопрос. Попробуем разобраться.

Вопрос звучал так:

22 часа назад, mololkins сказал:

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

Перед этим была приведена цитата:

В 08.05.2015 в 10:12, Totoro сказал:

Если мониторы принадлежат разным компьютерам - можно разнести их распределителем или свитчем.

Если мониторы и карты принадлежат одному компьютеру - надо биндить.

...

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

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


Ссылка на сообщение
Поделиться на других сайтах
В 21.07.2022 в 10:02, eu_tomat сказал:

Значит, я не понял вопрос. Попробуем разобраться.

Вопрос звучал так:

Перед этим была приведена цитата:

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

 

Я спрашивал про то, к чему преведен код (т.е. по факту 2 абзац). Код приведён как привязать мониторы к конкретной видеокарты (если 2 монитора подключеннв к ПК с думя видеокартами), а вот как дальше обратиться к нужней видеокарте(и соответственно к нужому экрану) информация отсутсвует.

 

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, mololkins сказал:

как дальше обратиться к нужней видеокарте

local gpu1 = component.proxy '<адрес первой видеокарты>'
local gpu2 = component.proxy '<адрес второй видеокарты>'

gpu1.bind('<адрес первого монитора>')
gpu2.bind('<адрес второго монитора>')

gpu1.set(1, 1, 'Первый монитор')
gpu2.set(1, 1, 'Второй монитор')

 

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


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