1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Тонкости работы со шрифтами в играх

Тема в разделе "Мастерская", создана пользователем Рыжий Тигра, 24 июн 2014.

  1. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Маленькие хитрости, или Домашнему мастеру на заметку. :-)

    Трюк номер раз - очевидно, поиск шрифтов. Тут поможет GBS - он не только редактор, он ещё и изюмительная шрифтоискалка. На пару, разумеется, с глазами и головой. :-)

    ---------- Сообщение добавлено в 01:48 ---------- Предыдущее сообщение размещено в 01:47 ----------

    Следующая полезная фишка - как добавить в шрифт свои (ну, т.е. обычно русские :-) ) буквы и при этом не сильно раздуть сам шрифт.

    ---------- Сообщение добавлено в 01:56 ---------- Предыдущее сообщение размещено в 01:48 ----------

    Что делать, если шрифт явно нуждается в кернинге - например, слово набрано только прописными буквами и межбуквенные интервалы откровенно "отплясывают".
    Если в шрифте есть свободные буквы - можно сделать "плакат", летмишоую :-) - это просто:

    [​IMG]

    Теперь выведем этим шрифтом строку из шестнадцатиричных кодов:
    Код:
    B1 B5 B6 B7 BC BD BE A6 A7 A9 AC
    [​IMG]

    ---------- Сообщение добавлено в 02:04 ---------- Предыдущее сообщение размещено в 01:56 ----------

    Полезный побочный эффект "плаката" - можно обойтись строкой меньшей длины: слово "КАТАПУЛЬТИРОВАНИЕ" весит 17 байт (18 с завершающим нулевым), а "плакат" занял всего 11 (с нулевым - 12). Правда, за это пришлось заплатить четырьмя с гаком килобайтами в шрифте; но если места под шрифт завались, а под строку отведена всего дюжина байт, то вполне оправдано. (А если в оригинале было "[ EJECTING ]", то ещё и один байт сэкономился. :-) )
    Правда, такой трюк проходит только с пропорциональными шрифтами. А если бы шрифт был строго моноширинным, то фиг бы мы что выиграли. Конечно, тоже можно извратиться и сделать буковки для "плаката" чуточку поуже, но ИМХО предел выигрыша - всего более-менее десяток процентов, а не в полтора раза, как в нашем случае.
     
    Последнее редактирование: 24 июн 2014
    Geryon, Skud, compart и 4 другим нравится это.
  2.  
  3. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    это называется "токен" и использовалось ещё в ZX-Spectrum, где все операторы Бейсика хранились в ОЗУ не как слова, а как один единственный байт...
     
  4. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Следующий трюк - на этот раз к уменьшению размера шрифта. Если шрифт заточен под многоязычие, мала-мала структурирован как отдельно глифы и отдельно массив указателей/смещений к ним и предполагается, что в не переведенных кусках какие-то буквы используются и притом достаточно редко, то для радикального уменьшения занятого шрифтом места вовсе не обязательно эти крокозябры удалять/зачищать: можно просто слегка их изгадить, заменив на другие, похожие, но более нужные буквы. Эффект потрясающий: шрифты стремительно "сдуваются" едва ли не до размеров первоначальных некириллизованных.
    Ну, а потом-потом-потом, когда все-все строки в игре будут переведены, - конечно, можно эти "псевдобуквы" и выбросить. А можно и не: места не едят совершенно, процессорного времени тоже не потребляют... :-)

    ---------- Сообщение добавлено в 12:01 ---------- Предыдущее сообщение размещено в 11:30 ----------

    Bato-San, Offtop
    Увы, в знакогенераторе basic'а не было "плакатов"-слов, соответствующих этим байт-кодам. А у меня есть! :-)
    Что ты, гораздо раньше.
     
    Последнее редактирование: 24 июн 2014
  5. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    И ещё о плакатах. Серьёзный недостаток метода - жрёт коды символов со страшной силой. А в шрифте свободных позиций ну аж пара десятков - два-три плаката их быстро выедят в ноль.
    К счастью, далеко не всегда нужно делать всё слово плакатом: вполне хватит зашить в шрифт только несколько букв, чтобы строка вписалась в длину и/или чтобы откернить одно-два места в строке. Летмишоую :-) и такой вариант.

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

    [​IMG]

    Занимаем в шрифте 5 символов:

    [​IMG]

    и этим шрифтом выводим строку:
    Код:
    { К, 0xB1, 0xB5, 'П', 0xA9, 'У', 'Л', 0xA9, 0xB6, 0xB7, 'И', 0xA9, 'Р', 0xA9, 'О', 0xA9, 'В', 'А', 'Н', 0xA9, 'И', 0xA9, 'Е' };
    (символ с кодом 0xA9 - пустое место шириной в один пиксел, на табличке видно хреновато).
    Итого израсходовано где-то полтора килобайта (максимальный размер знакоместа ЕМНИП 17*23) на 5 символов шрифта (из которых как минимум 0xA9 можно использовать ещё во многих строках-плакатах) и 23 байта (с финальным нулём - 24) в строке (против 18 под просто слово без плакатных выпендрёжей). Но каков эффект! :-)
     

    Вложения:

    • wide-font.png
      wide-font.png
      Размер файла:
      5,6 КБ
      Просмотров:
      1.066
    • wide-eject.png
      wide-eject.png
      Размер файла:
      720 байт
      Просмотров:
      1.036
    Последнее редактирование: 25 июн 2014
  6. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Ещё примеры использования "плакатного" шрифта:Народ, берите на вооружение! И делитесь собственными разработками/придумками, мне ж тоже интересно! :-)
     
    Последнее редактирование: 16 дек 2014
  7. Scorp Никто и звать меня никак

    Scorp

    Регистрация:
    21 апр 2005
    Сообщения:
    2.955
    Раз уж ты в токены превращаешь - тогда берешь делаешь спецсимвол, который при обнаружении вызывает процедуру пользователя. И пофиг вообще становится на длину - не лезет, ставишь спецсимвол и вызываешь свой код, который например меняет адрес расположения текста. Токенизация тут мало оправдана - она оправдана, когда у тебя здоровый текст и ты можешь его сам затокенизировать как надо на основе наиболее употребляемых буквосочетаний.

    Сейчас-то вроде любой exe можно растянуть и воткнуть ресурсов, куда и пихнуть свой код. Это тебе не спектрум, где вот 48 килобайт и без вариантов, просто некуда воткнуть - вот там да, извращались знатно ради перевода.
     
    AlexDC, Рыжий Тигра и Bato-San нравится это.
  8. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Насчёт растянуть - не понял, но покопаю.
    Я не растягиваю, а добавляю в отдельную .dll'ку - мне изначально повезло, что игра использует опен-сорсную .dll. При весе .exe'шника в 770 кил я уже таким манером натолкал кил с 200 своего кода.
    О! Логично. Функцию вывода буквы в картинку мы уже нашли, впихну туда вызов своей функции дообработки, пусть будет задел.
    Разно бывает. Например, вот эти надписи в игре в процессе подготовки к выводу проходят пересборку - обсчитываются функцией в десяток страниц дизассемблера, а она берёт всего 14 байт за раз и долго их мотузит- мне было влом разбираться, решил что через токены будет проще.
     
  9. Scorp Никто и звать меня никак

    Scorp

    Регистрация:
    21 апр 2005
    Сообщения:
    2.955
    Ну можно добавить секцию в exe файл, можно поменять размер у секции в exe-файле. Раз у тебя dll грузит, то тем более проще.

    А какая разница кто там пересборку проходит - ты ж внедрил один спецсимвол и перекинул пойнтер текста на нужное тебе место, он оттуда и взял данные. Короче по-моему ты перезаморочился чересчур.
     
    Последнее редактирование: 14 янв 2015
    Рыжий Тигра нравится это.
  10. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Не, там заковыристо. Выравнивание при выводе строк, согласование названий пушек/ракет (их два комплекта - при выборе машины/обвески и в бою в кабине) и их ТТХ, ещё какая-то фигня в таком духе - это всё надо сначала разыскать в коде, потом разобраться с дизассемблером и восстановить логику, а потом подописывать кучку маленьких кусочков с вызовом обработчиков нескольких десятков esc-символов - а это ещё и сажает скорострельность... Трахоёмкость - на глаз пару недель. А с токенами - всё программирование доработок заняло пару часов всего.
    Ха, тут у меня тоже фишка: .exe'файл совершенно не трогается, т.е. можно использовать любой из четырёх имеющихся плюс любые их сторонние доработки (а одних только исправлений ошибок по миру уже ходит десятками). Все затычки, обращения к дополнительному коду и т.д. у меня дописываются уже в загруженную в ОЗУ программу. Пришлось этому хак-движку даже придумать отдельный язык программирования. :-)
     
  11. Scorp Никто и звать меня никак

    Scorp

    Регистрация:
    21 апр 2005
    Сообщения:
    2.955
    Либо ты не понимаешь, либо я не понимаю. Я говорю, что можно внедрить такой токен (спецсимвол), который вместо подстановки собственно токена вызывал бы процедуру пользователя с параметром, и ты бы этой процедурой смещал адрес текущей буквы (я хз где он там хранится у них, ну в каком-то регистре наверное) на нужное место, где и лежит твоя КАТАПУЛЬТИРОВАНИЕ в открытом виде. Просто в процедуре чтения строки из памяти делаешь вызов твоей процедуры, если там спецсимвол - меняем адрес местанахождения текста (ну хз, наприм 0xFF (спецсимвол) и потом 1 байт пусть будет номер слова в твоей табличке новых слов, на выходе ты в нужном регистре задаешь этот адрес в регистре, который указывает на текущий символ и вуаля - программа начинает печатать как раз из того места). Раз уж ты все равно в процедуру печати внедрился, я не вижу где там может быть затык. Ну в целом-то пофиг, я просто концепцию пояснить.

    Я вообще за "чем быстрее - тем лучше". Времени и так нету, так что вместо придумывания своих dll'ок и прочего - я бы просто увеличил exe и наставил заплаток. Всё быстрее, чем какие-то обработчики писать. Но у тебя видимо это проект века :) Не ищешь быстрых путей.
     
    Последнее редактирование: 14 янв 2015
    Рыжий Тигра нравится это.
  12. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Scorpion ZS 256, Ну тебе ж написали, что DLL уже есть, и исходники к ней есть, к ней легко дописать свой код для обработки патчей, внедренных в основной exe. Что сложного-то? Вставлять заплатки в существующий exe разве проще, чем пропатчить несколько байтов для передачи управления на функцию из уже находящейся в адресном пространстве DLL?
    А идея заменить вкомпиленные в exe строки на волшебные байты, вызывающие нашу функцию вывода произвольной строки по заданному идентификатору - хорошая, хотя неясно, стоит ли на такой подход уже переходить на данной стадии.
     
    Последнее редактирование: 14 янв 2015
    Рыжий Тигра нравится это.
  13. Scorp Никто и звать меня никак

    Scorp

    Регистрация:
    21 апр 2005
    Сообщения:
    2.955
    Не понял, тема разве называется "Wing Commander"? Тут не про вашу конкретную локализацию говорят. Вам-то всяко смысла нет метаться сейчас, раз есть и длл, и исходники. Тигор вон хотел, чтобы поделились идеями - вот я и поделился. Имея пропорциональный шрифт, при начале работ в подобной ситуации я бы поступил как я выше написал. Всяко удобнее, чем вырисовывать символы в шрифте, подгоняя их под байты. А патчи с вызовом на длл-ку от патчей с вызовом на кусок кода в экзешнике - вообще ничем принципиально не отличаются.
     
    Последнее редактирование: 14 янв 2015
    Рыжий Тигра и Bato-San нравится это.
  14. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Не, тут тоже в лоб не лечится: надо не строку вставлять, а картинку - из-за кернинга в "АТ", "ТА" и "ЬТ". А на тот момент у меня ещё не было адреса букворисовательной функции, я её нашёл намного позже.
    Тоже бывает геморройно. Знаешь сколько намучился сочиняя функции перехвата, пока не наткнулся на модификатор "голая" (__naked)? :-)
    Переходить - не переходить, но в запаснике пригодится. Тем более что esc-символ - тоже токен, только несколькибайтный; с ним можно проделывать те же фишки, что и с обычным символом - брать ширину, рисовать шрифтом по картинке, даже гнать на DrawText() и даже подсовывать touperr()'у с tolower()'ом.
    Но любую из них придётся модифицировать. :-(
    Тут кому как. Буковки я не столько вырисовывал, сколько резал-клеил mspaint'ом, аж по паре минут на каждую. И потом, есть ещё размер .exe'шника: каждый килобайт кода - десяток страниц дизассембла, и если полтыщи страниц ещё можно прочитать залпом, то навскидку выяснить какие из 700 с гаком кил C++'ного кода (то бишь полутора десятков мег дизассембла) будут вставлять свои три алтына в дообработку строки перед выводом - практически никак, тут надо неделями не вылазить из отладчика. У меня на такой подвиг не хватает улёжчивости. :-(
    На кусок своего кода - да. Но чем больше по дороге будет кода чужого - тем кислее.

    ---------- Сообщение добавлено в 20:39 ---------- Предыдущее сообщение размещено в 20:38 ----------

    Ещё дарю полезную фишку по шрифтам - скоростной автоматический поиск программы рисования буквы заданным шрифтом.

    Летмишоую. :-)
    В ранее приведенной структуре заголовка шрифта есть уязвимость - массив смещений к глифам wc4_font_t::offsets[]. Дальше просто:
    • выбираем подходящую строку - так чтобы до её вывода не сильно далеко топать по игре;
    • в строку впихиваем нигде не используемый символ - удобно использовать '@';
    • поганим заголовок шрифта - в offsets[ '@' ] взводим старший бит;
    • запускаем игру под отладчиком;
    • топаем до вывода подправленной строки.
    Трибле-трабле-бумс! Функция вывода символа (а может быть, определения его ширины - тут как повезёт) с грохотом вываливается по C0000005 в момент доступа к полю структуры глифа выше границы двух гигабайт. Готово! Тело функции у нас под отладчиком, можно делать с ним что хочешь. :-)
     
    Последнее редактирование: 14 янв 2015
  15. Scorp Никто и звать меня никак

    Scorp

    Регистрация:
    21 апр 2005
    Сообщения:
    2.955
    Дебаггер разве не умеет делать точку останова по чтению из памяти? Я помню когда я в последний раз копался в виндах (а это было по-моему где-то в середине нулевых) soft-ice точно такое умел. Ты изобрел велосипед? Или оно конкретно у тебя почему-то не заработало и ты решил так делать всегда? :) А вдруг там проверка стоит, чтобы не прыгать выше головы? И не выпадет тогда ничего, локти чтоли кусать?

    Откуда там возьмется чужой код? Будет у тебя скажем расширенный ну на мегабайт пусть экзешник (т.е. у тебя метр для запихивания своего кода), и я не знаю, где у тебя компилится, предположим Си (которого я не знаю), где будет типа .org 0xFFFFFFF (тут адрес того самого места в метр) и там программа, ну и еще там будут типа .org 0X33412452 jmp 0xFFFFFF для патчей, заассемблировал - получил файл. Один файл для компиляции, ну максимум два. Зачем все переусложнять каким-то псевдоязыком с патчингом на лету ради какого-то перевода. У тебя подход как к стройке века, ну мож это и оправдано, но охренеть как долго - новички в этом деле типа меня забьют просто.

    Если у тебя недели дизассемблера - ты что-то не так делаешь. Я лично не разбираюсь в ассемблерах, и вообще мало что умею, но уж нарыть, где печатается символ и как его переписать - для этого вообще знать ничего не надо, достаточно здравый смысл включить :) А когда у тебя вылезет обработки чтения текста - уж тут можно и IDA включить и разобраться более детально, если будет необходимость. Или тупо протрейсить, смотря на экран (я поскольку асма не знаю, то так и делаю).

    Кернинг - это всего лишь ширина буквы (или отступ, не знаю как у них сделано), поставил на 1 меньше - вот тебе и кернинг.

    Короче ладно, я вроде всё сказал что хотел. Каждому своё.
     
    Последнее редактирование: 15 янв 2015
  16. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    Scorpion ZS 256, там читается из файла текст. Поэтому поставить бряк на память при запуске программы невозможно для таких кусков, пока они не прочитаны, а прочитаны они будут когда ты до них доиграешь только. И, да - ему повезло, что программа не обрабатывает сама свои ошибки. Совпадение двух факторов приводит к валидному методу, который может и не сработать в других случаях.

    Ну и перестройка всех секций PE/NE - то ещё развлечение даже при наличии должного инструмента и полном понимании документации. А присобачивание секции патчера и её запуск до основной вообще может не нравиться антивирусу.
     
  17. Scorp Никто и звать меня никак

    Scorp

    Регистрация:
    21 апр 2005
    Сообщения:
    2.955
    Ну, доиграл, зашел в отладчик, нашел поиском куда текст загрузился по текст надписи, поставил бряк на доступ к памяти, вывел надпись - вывалился в отладчик на чтении. Что не так? Зачем обязательно с начала программу-то отлаживать.

    Резвлечение - да вроде ничего такого сложного.
     
    Последнее редактирование: 15 янв 2015
  18. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    да так - сущая мелочь... всего то текста к тому моменту в том месте может уже не быть, что делает его поиск бессмысленным. Или он может каждый раз грузиться в другое место. Или текст закодирован и расшифровывается прямо в процессе печати. Вариантов много.
     
  19. Scorp Никто и звать меня никак

    Scorp

    Регистрация:
    21 апр 2005
    Сообщения:
    2.955
    Каждый раз грузит в другое место? Ты такое правда видел? По-моему в одних и тех же условиях грузит всегда в одно и то же место. Но мало ли какие странности бывают, конечно, но я думаю, что редко когда такое бывает. Что может и не быть - правда, но вероятность как бы невысока (это ж не 90е с крошечной памятью). И про закодирован - ну как бы если ты можешь что-то найти поиском, значит наверное уже нашел, как оно выглядит (тут же рассматриваем вариант, что знаем что текст действительно печатается такой и он где-то там в ресурсах найден). Иначе только сидеть смотреть или как игра грузит файлы, или как она выводит на экран (хз. умеют ли отладчики рисовать то, что делает видеокарта, как эмуляторы). Но то, что вариантов много - абсолютно согласен, это лишь один из вариантов.
     
    Последнее редактирование: 15 янв 2015
  20. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Смотря какой. :-( Сквозь полноэкранный directdraw отладчиком копаться тяжело, а припахать софт-айс к двухмашинной отладке у меня получилось только раз и то случайно. :-) А проще всего её организовать, как ни странно, штатным отладчиком шестой визуал-студи, а он отладочные регистры не рюхает. :-(
    Ещё один фактор - в WC4 любое прочитанное содержимое .tre-файлов несколько раз копируется с места на место, приходится переставлять DR'ы и легко сбиться/запутаться. Пару раз пробовал так добраться до фактических обработчиков, помнится, полётных субтитров и ещё чего-то - каждый раз выливалось в несколько часов вышагивания по этим граблям. В основном потому я и отложил такой метод в коробочку "на крайний случай". :-(
    Но пробле́мо - опознаю, уберу руками (под отладчиком же!) старший бит в базовом/индексном регистре и снова пущу выполняться, до следующего С005. :-)
    Выпадет, куда нафиг денется. :-) А если таки не выпадет - значит, неверно определил назначение поля в заголовке и это не смещение, тогда "иди и думай снова, Бычий #@$" (L) :-) - такое тоже бывало.
    Я неудачно выразился. Код авторов игры, само собой. Всякие дообработки, проверки на "выше головы", перепаковки, перекодировки и прочая хренотень...
    А если C++? С ейными виртуальными методами, перегруженными функциями и прочей хренотенью - в статике по дизассемблу такое хрен оттрассируешь, приходится по многу часов не вылезать из отладчика.
    Собственно, изначально псевдоязык понадобился, чтобы в него декомпилировать существующее файло и после правок компилировать обратно: структура IFF'ов довольно неудобна для редактирования "в лоб". Т.е. один фиг пришлось писать компилятор. А добавить в существующий пару "лишних" команд - уже не настолько проблема.
    Увы, недостаточно. Найти иголку, к примеру, вывода символа в 16-мегабайтном стогу дизассембла (под 300000 строк, или грубо 5000 страниц) - я не знаю, какой шаблон поиску подсунуть (согласно принципу "тупую работу на плечи машин"), разве что внимательно читать каждую страницу глазами. :-(
    Опять же - это C++: до хренища действий, нужных самой "объектно-ориентированной парадигме" и нафиг не нужных в прикладном смысле, вроде игрищ с таблицами виртуальных функций или многократного копирования считанного буфера с места на место.
    Кернинг - это изменение ширины буквы в конкретной паре. Не просто "на 1 меньше", а в зависимости от какая буква следующая (или предыдущая). Увеличь и присмотрись, на фотке видно - 'Ь', например, чуть-чуть залезает правым краем под перекладину к 'Т'. А с буквой, к примеру, 'Н' никого никуда задвигать не нужно.
    Обрабатывает. Есть несколько слоёв перехватчиков исключений. Но под отладчиком ловится first-chance exception, что облегчает. Без отладчика же - может и проскочить. :-(
    Этого не пробовал, ничего сказать не могу. Хотя валяется какая-то софтина для правки ресурсов.
    Ну. Зато в DllMain()'е можно чёрта сделать, самое милое место для инъекции кода.
    Как говаривал Шельменко-денщик, "всё-то оно так - да только трооошечки не так". :-( Прочитал, настрополил отладочный регистр на break по чтению, сработало - ага, анализ на IFF'ный тэг с последующим копированием обтэгенного в другой буфер; на него тоже break по чтению, запустил - сработало: за каким-то фигом копирование первого килобайта копии в ещё куда-то; на него тоже break по чтению, запустил - сработало: копирование первоначального блока (ещё с тэгами) в ещё куда-то; на него тоже bre... а фигушки, отладочные регистры кончились, все три штуки. :-((((((
    Тривиально: malloc() - получил буфер - попользовался - free()... и так всю дорогу не по одной сотне раз в секунду. :-(
    Я таких не видел. но при наличии второй машины оно и не критично: на одной машине отладчик, на другой игра во весь экран, достаточно удобно.
     
    Последнее редактирование: 15 янв 2015
    Bato-San нравится это.
  21. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    Для таких случаев рекомендую использовать второй монитор ;)
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление