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

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

Вопрос

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

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

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


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

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

  • 0

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

 

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

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

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

 

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

 

 

 

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

 

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

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

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

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


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

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

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

 

Загвоздка в том, что если написать просто 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

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

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

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


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

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

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

 

Загвоздка в том, что если написать просто 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 уровня), а на втором полный доступ к клавиатуре.

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


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

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

 

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

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

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

 

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

 

 

 

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

 

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

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

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

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

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


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

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

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

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

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

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

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

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

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


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