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

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

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

Кодерский уголок

Тема в разделе "Мастерская", создана пользователем Dimouse, 10 сен 2006.

  1. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.131
    В соответствии с назначением раздела, в этой теме предполагается обсуждать конкретные вопросы, которые у вас возникают при создании своих программ (в частности - игр), помогать другим, размещать полезные ссылки на статьи и материалы, которые могут пригодиться другим.

    Что здесь не допускается:
    - беспорядочный флуд на всевозможные темы, в том числе общие обсуждения языков программирования без конкретики (карается по статье "флуд и оффтопик" *),
    - разжигания на темы "что лучше, Си или Си++ и чем они отличаются?", "какой язык программирования лучше X или Y?" и т.п. (карается по статье "флейм и участие в холиварах" *),
    - мерение пиписьками в стиле "я лучше программирую" или "ты не умеешь программировать" (карается по статье "оскорбление участников и их взглядов" *).

    Всё это допускается в специально созданной теме "Беседка для программистов или «Бутерброд с кодом».

    * по усмотрению модератора также возможно применение блокировки в данной теме.

    Оригинальное сообщение
     
    Последнее редактирование модератором: 24 ноя 2014
    CY8R4Y нравится это.
  2.  
  3. AlexDC Рябь на море Дирака

    AlexDC

    Регистрация:
    30 мар 2009
    Сообщения:
    1.620
    @Kristobal Hozevich Hunta, дык, форк вовсе не значит что его нужно обратно мерджить) Может, хочется начать новую разработку на имеющейся кодовой базе, либо заточить под свои личные нужды, так например делают форки эмуляторов для поддержки специфических функций записи видеопрохождений, на которые авторы оригинального кода явно не станут заморачиваться. Ваш Кэп.
    Offtop
    я не кодер, просто кое-что читаю по теме, ибо нельзя ковыряться в линухе, не зная ничего про Гитхаб и другие системы совместной разработки
     
    Kristobal Hozevich Hunta нравится это.
  4. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.204
    Тогда выходит, что branch - это глобальные точки ветвления проекта, осуществляемые автором, а fork - это локальные точки ответвления, которые могут служить базой для нового проекта. При этом изменения, внесенные в fork, могут быть включены в основной проект посредством pull request.

    Короче: репозиторий - дерево, основной проект - ствол, бранчи - развилки, форки - мелкие ветви, майнтайнер - хозяин дерева, контрибуторы - мичуринцы ))

    Мда, книжку прочитать всё ж придётся ))
     
  5. R4kk00n Benched arcade playa

    R4kk00n

    Модератор

    Регистрация:
    28 мар 2005
    Сообщения:
    9.290
    @Kristobal Hozevich Hunta, форки и брэнчи местами поменяй. И на гитхабе форки - это любые клоны исходного репозитория. А контрибуторы - это все аккаунты гитхаба, помимо исходного хозяина репы, чьи коммиты есть в репе.
     
    Kristobal Hozevich Hunta нравится это.
  6. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Суть подхода GIT в том, что любые значительные изменения принято делать в отдельной ветке, и ты можешь по желанию подтягивать себе изменения, которые вносятся в это время в родительскую. И, как я уже говорил, добавление веток - это буквально ветвление дерева коммитов, а merge - обратное действие, где ветки срастаются вместе. при этом ветки необязательно перестают существовать в качестве отдельных сущностей.
    Благодаря merge, репозиторий - не дерево, а (направленный ациклический)граф.
    Форк - это всего лишь ветка, которая предположительно будет существовать неограниченное время и склонированная в отдельный репозиторий, вместо типичной ветки, которая существует временно, потом мержится в главную и удаляется. При этом вся ее структура, все коммиты не пропадают, а переносятся в родительскую.
     
    Kristobal Hozevich Hunta нравится это.
  7. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.204
    С какой стороны подступать к оптимизации существующего кода под много ядер?

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

    Сейчас это делают какие-нибудь новые фичи в последней платной VS?

    Где увидеть простейшие примеры-сравнения оптимизированного и не оптимизированного кода?

    Спасибо.
     
    Последнее редактирование: 23 авг 2016
  8. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    VS давно уже бесплатная (Community Edition, все фичи поддерживаются без ограничений).
     
    Kristobal Hozevich Hunta нравится это.
  9. daemolisher

    daemolisher

    Регистрация:
    2 дек 2009
    Сообщения:
    1.704
    Не в ту сторону смотрите, имхо.
    Возможности компилятора в оптимизации крайне ограничены - и это собственно так и должно быть.



    Наверно, оптимизацию игры надо начинать с архитектуры движка. А может быть с чего-то более высокоуровневого.
     
    Kristobal Hozevich Hunta и fR0z3nS0u1 нравится это.
  10. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.204
    @MisterGrim,
    хотел поспорить, но передумал ))
     
  11. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Ну, например, в OSX/iOS есть такая забавная технология Grand Central Dispatch...
    Некоторые игровые движки содержат внутренний таск-менеджер, делающий примерно то же самое.
     
    Kristobal Hozevich Hunta нравится это.
  12. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Пытаюсь собрать код, рассчитанный по заявлениям производителя на Microsoft C 6.00A, скачанным с old-dos.ru Microsoft C 6.0.

    Вылетает с руганью на такую строчку:

    extern void( __interrupt __far *nDSPSaveVect )();

    Ругается так:

    error C2146: syntax error : missing ')' before identifier '__far'
    error C2182: '__interrupt' has type void
    error C2045: expected '(' to follow '__interrupt'

    Что ему надо, и что означает такая запись __interrupt?

    Я интуитивно заменил __interrupt __far на _interrupt _far, и ругань прекратилась, зато появилась новая ошибка при сборе:

    LINK: warning L4051: CLIBCE.lib : cannot find library

    При этом Microsoft C я честно устанавливал с 7 дискет. Почему линкер требует библиотеку, которой нет в дистрибутиве? Может, это связано с заменой __ на _?
     

    Вложения:

    • PRESETS.zip
      Размер файла:
      652 байт
      Просмотров:
      67
    Последнее редактирование: 3 ноя 2016
  13. Bobbie

    Bobbie

    Регистрация:
    28 ноя 2016
    Сообщения:
    145
    Пишу загрузчик pcx файлов(24 битных) Вместо нормального изображения выводится три его копии меньшего размера и в оттенках серого. Кто поможет пофиксить баг? Ссылка на код -
     
  14. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    @Bobbie, Use stb_image, Luke! Хотя PCX там нет..
     
  15. Gamecollector

    Gamecollector

    Регистрация:
    23 сен 2016
    Сообщения:
    2.410
    Возник вопрос на тему "как определить, что программа / игра использует direct3d7 и ниже"?
    Тот же glide (если не 2.1.1 и ниже) элементарно определяется по импорту функции, то есть по наличию строки grGlideInit внутри .exe.
    D3d9 c d3d8 - по Direct3DCreate9 и Direct3DCreate8.
    Ddraw7 по DirectDrawCreateEx.
    Ddraw более ранних версий, соответственно, по DirectDrawCreate.
    А вот как однозначно определить использование d3d7 и более ранних? CreateDevice ещё и в DirectInput есть... А вызов IDirect3D7 через QueryInterface ничего нового в импортируемые функции не вносит...
     
    Последнее редактирование: 10 дек 2016
  16. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    https://github.com/jack7277/Dosbox-Subtitle-Loader

    может быть кто-нибудь допилит загрузчик субтитров, проект не мой.
    проблема - частенько падает на некоторых конфигурациях.
    использовалось в harvester, чтобы во время видео показывались хардсабы, метод вроде универсальный, но падучий.
     
  17. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    @jack7277, это к @Рыжий Тигра - он точно такую же хрень собрал и ровно с теми же целями. Так что, скорее всего, за пару минут заменит на свою реализацию.
    --- добавлено 27 дек 2016, предыдущее сообщение размещено: 27 дек 2016 ---
    без DX9, например.
     
  18. jack7277

    jack7277

    Регистрация:
    23 май 2004
    Сообщения:
    1.115
    я просто выложил, а то как обычно внезапно(тм) навернется диск и потом будешь вспоминать, что там то было, а тут это, вот и раскидываю по всем облакам интересное.

    @Bato-San, насчет дх9 хз, может быть, у меня были падения на всем одинаковом, но разные сборки досбокса, несколько штук перебрал, выбрал стабильно у меня работающий и прошел)
     
    Последнее редактирование: 27 дек 2016
  19. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    ... сам понимаешь, что это скорее намекает не на
    а на "делай всё правильно, как положено, что бы работало, как надо."

    ЗЫ. Но в целом исходники полезные для ознакомления желающими запилить нечто похожее.
     
  20. iunnamed

    iunnamed

    Хелпер

    Регистрация:
    15 янв 2007
    Сообщения:
    1.202
    Вожусь с ремейком одной игры и возникла потребность в хранении текстовых ресурсов, т.к. часть строк в игре кривая, часть с ошибками, плюс для перевода на другие языки (Бюро попросило) всё равно должен быть какой-то файл с текстовыми ресурсами. Первое что пришло в голову - использовать ini-файлы. Мысль неплохая, но мозг активно и очень долго ей сопротивлялся: тут нужен либо парсер, к тому же учитывающий возможные ошибки, либо компилятор в какой-то бинарный формат (что парсер не отменяет), чтобы оно быстрее строки из массива строк извлекало (бинарный формат уже скомпилирован и не проверяется).
    Есть готовые решения для парсинга ini-файлов, но они толстые (на данном этапе отладочная версия игры, с кучей прибамбасов для отладки, занимает всего 23 Кб) и/или навороченные - стрельба из пушки по воробьям.
    Воспалённый мозг в какой-то момент выдал оригинальное решение, которое и было благополучно использовано.

    Итак, зачем корячиться и писать компилятор строк, если это можно свалить на... FASM.

    1) Создаём файл с константами "constant.inc" (здесь и далее содержимое файлов - это примеры):
    Код:
    s_hello = 1
    s_world = 2
    s_main_menu = 3
    ; и так далее
    2) Создаём файл с текстами "messages.asm":
    Код:
    ; подключаем константы
    include 'constant.inc'
    ; макрос для объявления строк, чтобы кучу кода вручную не писать
    macro _ id, tx {
      ; идентификатор строки
      dw id
      ; размер (без нуля 0), строка, 0
      db @f - $ - 2, tx, 0
      @@:
    }
    
    ; погнали объявлять строки
    _ s_hello, 'Hello'
    _ s_world, 'world!'
    _ s_main_menu, 'Main Menu'
    ; и так далее
    
    ; обязательный терминатор - строки закончились
    dd 0
    3) Компилирует в FASM файл "messages.asm" и получаем "messages.bin".

    4) Использовать вот так (переменная "p" - буфер с файлом "message.bin", остальное, думаю, и так понятно):
    Код:
    char err_str_id_not_found[] = "ERR_STR_ID_NOT_FOUND";
    
    char *GetStrById(BYTE *p, DWORD id) {
    char *result;
    DWORD ci;
      // default - string not found
      result = NULL;
      // sanity check
      if (p) {
        // by now only WORD used as id
        id = LOWORD(id);
        // while not NULL terminator
        for (ci = *((WORD *)p); *((DWORD *)p); ci = *((WORD *)p)) {
          // not found since all strings stored in ascending id order
          if (ci > id) {
            break;
          }
          // id matches?
          if (ci == id) {
            // string found
            result = (char *) &p[3];
            break;
          }
          // skip the whole string and header data
          p += p[2]; // string length (without zero byte)
          p += 4;    // id (2 bytes) + string length (1 byte) + zero (1 byte)
        }
      }
      // string id not found
      if (!result) {
        // FIXME: fatal error?
        // by now - use default stub
        result = err_str_id_not_found;
      }
      return(result);
    }
    5) Всё элементарное - просто. Можно пользоваться. Файл "constant.inc" можно подключать как к сценам, так и к движку, чтобы вместо "3" писать "s_main_menu" и, вообще, было понятно что и где используется.

    6) Ограничения:
    6.1) Все id строк должны быть в возрастающем порядке (или убрать проверку на "ci > id").
    6.2) Нельзя объявлять пустые строки с id = 0 (4 байта и все нули - это терминатор, означающий конец файла) - легко исправляется, но здесь это не нужно.
    6.3) Длинна одной строки не может быть более 255 символов (без нуля) - аналогично предыдущему пункту.
    6.4) На очень большом количестве строк, конечно же, будет быстрее держать (или строить) таблицу смещений отсортированную по id, чтобы можно было дихотомией по ней быстро проходиться.
     
    bvedargh, Bato-San и Dimouse нравится это.
  21. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    @iunnamed, прочитал и подумал, что всё же длительное употребление современных (именно так) высокоуровневых языков и всяких lua изрядно попортило современных программистов, коли подобные вещи, внезапно, воспринимаются на уровне "осенило", хотя они изначально составляют основу.
     
  22. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Запутался c directdraw'ными оверлеями, нужна подсказка куда копать.
    Имеем три IDirectDrawSurface'а:
    • screen - на весь экран, параметры (снимались GetSurfaceDesc()'ом сразу после CreateSurface()):
      dwFlags: 0000100f DDSD_CAPS DDSD_WIDTH DDSD_HEIGHT DDSD_PITCH DDSD_PIXELFORMAT
      dwWidth: 1920 dwHeight: 1080 lPitch: 7680
      ddsCaps.dwCaps: DDSCAPS_PRIMARYSURFACE | DDSCAPS_VIDEOMEMORY | DDSCAPS_VISIBLE | DDSCAPS_LOCALVIDMEM
      ddpfPixelFormat.dwFlags: DDPF_ALPHAPIXELS | DDPF_RGB
      dwRGBBitCount: 32 dwRBitMask: 00ff0000 dwGBitMask: 0000ff00 dwBBitMask: 000000ff dwRGBAlphaBitMask: ff000000
    • overlay - привязанный к screen'у оверлей, параметры:
      dwFlags: DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PITCH | DDSD_BACKBUFFERCOUNT | DDSD_PIXELFORMAT
      dwWidth: 640 dwHeight: 480 lPitch: 1280 dwBackBufferCount: 1
      ddsCaps.dwCaps: DDSCAPS_COMPLEX | DDSCAPS_FLIP | DDSCAPS_FRONTBUFFER | DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM
      ddpfPixelFormat.dwFlags: DDPF_FOURCC
      dwFourCC: 0x32595559 (YUY2)
    • source - уже сформированная игрой картинка, параметры:
      dwFlags: DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PITCH | DDSD_PIXELFORMAT
      dwWidth: 640 dwHeight: 480 lPitch: 1280
      ddsCaps.dwCaps: DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY
      ddpfPixelFormat.dwFlags: DDPF_RGB
      dwRGBBitCount: 16 dwRBitMask: 0000f800 dwGBitMask: 000007e0 dwBBitMask: 0000001f
    Дальше пытаюсь сделать:
    overlay->UpdateOverlay( NULL, screen, [0,0,640,480], DDOVER_SHOW, NULL );
    overlay->GetAttachedSurface( [DDSCAPS_BACKBUFFER], &backbuffer );
    backbuffer->Blt( [0,0,640,480), source, [0,0,640,480], DDBLT_WAIT, NULL );

    - первые две функции проходят на ура, вторая - обламывается с кодом 0x80004001 (DDERR_UNSUPPORTED, то бишь не поддерживается).
    Всё, кроме двух последних строк, честно слизано с микро$офтовского "москитного" примера.

    Что я делаю не так? Или Blt() для YUV'ных оверлеев действительно не поддерживается? Подкиньте примеров и/или что-ньдь почитать, плиз!
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление