deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak Hacker News – Front Page (native)

Orijinal SimCity bir şehri 16 MHz'lik bir CPU üzerinde nasıl simüle ediyordu

Hacker News'in ana sayfasına çıkan larstofus.com derinlemesine incelemesi, orijinal SimCity'nin 16 MHz hilesini inceliyor: simülasyon işini kareler arasında döndürerek sistemlerin çoğunun çoğu zaman hiç çalışmamasını sağlamak.

Orijinal SimCity bir şehri 16 MHz'lik bir CPU üzerinde nasıl simüle ediyordu

Orijinal SimCity'nin bir şehrin tamamını 16 MHz'lik bir işlemci üzerinde nasıl simüle ettiğini inceleyen bir blog yazısı Hacker News'in ana sayfasına yükseldi ve yazının merkezindeki bulgu şaşırtıcı derecede basit: oyun, karelerin çoğunda simülasyonunun büyük kısmını atlıyordu.

16 Kasım'da larstofus.com'da yayımlanan yazı, Maxis'in 1989 tarihli şehir kurma oyununun kaynak koduna iniyor ve türün erken örneklerinin, dönemin grafik dönüm noktalarından daha şaşırtıcı bir teknik başarı olduğunu savunuyor. Yazar, genellikle Doom ve Quake gibi oyunların takdir topladığını, ama modern işlem gücünün çok küçük bir kısmıyla bütün ekonomileri modellemenin kavraması daha zor bir şey olduğunu yazıyor — özellikle de çağdaş yapımcı oyunlarının bugünün donanımında bile zorlandığı düşünüldüğünde.

Bir 386SX ve katı bir bütçe

Orijinal SimCity, sistem gereksinimleri arasında Intel'in 386SX işlemcisini sayıyordu. Yazıya göre bu çip piyasaya çıktığında 16 MHz hızında çalışıyordu; yazı, SX varyantı değil de temel işlemcinin hız olan 12,5 MHz değerini verdiği önceki bir sürümü de düzeltiyor.

Peki Maxis bu simülasyonun tamamını o bütçeye nasıl sığdırdı? Yazara göre bunun nedenlerinin çoğu harici; yazar, dönemin işletim sistemi ekosistemine işaret ediyor. Ama oyun kodunda incelenmeye değer kasıtlı bir optimizasyon var ve bu kod, 2008'de kaynak GPL altında Micropolis adıyla yayımlandığından beri herkes tarafından okunabilir durumda. Açık kaynak yapılan yalnızca kod oldu, marka değil; proje bu yüzden farklı bir isim taşıyor.

Tek bir fonksiyon, on altıda birlik dilimlerle

Yazı, performans çözümlenirken kod tabanının kabaca yüzde 90'ının göz ardı edilebileceğini açıklıyor. İlginç kısım, her karede çalışan ve işi oyunun alt sistemlerine dağıtan tek bir fonksiyon: s_sim.c içindeki Simulate(). Bu alt sistemler, trafiği, yangını, elektriği ve suçu modelleyen CrimeScan(), FireAnalysis() ve CollectTax() gibi yordamlar.

Bunların hepsini her karede çağırmak 1989 donanımını ezber bozar bir yük altına sokardı. Bunun yerine Simulate(), yazarın alışılmadık olarak işaretlediği bir parametre alıyor: modern bir oyun döngüsü delta time geçirirken SimCity, 0'dan 15'e dönen bir sayaç geçiriyor ve bu değer, o anki karede simülasyonun hangi diliminin çalıştırılacağına karar veriyor. Alt sistemlerin çoğu, karelerin çoğunda hiçbir şey yapmadan bekliyor.

Yazara göre oynanıştaki bedeli şu: simülasyonun belirli bir yönü, oyuncunun bir eylemine ortalama sekiz karede, en kötü durumda 15 karede tepki veriyor. Bu, bir nişancı oyununda yıkıcı bir girdi gecikmesi olurdu; ama yazar, bir şehir için bu gecikmenin anında tepkiden daha doğal bile hissettirebileceğini savunuyor.

Hiç kaybolmayan bir desen

Yazı, tekniğin tek bir türün ötesine genellenebildiğini sürdürüyor. Yarış oyunu Assetto Corsa (2014), araba yansımalarını periyodik olarak yenilenen cubemap'lerle oluşturuyor; bir cubemap'in altı yüzünü de her karede güncellemek yerine yalnızca birkaçını yeniliyor ve bunu, yapılandırma dosyasında görülebilen ve yansıma kalitesi seçeneğine bağlı FACES_PER_FRAME ayarı yönetiyor.

Daha dinamik bir varyant ise her bölümün boyutuna ve içeriğine çalışma zamanında, ekran boyutu ya da son güncellemeden bu yana geçen süre gibi etkenlere göre karar veriyor. Yazar, Unreal'ün Lumen'inin tüm ışıklandırmayı her karede yeniden hesaplamadan bu kadar iyi görünmesini bu yaklaşıma bağlıyor ve tanıdık yan etkiye dikkat çekiyor: yansımalar zaman zaman gözle görülür biçimde eksik güncellemeler gösteriyor.

Neden önemli

Pahalı işi tek seferde yapmak yerine birçok kareye yaymak, oyun programlamanın en eski fikirlerinden biri ve Micropolis, tamamlanmış ve raflara çıkmış bir uygulamanın satır satır okunabildiği nadir örneklerden biri olmaya devam ediyor. Fikir eskimemek yerine büyüyor: Lumen aynı hilebin modern kıyafetle sunulmuş hali ve artefaktları, bugünkü donanımın bile her karede her şeyi yapmaya gücünün yetmediğini gösteriyor. Yazı, yazarın oynanış programcılarının kendilerine sormalarını önerdiği bir soruyla bitiyor: tüm o kodun gerçekten her karede çalışması gerekiyor mu?

  • #simcity
  • #retro-computing
  • #game-development
  • #performance
  • #optimization

İlgili yazılar