|
|
  |
Пожелания, Предложения по развитию сюда |
|
|
DarkMaster |
28.3.2016, 20:25
|
          
Модератор UOPilot
Сообщений: 9.745
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29678
Пользователь №: 11.279

|
ок. Они тебе наравятся. Но какая связь с этим магическим числом 1048576? Массивы предполагается передавать по ссылке и глубоко пофигу количество элементов внутри. Нужно реально осознавать, что сейчас пилот парсит при этой операции каждый раз все строки, что не есть хорошо. Так же неплохо понимать, что каждый элемент массива - это стринг. Хз как в делфе, но в с++ это означает, что по факту создания строки будет сразу же зарезервировано памяти от 16 до 32 байт на каждый элемент. Я допускаю, что это может быть необходимо, более того я целиком за ускорение подобных операций и за прекомпиляцию хотя бы каких-то конструкций, но где реально использовать в рамках пилота такие массивы? Чую ты что-то интересное затеял) set size (%data 1048576 1) перед инициализацией выполни. Немного должно ускорить, особенно при большом количестве элементов. ну и после Цитата set size (%data 1048576 1) можно передать указатель в плагин и заполнить массив очень шустро. Это из тяжелой артиллерии.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
Cockney |
28.3.2016, 21:50
|
       
Master
Сообщений: 1.404
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 22549
Пользователь №: 16.156

|
Если не ошибаюсь, то получится как-то так : в с++ создаем аналог делфи-стринг, то бишь, задаем массив чаров + последний чар терминальный нуль. дальше получаем адрес всего массива, и отдаем пилоту. пилот же, читая значения, натыкается на наш адрес и обращается в никуда, ибо в его мем-менеджере нет упоминания о таком участке памяти. Чтобы такая схемка прокатила нужно, наверное, инжектить плагин, но тут я уже не очень много знаю.
|
|
|
|
DarkMaster |
28.3.2016, 22:04
|
          
Модератор UOPilot
Сообщений: 9.745
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29678
Пользователь №: 11.279

|
Цитата Если не ошибаюсь, то получится как-то так : в с++ создаем аналог делфи-стринг, то бишь, задаем массив чаров + последний чар терминальный нуль. дальше получаем адрес всего массива, и отдаем пилоту. пилот же, читая значения, натыкается на наш адрес и обращается в никуда, ибо в его мем-менеджере нет упоминания о таком участке памяти. Чтобы такая схемка прокатила нужно, наверное, инжектить плагин, но тут я уже не очень много знаю. Не-не-не. У нас же есть прекрасный: set size (%arr x y) Т.е. после этого массив уже создан и прошла аллокация. Мы же передаем в плагин уже существующий массив. Правда тут возникают вопросы о допустимой длине записываемой строки. Помнится мне, что кнайт 128 байт под элемент массива выделял при создании. По поводу всей этой проблемы можно сделать простейший тест: 1) Создаем в дллке глобальную переменную, записываем в нее некоторое значение. 2) Плагином возвращаем указатель на эту переменную. 3) Через readmem смотрим, что там по этому адресу находится. Схема прошла - значит работать будет. Тем не менее остается проблема размера элемента массива. Если мы начнем грубо изменять этот размер я не уверен, что произойдет и насколько пилот подхватит результат и не запорем ли мы какие-либо данные банально из-за области видимости переменных и высвобождения памяти после завершения функции(читай придется хранить данные в виде глобального массива структур). Однако мы можем создать некоторый массив структур аналогичный пилотовскому и передав указатель на пилотовский массив наглым образом подменить указатели. При таком варианте оно обязано заработать, однако мы получаем некотрые утечки памяти, т.к. не освободили зарезервированную пилотом память. Как лучше ее освободить в делфи и не уничтожить структуру я хз.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
DarkMaster |
29.3.2016, 21:31
|
          
Модератор UOPilot
Сообщений: 9.745
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29678
Пользователь №: 11.279

|
Цитата 128, а потом урезается до истинной длины, не? Там reserved, а потом надо типа делать resize. Про 128 могу ошибаться, но что-то помнится мне, что было именно такое изменение. Хм... По диспетчеру задач получается следующее: set size (%data 10485760) 4 байта на элемент(видимо только указатели) set size (%data 10485760 1) выделяет 20 байт set size (%data 10485760 2) выделяет 28.6 байт на строку. Хз откуда там 0.6. set size (%data 10485760 10) выделяет 61.4 байт на строку. Ребусы какие-то.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|