Ben-motor kodlama ediyorum, ben genellikle sadece sabit ilgilenen ediyorum n
: Zaten alıcı nesne sayısını sınırlayan bir mekansal bölüm var update()
, physics()
ve render()
ekran ve çevresinde yaklaşık olanlara. Maksimum parti boyutu genellikle oyun başına oldukça iyi tanımlanmıştır, ancak her zaman planladığınızdan biraz daha büyüktür.
Bu durumda, sabit faktör çarpanı ve düşük dereceli terimlerle ilgilendiğim kadar big-O ile ilgilenmiyorum. Çalışma süresi a*n^2 + b*n + c
olan (yani O(n^2)
) bir işlev için , genellikle azaltma a
ve muhtemelen ortadan kaldırma ile daha çok ilgileniyorum c
. Bir kurulum veya sökme maliyeti c
, küçük veya küçük bir oranla orantılı olarak artabilir n
.
Bununla birlikte, bu big-O'nun (veya daha özel olarak big-teta'nın ) harika bir kod kokusu göstergesi olduğu anlamına gelmez . Bir O(n^4)
yerde veya daha da kötüsüO(k^n)
geometrik bir zaman görün ve diğer seçenekleri düşündüğünüzden emin olmanın zamanı geldi.
Ben genellikle veri yapma araçları ile uğraşırken big-O optimallik ve daha düşük big-O ile algoritmalar bulmak için çemberler arasında atlama hakkında daha fazla endişe duyuyorum. Belirli bir düzeydeki / akış alanındaki nesnelerin sayısı genel olarak iyi tanımlanmış olsa da, tüm oyundaki toplam nesne / sanat varlığı / yapılandırma dosyası / vb. Aynı zamanda çok daha büyük bir sayı. Paralel bir veri çalıştırmak bile, bir jam data-clean && jam data
döngüden geçmek için hala bir dakika bekleriz (biliyorum, whine whine - konsollar için veri yapmak saatler sürebilir - çoğunlukla küçük avuçiçi oyunuz) .
Belirli bir örnek vermek gerekirse: Bu, 8x8 256 renkli döşemeleri akan bir arka plan döşemesi akış algoritmasıyla gerçekten elden çıktı. Akış tamponlarını arka plan "katmanları" arasında paylaşmak yararlıdır ve aynı tamponu paylaşan belirli bir seviyede bunlardan 6 tanesine sahip olabiliriz. Sorun, gereken arabellek boyutunu tahmin etmenin 6 katmanın olası konumlarına dayandırılmasıdır - ve asal sayı genişliği / yüksekliği / kaydırma oranı ise, hızlı bir şekilde kapsamlı bir aramaya başlayabilirsiniz - yaklaşmaya başlarO(6^numTiles)
- çoğu durumda "evrenden daha uzun olacak" kategorisinde. Neyse ki çoğu vaka sadece 2-3 kat, ancak o zaman bile, yarım saatin üzerinde çalışıyoruz. Şu anda, bu olasılıkların çok küçük bir alt kümesini örnekleyerek, belirli bir süre geçene kadar ayrıntı düzeyini artırıyoruz (veya küçük çift katmanlı yapılandırmalarda olabilecek görevi tamamladık). Bu tahminin ne sıklıkta yanlış olduğumuzun önceki istatistiklerine dayanarak biraz arttığını ve ardından iyi bir ölçü için biraz ekstra dolgu eklediğimizi tahmin ediyoruz.
Bir başka eğlenceli örnek: bir süre önce bir PC oyununda, baş mühendis atlama listelerini bir süre denedi . Bellek yükü daha fazla önbellek etkisine neden olur, bu da tüm mesele için bir çeşit sabit olmayan çarpan ekler - bu yüzden küçükler için gerçekten iyi bir seçenek değildir n
. Ancak, aramaların sık görüldüğü daha büyük sıralı listeler için bir avantaj sağlar.
(Çoğu zaman saf algoritmanın daha yüksek big-O olduğunu, daha küçük veri kümelerinde daha hızlı olduğunu ve daha kolay anlaşıldığını görüyorum; daha ilginç / karmaşık olanları (örneğin patricia trie) insanlar için anlamak ve korumak daha zordur, ancak daha büyük veri kümeleri.)