Gönderen Konu: Eski bilgisayarların yenilerinden daha hızlı olması...  (Okunma sayısı 215 defa)

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2082
  • Advanced User Simulator
    • ae unutmadan
https://danluu.com/input-lag/

8bit makinelerin daha düşük gecikmeye sahip olduğunun peşinde bir arkadaş... Çalışma sürüyormuş ama şimdiki sonuçlar şöyle:

makine                           latency

apple 2e                           30    1983   1MHz   3.5k
lenovo x1 carbon 4g win   150    2016   2.6 GHz   1G


Çevrimdışı matahari

  • RAAT
  • Retroman
  • *
  • İleti: 76
    • The Blog of Mert Börü
Ynt: Eski bilgisayarların yenilerinden daha hızlı olması...
« Yanıtla #1 : 27 Aralık 2017, 17:35:38 »
Bu konunun dile getirilmesine çok sevindim. Her ne kadar birçok kişi için bu bir 'şehir efsanesi' olsa da, işin gerçeği hiç de öyle değil...

Günümüz PC mimarisinin -özellikle de PS4/Xbox konsolların- en zayıf noktası hardware input controller latency. Sanırım hatırlayacaksınız, PS4'ün piyasaya sürüldüğü ilk günden beri yaşanan 'kablosuz bağlantıda gecikme sorunu'nun çözülebilmesi için, yeni bir DualShock modeli geçen yıl Sony tarafından piyasaya sürülmüştü. Sanki bir mucizeymiş gibi tanıtılan (!) bu ürün, aslında gamepad'in pilini doldurmak için kullandığımız mini-USB kablosu sayesinde low-latency sinyal aktarımına olanak tanıyordu. - (Bu tasarımın neden daha önce akıl edilemediği ise tam bir trajedi!)

https://gamingbolt.com/ps4-pro-dualshock-4-controller-offers-minimal-latency-when-connected-to-a-usb-port

Bu ürün güncellemesi sayesinde gecikme süresi biraz olsun azaldı, ancak anakart mimarisinde GPU'ya öncelik sağlamak amacıyla yapılan 'bilinçli tercihler' yüzünden sisteme bağlı diğer tüm donanımların ikinci plana itilmesi gerçeğini değiştirmedi. Latency azaldı, ama hala çok ciddi ve rahatsız edici derecede mevcut!

Bunlar yetmezmiş gibi, işin bir de 'game engine' boyutu var. Onlar da sütten çıkmış ak kaşık değil.

Görevim gereği, 2017 yılı içerisinde yaklaşık 4 ay boyunca Unreal Engine üzerinde 'hardware input controller latency' ile ilgili olarak çok detaylı ölçüm, analiz ve ürün geliştirme çalışmaları yaptım. Unreal Engine’in standart API kullanımında yaşanan gecikme sorunlarını çözmek için bir middleware geliştirdim. Test ortamı için kullandığım konsolda, mevcut Unreal Engine API'ı ile ~0,300ms süren bir input fonksiyonunu override ettim, retro bir yöntemden faydalanarak süreyi ~0,005ms'ye indirmeyi başardım. Her frame'de bu fonksiyonun birçok kez çağırıldığını düşünürsek, 60 frame'lik bir oyunda kabaca 3 frame kazandığımızı söyleyebilirim. - (Aslında bu bir başarı sayılmamalı, zaten olması gereken bu!)

Konuyla ilgili sunumlar yapıp, geliştirdiğim kodu (ismi lazım değil) bir AAA oyun geliştirici firmayla paylaştım. Yaşanan sorunun çok basit bir yöntemle nasıl çözülebileceğini pratiğe dökerek örnekledim. Sunum sonunda aldığım geribildirim beni çok şaşırttı; "Meğer çözüm gözümüzün önündeymiş, ama biz görememişiz!" dediler. Ben de kendilerine "Uyguladığım teknik yeni değil ki, 30 küsür yıl önce ZX Spectrum'da keyboard kontrolünü biz bu şekilde yapıyorduk. Bu standart bir prosedür" dedim. Programlama ekibinin ve bütçesinin başındaki yöneticinin o anki bakışlarını görmenizi isterdim. ;)

Elbette bu, işin sadece yazılım kısmıyla ilgili bir optimizasyon. Bunun bir de anakart mimarisi bazında yapıldığını görebilsek, kimbilir ne ters taklalar attıracağız günümüz PC/konsollarına.

Uzun lafın kısası;
  • Evet, 'hardware input controller latency' olarak adlandırabileceğimiz bir sorun 2017 yılında gerçekten de mevcut.
  • Video oyun sektörünün büyük bir çoğunluğu bu sorunun varlığından bile haberdar değil! Farkında olan azınlık ise mevcut durumu kabullenmiş durumda.
  • Sorunun farkında olan AAA oyun geliştirici firmalar bu sorunu çözmek için Ar-Ge yapmak istemiyor, sorunun varlığını kabul ederek etrafından dolanıyor. Müşteri şikayeti geldiğinde, "Bizim elimizden gelen birşey yok, PS4/Xbox mimarisi böyle" deniyor. Bilinçli AAA oyun geliştirici firmalar ise, bu soruna odaklanan freelancer'ların peşinde koşuyor, çözüm için çok cömert tekliflerde bulunuyor.

Çevrimdışı Alpyre

  • RAAT
  • Retroman
  • *
  • İleti: 26
Ynt: Eski bilgisayarların yenilerinden daha hızlı olması...
« Yanıtla #2 : 28 Aralık 2017, 09:34:35 »
Kaygılanmayın John Carmack abimiz o işe el attı, yakında çözer. :)


Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2082
  • Advanced User Simulator
    • ae unutmadan
Ynt: Eski bilgisayarların yenilerinden daha hızlı olması...
« Yanıtla #3 : 28 Aralık 2017, 11:03:51 »
Test ortamı için kullandığım konsolda, mevcut Unreal Engine API'ı ile ~0,300ms süren bir input fonksiyonunu override ettim, retro bir yöntemden faydalanarak süreyi ~0,005ms'ye indirmeyi başardım.

0.3 milisaniye mi bu değerler yoksa 300ms mi? Tahminen 0.3 saniye kastediyorsun ki bu devasa bir rakam yahu. Anında farkedilir bu latency.

 
Alıntı
Kaygılanmayın John Carmack abimiz o işe el attı, yakında çözer.
matahari çözmüş zaten, hemen çağırıyorum tıfıl John'u, halletsinler.

Çevrimdışı matahari

  • RAAT
  • Retroman
  • *
  • İleti: 76
    • The Blog of Mert Börü
Ynt: Eski bilgisayarların yenilerinden daha hızlı olması...
« Yanıtla #4 : 28 Aralık 2017, 14:14:52 »
0.3 milisaniye mi bu değerler yoksa 300ms mi? Tahminen 0.3 saniye kastediyorsun ki bu devasa bir rakam yahu. Anında farkedilir bu latency.

Hemen açıklayalım efendim...

Önce bir tespit: Ülkemizde ondalıklı sayılar için . (nokta) yerine , (virgül) kullanılıyor olması, haklı olarak hepimizin kafasını karıştırıyor. Biliyorsunuz, şöyle bir sorun söz konusu:

https://tr.wikipedia.org/wiki/Ondal%C4%B1k_i%C5%9Fareti

Bu yüzden Türkçe yazışmalarda mümkün olduğunca bu kurala uymaya çalışarak , (virgül) kullanıyorum. Retrojen'in düzgün Türkçe kullanımı konusundaki hassasiyetine şapka çıkartarak, izninizle alışkın olduğumuz floating point terminolojisi ile anlatmaya çalışayım. ;)

ms = milisaniye

0.300ms = 0.0003 saniye

Normalde 3'ten sonra iki sıfır kullanmamıza gerek yok, ancak 0.300ms'den 0.005ms'ye inişi daha rahat algılayabilmemiz için, her iki sayının basamak sayısını aynı tutuyorum. Sonuçta 0.295ms'lik bir kazançtan söz ediyoruz.

(Meraklısı için NOT: Oyun geliştirme camiasında kullandığımız terminoloji oldukça basit. CPU tabanlı performans ölçümü için cycle, GPU için ms (milisaniye) veya fps (frame/sec) kullanıyoruz. Bunun dışında kalan saniye, mikrosaniye, vs. gibi şeyleri kafa karıştırmamak için kullanmamayı tercih ediyoruz.)

60 frame'lik bir oyun için; 1 frame = 16.6ms

Bu sürenin yaklaşık olarak yarısı (~8ms) sistem ve Unreal Engine tarafından kullanılıyor, bize de diğer yarısı kalıyor. PS4/Xbox için her frame'de çağırılan hardware input controller fonksiyon sayısı 6 (altı). - (PC kullanmamız durumda; keyboard, mouse, vs. yüzünden bu sayı 20'ye kadar çıkabilir!)

6 x 0.300ms = 1.8ms

Bu durumda, her frame'de bize ayırılan ~8ms'lik sürenin kabaca 1/4'ünü harcamış oluyoruz!

Geliştirdiğim middleware sayesinde;

6 x 0.005ms = 0.030ms

İhmal edilebilir bir değer olması sebebiyle, PC/konsol hardware input controller sorununun çok büyük bir bölümünü Unreal Engine içinde çözmüş oluyoruz. Darısı diğer engine'lerin başına...

Çevrimdışı Ref

  • Yönetici
  • Özgür Retrocu
  • *
  • İleti: 2082
  • Advanced User Simulator
    • ae unutmadan
Ynt: Eski bilgisayarların yenilerinden daha hızlı olması...
« Yanıtla #5 : 28 Aralık 2017, 14:53:45 »
Hemen açıklayalım efendim...

yine bende bazı ışıklar yandı :)

Çevrimdışı witchdoktor

  • RAAT
  • Normalleşmiş Retroman
  • *
  • İleti: 664
Ynt: Eski bilgisayarların yenilerinden daha hızlı olması...
« Yanıtla #6 : 28 Aralık 2017, 16:00:26 »
@matahari

Ağzım açık kaldı doğrusu. Donanım soyutlama katmanları bu kadar mı işlem gücü (~%25) tüketiyormuş?! Senin uygulaman sayesinde neredeyse 'zero latency' elde edilmiş oluyor. Konu açılmışken DirectInput API'sine XInput çok fazla şey kattı mı? Çoğu kontrolcüyü, XInput desteği olmadığı için (obsolete) yeni oyunlarda malesef kullanamıyoruz da.

Çevrimdışı matahari

  • RAAT
  • Retroman
  • *
  • İleti: 76
    • The Blog of Mert Börü
Ynt: Eski bilgisayarların yenilerinden daha hızlı olması...
« Yanıtla #7 : 28 Aralık 2017, 16:41:35 »
Ağzım açık kaldı doğrusu. Donanım soyutlama katmanları bu kadar mı işlem gücü (~%25) tüketiyormuş?!

"İşlem gücü tüketmek" yerine "geciktirmek" dersek, yanıt evet.

Bu durum sadece günümüz sistemlerine özgü bir sorun değil. Eskiden de böyleydi. ZX Spectrum ve Amstrad'da 'frame-precise' ('ekran tarama hızı hassasiyetinde' anlamına gelen bir terim) input handling için 50 frame'den 3-4 tanesinin harcanması gerekirdi. Bu yüzden birçok oyunda, her frame'de tüm input portları kontrol etmek yerine, saniyede 2-3 kez kontrol etmek yeterli sayılırdı. Haliyle, bu da "Tuşa bastım, ama geç algıladı!" sendromunu doğururdu. Birçok oyunun hantal bir gameplay'e sahip olması doğrudan bu sorunla ilintiliydi.

Hardware input controller latency ile ilgili olarak en sorunsuz sistem Amiga'ydı. Joystick + Klavye için işlem sadece 2 raster line sürerdi. İstisnalar dışında, günümüz PC/konsolları bile kablo bağlantılı input okuma taleplerine bu kadar hızlı yanıt veremiyor. Bluetooth bağlantılı gamepad'ler ise bu sorunun zirve noktası!

Mesele, sistemin 8-bit ya da 64-bit olması değil. Asıl mesele, sistem mimarisi üzerinde yapılan 'öncelik ve tercihlerin' arkaplana itilen tüm birimleri perdelemesi. Bu bağlamda, "Eski bilgisayarların yenilerinden daha hızlı olması" başlığı sizi yanıltmasın. ;)

Senin uygulaman sayesinde neredeyse 'zero latency' elde edilmiş oluyor.

Bize ayırılan 8ms'lik sürenin sadece 0.030ms'sini kullanmış olmamız sebebiyle, sanırım öyle diyebiliriz. Gerçek anlamda 'zero latency' için donanım mimarisi bazında iyileştirmelere ihtiyacımız var.

Konu açılmışken DirectInput API'sine XInput çok fazla şey kattı mı?

Katabilseydi, bizim bu taklaları atmamıza gerek kalmazdı. ;)

Çevrimdışı witchdoktor

  • RAAT
  • Normalleşmiş Retroman
  • *
  • İleti: 664
Ynt: Eski bilgisayarların yenilerinden daha hızlı olması...
« Yanıtla #8 : 29 Aralık 2017, 09:22:05 »
Hardware input controller latency ile ilgili olarak en sorunsuz sistem Amiga'ydı. Joystick + Klavye için işlem sadece 2 raster line sürerdi. İstisnalar dışında, günümüz PC/konsolları bile kablo bağlantılı input okuma taleplerine bu kadar hızlı yanıt veremiyor. Bluetooth bağlantılı gamepad'ler ise bu sorunun zirve noktası!

C64 de Amiga CIA (8520) çipinin hemen hemen aynısı olan 6526'yı kullanıyor IO arabirimi (belleğe haritalanmış) olarak, bu nedenle neredeyse gerçek zamanlı okumak mümkün (Paddle'lar ise SID çipi tarafından okunuyor). Klavye matrisi için iki ve her bir joystick için birer yazmaç mevcut. Bunların CIA tarafından hangi sıklıkla 'refresh' edildiğini merak ediyorum doğrusu.