RE: DreamShell 4.0 RC 3
Тут не все так просто. Объясню принцип действия.
Игры расчитывают что данные с привода летят в память по DMA и этим занимается DMAC (некая периферия в CPU), а не сам CPU.
В это время CPU занят просчетами в самой игре. Поэтому HDD/CF в режиме true async DMA это наиболее благоприятные условия для игры. Но такие условия могут дать только HDD/CF с ISO образами (или оптимизированные GDI) запущенными в DMA режиме.
В случаях же SD, HDD в PIO режиме, CDI и не оптимизированные GDI образы не могут работать в true async DMA режиме, а значит приходится блокировать процессор на время передачи данных ибо он участвует в этом процессе постоянно.
Эмуляция асинхронного чтения необходима для того, чтобы не блокировать процессор полностью чтением данных, которые игра запросила.
Она разбивает данные на части и каждый кадр в игре считывает 1 часть. Размер этой части задается как раз этой цифрой, о которой ты говоришь.
Чем меньше часть, тем меньше будет просадка FPS при подгрузке данных во время геймплея. Это особенно заметно в Shenmue 2 и Crazy Taxi 2, советую на них поиграться с эмуляцией асинха на ISO образах и поймешь что к чему.
Казалось бы, делаем всегда маленькое значение и вуаля, все игры идут плавно, но тут есть и побочный эффект.
Чем меньше часть, тем дольше будет происходить общее чтение запрошенных игрой данных и мы получаем в итоге заметно более долгую загрузку игры на старте и при загрузке уровней.
Если во время геймплея подгружаются данные, то слишком маленькое значение этого параметра, может привести к пустотам в игровом мире (данные не будут успевать за действиями).
Если же игра не грузит данных налету во время геймплея, то нет необходимости ставить маленькие значения в эмуляции, лучше поставить побольше, чтобы быстрее происходила загрузка игры. Но опять же, слишком большое значение может привести к лагам в видео роликах, если оно и без этого не лагало (непожатые видео в GDI на SD всегда тормозят, а в рипах вполне сносно работать могут).
Так вот, откуда взялась цифра 1+. На самом деле это означает 1.5 сектора и это используется только у SD при условии что используется ISO образ или оптимизированный GDI (как для true async dma). Эта та грань, за которую в играх переступать не рекомендуется, иначе данные не будут успевать. Для HDD меньше 2 ставить смысла нет, он эти 2 сектора очень быстро читает даже в PIO, поэтому я не делал для него таких изысков.
Если соблюдены условия с форматом образов, то SD может не только читать по 1.5 сектора, в этом случае эмуляция асинх работает несколько иначе в принципе. Я бы даже назвал это некой смесью true async и emu async. Конечно, это далеко от true async, так как SPI интерфейс для SD это априори тяжелая работа для CPU, но кое что удается все же выкинуть из циклов. Допустим при обычной эмуляции асинх, каждый кадр в игре делается запрос к устройству на чтение части данных через файловую систему. В случае же с true async или "особым" async у SD, запрос отправляется только 1 раз и потом уже каждый кадр делается опрос состояния, а в случае с SD так и еще считывание части данных с помощью CPU на низком уровне, которые контроллер SD подготовил для нас после запроса. Т.е. получается что мы не отправляем каждый раз новый запрос и не ждем пока контроллер SD ответит (блокируя CPU дольше чем хотелось бы), а отправляем его 1 раз (когда игра попросила) и потом просто дочитываем данные с каждым кадром, при этом минуя еще и часть кода файловой системы. Все это экономит ресурсы CPU, которые очень нужны при использовании SD.
Кстати в эмуляции асинх есть еще одна хитрость. Если игра запросила 100+ секторов за раз, то я предполагаю в коде что загружается либо сама игра на старте просто, либо уровень в ней, в общем геймплея нету, игрок тупо ждет загрузки. На этот случай я вообще выключаю эмуляцию асинх и гружу этот кусок максимально быстро. Без этой маленькой фишки, игры, с малыми значениями emu async грузились бы утомительно долго на старте и во время загрузки уровней. Конечно алгоритм не идеален, игра может разными частями грузить и во время старта, но тут уже ничего не поделаешь, часть загрузки ускоряется и то хорошо.
(Последний раз сообщение было отредактировано 20.03.2015 в 12:02, отредактировал пользователь SWAT.)
|