View Categories

Olaylar

4 dakika okuma

Görüntü oluşturma işlemi ayrı bir iş parçacığında (ve paralel hesaplama için ek iş parçacıklarında) gerçekleştirilir. Bu eşzamansız işlem, çeşitli olaylar kullanarak ana iş parçacığına sinyal gönderir. Bunlar  Başlangıç ​​Kılavuzunda kısaca açıklanmıştır  . Burada da listeleyeceğiz.

Oluşturucu durumları #


Bazı farklılıklarla birlikte üç ana durum vardır:

  • Boşta

    • Boşta Başlatıldı – start() fonksiyonu ilk kez çağrılmadan veya clearScene() fonksiyonu çağrıldıktan sonraki başlangıç ​​durumu.

    • Boşta Durduruldu – Kullanıcı, stop() fonksiyonu veya VFB aracılığıyla render işlemini durdurdu.

    • Boşta Kalma Hatası – Bir hata nedeniyle render işlemi durdu.

    • İşlem Tamamlandı – Görüntü normal şekilde işlenmeyi tamamladı.

    • Boşta Kalan Kare Tamamlandı – Animasyon dizisinin mevcut karesi normal şekilde tamamlandı ve continueSequence() fonksiyonunun çağrılmasını bekliyoruz.

  • Hazırlık – start() çağrısından sonraki ara durum; bu aşamada V-Ray verileri yükler ve hızlandırma yapılarını işleme için hazırlar. Bu durumdayken sahne değiştirilemez; yapılan değişiklikler atılacaktır. Bu durumdayken DR sunucuları da eklenemez. Büyük ve karmaşık sahnelerde bu durumdan çıkmak biraz zaman alabilir. Bu nedenle start() çağrısının eşzamansız olarak yapılması önerilir. Aksi takdirde, kontrol eden iş parçacığı uzun süre bloke olacaktır.

  • Oluşturma

    • İşleme Duraklatıldı – Yalnızca Etkileşimli modda mümkün – Örnekleme duraklatıldı, bu nedenle işlemci boşta, ancak bellekten hiçbir şey boşaltılmıyor.

    • “Rendering Away Upway Changes” – Yalnızca Etkileşimli modda ve yalnızca keepInteractiveRunning=true olduğunda – Örnekleme, istenen kalite seviyesine ulaşıldığı için durduruldu, ancak sahneye bir değişiklik uygulandığı anda devam edecektir. “Rendering Paused” durumundan farklı olarak, bu duruma otomatik olarak girilir.

VRayRenderer sınıfı, StateChanged olayına (aşağıya bakınız) ek olarak,  mevcut durumu kontrol etmek için getState()  (.Net’te GetState()) yöntemini sağlar. getState() yönteminin kullanılması, durum eşzamansız olarak değiştiği için iş mantığınızda yarış koşullarına neden olabilir. Çoğu durumda StateChanged geri çağırma işlevini kullanmak en iyisidir.

Bu, olası durum geçişlerinin bir diyagramıdır:

Temel etkinlikler #


Bunlar tüm render modları için ortak olan olaylardır:

  • onStateChanged – Oluşturucu farklı bir oluşturma durumuna her girdiğinde tetiklenir (yukarıya bakın). Önerilen eşzamansız renderer.start() yöntemini kullanırken PREPARING durumu önemlidir. Bu durumda ana iş parçacığını engellemekten kaçınırız, ancak oluşturucuyu ve sahne içeriğini güvenli bir şekilde değiştiremeyiz. Bu nedenle, RENDERING durumuna girmeden önce PREPARING durumunda birçok işlem engellenir. Sahneyi yalnızca PREPARING durumundan çıktıktan sonra (etkileşimli mod) değiştirebilirsiniz. renderSequence() ile bir animasyon dizisi oluşturuyorsanız, kareler arasında ek bir durum olduğunu unutmayın.

  • onLogMessage – V-Ray’in render işleminden önce ve işlem sırasında metin mesajları gönderdiği olay. Bu olay, bilgilendirme mesajlarının yanı sıra uyarıları ve hataları da kaydeder.  Bu olaydan her zaman bir tür kayıt tutmanız şiddetle tavsiye edilir  . Kayıt olmadan sorunların teşhisi çok zor olabilir.

  • onProgress  – V-Ray mevcut görevi değiştirdiğinde (örneğin yükleme, render alma) veya ilerleme yüzdesinde artış bildirdiğinde.

  • onVFBClosed ,  onVFBRenderLast  – V-Ray Kare Tamponu ile ilgili – VFB kapatıldığında ve “Son render” düğmesine basıldığında gerçekleşir. Bunları ayrıntılı olarak ele almayacağız.

Bu olaylar, uyarlanabilir görüntü örnekleyici kullanılırken yalnızca Üretim moduna özgüdür:

  • onBucketInit ,  onBucketReady ,  onBucketFailed  – Bir resim “kovası”nın işlenmesi başladı/bitti/başarısız oldu. Bunlar, resmin şu anda işlenen kısmını bir şekilde vurgulamak ve dağıtılmış işleme modunda hangi sunucunun üzerinde çalıştığını göstermek için kullanılabilir.

Aşağıdaki olay, aşamalı görüntü örnekleyici kullanılırken Etkileşimli mod ve Üretim moduna özgüdür. Ayrıca, hafif önbellek ön geçişinden gelen önizleme güncellemeleri, kova üretim modunda bile bu olayı tetikleyebilir.

  • onProgressiveImageUpdated  – Oluşturulan görüntü, bir sonraki örnekleme geçişiyle güncellenir. Bu genellikle, VFB’ye güvenilmediğinde, ilerleyici modda oluşturucudan gelen en son sonuçları görüntülemek için kullanılır.

Performans ve diş güvenliği #


Olayların, özel bir AppSDK iş parçacığından sırayla gönderildiğini akılda tutmak önemlidir. Geri çağrı kodunuz senkron ve yavaşsa, kuyruktaki tüm olayların gelişini yavaşlatacaktır. Bu nedenle, örneğin OnProgressiveImageUpdated geri çağrısında yoğun görüntü işleme yapıyorsanız, bunu asenkron hale getirmelisiniz. Olay geri çağrılarının ayrı bir iş parçacığından çağrılması, geri çağrıdan VRayRenderer’ı değiştirmemeye veya ana iş parçacığının aynı anda onu değiştirmemesini sağlamaya dikkat etmeniz gerektiği anlamına da gelir. Oluşturucu iş parçacığı güvenli değildir.

Birden fazla olay işleyici #


Şu anda yalnızca bir işleyici atanmasına izin veriyoruz. Birden fazla geri çağırma işlevi eklemek için, örneğin hem konsola hem de bir günlük dosyasına mesaj kaydetmek için, tüm gerçek uygulamalarınızı çağıran bir ana olay işleyicisi oluşturmanız yeterlidir. İstisnalar, birden fazla işleyici/dinleyiciye izin veren .Net ve Node.js’dir.

Bir olay işleyicisini kaldırmak #


Bir etkinliğe abone olmanın yanı sıra, ona bağlı olay işleyicisini de kaldırabilirsiniz. Bu, örneğin günlük kaydını açıp kapatmak için kullanışlıdır. Bağlı bir olay işleyicisi yokken meydana gelen olaylar saklanmaz. Daha sonra işleyicinizi ayarladığınızda bunları almazsınız.

Şimdi mesaj  olay işleyicisini nasıl ekleyip kaldırabileceğimizi görelim :

def onMessage(renderer, message, level, instant):
print(message)

with vray.VRayRenderer() as renderer:
renderer.setOnLogMessage(onMessage) # attach
renderer.load("scene.vrscene") # this will log some output
renderer.setOnLogMessage(None) # detach
renderer.start() # no output during rendering
renderer.waitForRenderEnd()

void onMessage(VRayRenderer& renderer, const char* message, MessageLevel level, double instant, void* userData) {
printf("%s\
", message);
}

void main() {
// ...
renderer.setOnLogMessage(onMessage); // attach
renderer.load("scene.vrscene"); // this will log some output
renderer.setOnLogMessage(NULL); // detach
renderer.start(); // no output during rendering
renderer.waitForRenderEnd();
}

static void HandleMessageEvent(object source, VRay.MessageEventArgs e)
{
Console.WriteLine(e.Message);
}
static void Main(string[] args)
{
// ...
renderer.LogMessage += new EventHandler<MessageEventArgs>(HandleMessageEvent); // attach
renderer.Load("scene.vrscene"); // this will log some output
renderer.LogMessage -= HandleMessageEvent; // detach
renderer.Start(); // no output during rendering
renderer.WaitForRenderEnd();
}

var onMessageHandler = function(message, level, instant) {
    console.log(message);
};
renderer.on('logMessage', onMessageHandler);     // attach
renderer.load('scene.vrscene', function(err) {             // this will log some output
    if (err) throw err;
    renderer.removeListener('logMessage', onMessageHandler); // detach
    renderer.start(function(err) {         // no output during rendering
        if (err) throw err;
        renderer.waitForRenderEnd(function() {
            renderer.close();
        });
    });
});

Etkinlikteki gelişmeler hakkında daha fazla bilgi. #


İlerleme olayı tüm render motorları için ortaktır. Render işleminin zaman alan adımlarındaki ilerlemeyi gösterir.

İşlem yöneticisi, mevcut görevin metinsel açıklamasını ve iki sayı alır: halihazırda tamamlanmış soyut iş birimi sayısı ve toplam iş birimi sayısı.

İşte ilerlemeyi yüzde olarak raporlamanın ve ayrıca VFB ilerleme çubuğuna metin ve değer eklemenin gelişmiş örnekleri:

progressStart = 0.0
progressRelative = 0.0
elapsed = 0.0
remaining = 0.0
 
def printProgressExt(renderer, message, progress, total, instant):
    global progressStart
    global progressRelative
    global elapsed
    global remaining
 
    progressRelative = progress / total
    if (progress == 0):
        progressStart = instant
        elapsed = 0.0
        remaining = 0.0
    else:
        elapsed = instant - progressStart
        remainingMultiplier = (1.0 - progressRelative) / progressRelative
        remaining = elapsed * remainingMultiplier
 
    progressBarText = '{0} [{1:02d}:{2:02d}:{3:04.1f}][{4:02d}:{5:02d}:{6:04.1f} est]'.format(message,
        int(math.floor(elapsed / 3600.0)), int(math.floor(math.fmod(elapsed / 60.0, 60.0))), math.fmod(elapsed, 60.0),
        int(math.floor(remaining / 3600.0)), int(math.floor(math.fmod(remaining / 60.0, 60.0))), math.fmod(remaining, 60.0))
 
    # Set the progress text and value to the VFB progress bar
    renderer.vfb.setProgressTextAndValue(progressBarText, progressRelative)
    print('Progress ({0}%) {1}'.format(round(100.0 * progressRelative, 2), progressBarText))
 
with vray.VRayRenderer() as renderer:
    renderer.renderMode = 'production'
    # A listener for progress event
    renderer.setOnProgress(printProgressExt)
    # Enable the progress bar in the VFB window.
    renderer.vfb.enableProgressBar()
    # render ...
char progressBarText[512];
double progressStart = 0.0;
double progressRelative = 0.0;
double elapsed = 0.0;
double remaining = 0.0;
 
void printProgressExt(VRayRenderer& renderer, const char* message, int progress, int total, double instant, void* userData) {
progressRelative = double(progress) / double(total);
if (progress == 0) {
progressStart = instant;
elapsed = 0.0;
remaining = 0.0;
} else {
elapsed = instant - progressStart;
const double remainingMultiplier = (1.0 - progressRelative) / progressRelative;
remaining = elapsed * remainingMultiplier;
}
 
sprintf(progressBarText, "%s [%.2i:%.2i:%04.1f][%.2i:%.2i:%04.1f est]", message,
int(floor(elapsed / 3600.0)), int(floor(fmod(elapsed / 60.0, 60.0))), fmod(elapsed, 60.0),
int(floor(remaining / 3600.0)), int(floor(fmod(remaining / 60.0, 60.0))), fmod(remaining, 60.0));
 
// Set the progress text and value to the VFB progress bar
renderer.vfb.setProgressTextAndValue(progressBarText, float(progressRelative));
printf("Progress (%5.2f%%) %s\
", 100.0 * progressRelative, progressBarText);
}
 
int main() {
VRayInit init(NULL, true);
    VRayRenderer renderer;
renderer.setRenderMode(VRayRenderer::RENDER_MODE_PRODUCTION);
    // A listener for progress event
    renderer.setOnProgress(printProgressExt);
// Enable the progress bar in the VFB window
renderer.vfb.enableProgressBar();
    // render ...
    return 0;
}
static string progressBarText;
static double progressStart = 0.0;
static double progressRelative = 0.0;
static double elapsed = 0.0;
static double remaining = 0.0;
 
using (VRayRenderer renderer = new VRayRenderer())
{
renderer.RenderMode = RenderMode.PRODUCTION;
// A listener for progress event
renderer.Progress += new EventHandler<ProgressEventArgs>((source, e) =>
{
progressRelative = e.Progress / (double)e.Total;
if (e.Progress == 0)
{
progressStart = e.Instant;
elapsed = 0.0;
remaining = 0.0;
}
else
{
elapsed = e.Instant - progressStart;
double remainingMultiplier = (1.0 - progressRelative) / progressRelative;
remaining = elapsed * remainingMultiplier;
}
 
progressBarText = string.Format("{0} [{1:00}:{2:00}:{3:00.0}][{4:00}:{5:00}:{6:00.0} est]",
e.Message,
Math.Floor(elapsed / 3600.0), Math.Floor((elapsed / 60.0) % 60.0), (elapsed % 60.0),
Math.Floor(remaining / 3600.0), Math.Floor((remaining / 60.0) % 60.0), (remaining % 60.0)
);
// Set the progress text and value to the VFB progress bar
renderer.Vfb.SetProgressTextAndValue(progressBarText, (float)progressRelative);
Console.WriteLine("Progress ({0,5:N2}%) {1}", 100.0 * progressRelative, progressBarText);
});
 
// Enable the progress bar in the VFB window
renderer.Vfb.EnableProgressBar();
// render ...
}
var progressBarText;
var progressStart = 0.0;
var progressRelative = 0.0;
var elapsed = 0.0;
var remaining = 0.0;
 
var renderer = vray.VRayRenderer();
renderer.renderMode = 'production';
// A listener for progress event
renderer.on('progress', function(message, progress, total, instant) {
progressRelative = progress / total;
if (progress == 0) {
progressStart = instant;
elapsed = 0.0;
remaining = 0.0;
} else {
elapsed = instant - progressStart;
const remainingMultiplier = (1.0 - progressRelative) / progressRelative;
remaining = elapsed * remainingMultiplier;
}
 
progressBarText = util.format('%s [%s:%s:%s][%s:%s:%s est]',
message,
Math.floor(elapsed / 3600.0).toString().padStart(2, '0'),
Math.floor((elapsed / 60.0) % 60.0).toString().padStart(2, '0'),
(elapsed % 60.0).toFixed(1).padStart(4, '0'),
Math.floor(remaining / 3600.0).toString().padStart(2, '0'),
Math.floor((remaining / 60.0) % 60.0).toString().padStart(2, '0'),
(remaining % 60.0).toFixed(1).padStart(4, '0'));
 
// Set the progress text and value to the VFB progress bar
renderer.vfb.setProgressTextAndValue(progressBarText, progressRelative);
console.log('Progress (' + (100.0 * progressRelative).toFixed(2) + '%) ' + progressBarText);
});
// Enable the progress bar in the VFB window
renderer.vfb.enableProgressBar();
// render ...

Tarafından desteklenmektedir BetterDocs

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir