avva: (Default)
[personal profile] avva
Три интересные статьи, из увиденного недавно.

1. How it feels to learn Javascript in 2017. Дает некое представление о том, как устроены популярные фреймворки последних лет - с виртуальными DOMами, современным синтаксисом ES6, HTML внутри джаваскрипта (JSX). Я довольно далеко от этого мира, и во многом отношусь к нему скептически, но эта небольшая, живо и инересно написанная статья меня покорила.

2. Fizzlefade. Рассказ о том, как в классической игрушке Wolfenstein 3D был сделан эффект "экран постепенно покрывается красными точками, символизирующими кровь, пока целиком не становится красным". Есть исходники на 16-битном ассемблере и эквивалент на C, для тех, кто не хочет вспоминать ассемблер. Очень советую вчитаться как следует и разобраться для себя в том, как устроен LFSR, и особенно - почему "Галуа"-версия LFSR, которая обходится всего одним XOR'ом, эквивалентна обычной. Там весьма элегантный хак.

В качестве бонуса - статья Антиреза Doing the FizzleFade effect with a Feistel network, о совершенно другом способе добиться того же эффекта.

3. Digital Show & Tell - захватывающее видео о некоторых заблуждениях насчет того, как работает аналогово-цифровое конвертирование и наоборот, и почему самплинг типа "24 бита, 192кгц" не дает дополнительных преимуществ в сравнении с обычным CD-уровнем. Это возможно звучит довольно сухо, но я, никоим образом не аудиофил, был заворожен этим видео - исключительно ясные объяснения, на редкость наглядные демонстрации с помощью аналоговых генератора сигнала и осциллоскопа итд. Особенно понравилось объяснение того, почему концептуально неверно рисовать цифровой сигнал в виде "лесенки", и почему все равно это всегда делают. Очень круто.

Date: 2017-08-30 08:51 pm (UTC)
From: (Anonymous)
Какой-то странный код вообще. Насколько помню, Вольф работал только в одном видеорежиме (VGA mode 13h), а там видеопамять адресуется линейно в пределах одного 16-битного сегмента. Вместо того, чтобы мастерить 17-битный регистр, делить его на координаты и проверять их на пределы экрана, а потом вызывать какую-то сишную функцию для отрисовки пикселя, можно было просто использовать родной 16-битный регистр и писать прямо в видеопамять, типа
mov es:[bx-1],color
(в полтора килобайта за пределами видимого экрана можно писать без зазрения, потому что они всё равно не используются).

Date: 2017-08-31 06:04 am (UTC)
From: [identity profile] fantaseour.livejournal.com
Начиная с EGA в видео память уже нельзя было писать цвет. В видеопамять писалсь маска, а цвет задавался через порт. Это называлось защелкой/latch. Такой механизм при этом позволял быстро копировать изображание из невидимой области в видимую, просто копируя байты. При копировании переносилось все, насколько я помню, но вот чтобы задать цвет изначально, надо было задав цвет через порт, писать маску в видеопамять.
http://www.osdever.net/FreeVGA/vga/graphreg.htm

Date: 2017-08-31 07:23 am (UTC)
livelight: (lightning)
From: [personal profile] livelight
В видео-память VGA писать было можно и нужно. Для режима 320*200 она была видна вся, для режимов побольше было видно окно в 64кб, которое можно было двигать. В том режиме в видеопамять напрямую писался байт номера цвета в палитре.

Date: 2017-09-04 02:59 pm (UTC)
From: [identity profile] tyomitch.livejournal.com
В том блогпосте код приведён несколько упрощённый по сравнению с фактически лежащим на https://github.com/id-Software/wolf3d/

В действительности закрашивается не весь экран целиком, а только viewport; рамка вокруг него (чем меньше viewport, тем быстрее работает игра) и статусбар внизу экрана остаются незакрашенными.

Вот для этого клиппинга и нужно разделение rndval на координаты, и проверка их по отдельности.

Кстати, никакая "сишная функция для отрисовки пикселя" не вызывается -- это тоже упрощение, сделанное автором блогпоста. В фактическом коде самый что ни на есть asm mov [es:di],al

Date: 2017-09-05 04:18 am (UTC)
From: (Anonymous)
С настоящими исходниками и вашим комментарием про viewport код действительно стал осмысленным.

Зато появился другой вопрос -- судя по коду рисования пикселя, они там используют mode X вместо mode 13h. Нафига создавать себе лишние трудности, если разрешение всё равно 320x200? Или изначально хотели 320x240, но скорости не хватило?

Date: 2017-09-06 05:46 am (UTC)
From: (Anonymous)
Viewport совершенно здесь не причём. VGA-адаптер зачастую имел больше 64KB памяти, но в линейном режиме они были недоступны. В планарных режимах (mode X) этого ограничения не было и можно было использовать несколько страниц видеопамяти для дешёвой организации двойной (и даже тройной) буферизации, но при этом возникали "лишние трудности" при расчёте адресов и переключении плоскостей вывода.

Date: 2017-09-06 03:12 pm (UTC)
From: [identity profile] tyomitch.livejournal.com
Viewport таки-да при чём: легко зайти на https://classicreload.com/wolfenstein-3d.html и убедиться, что закрашивается только он.

Image

January 2026

S M T W T F S
    1 2 3
4 5678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 6th, 2026 03:22 am
Powered by Dreamwidth Studios