2011-11-20 35 views
5

Vì vậy, đã có một "tính năng" mới trong trình phát flash kể từ phiên bản 10.1, làm giảm tốc độ khung hình của người chơi xuống 2 khung hình/giây khi cửa sổ ứng dụng không hiển thị. Đây là tin tốt cho hiệu suất, nhưng nó có thể phá vỡ một số chức năng, chẳng hạn như lớp Timer.Ứng dụng web Flex: ngăn chặn giảm tốc độ khung hình khi cửa sổ vô hình

Tôi có một ứng dụng sử dụng Bộ hẹn giờ để hiển thị đếm ngược. Do tính chất của ứng dụng, nó là cần thiết cho Timer để hoàn thành đếm ngược của nó ngay cả khi người dùng không có ở đó để xem nó. Hãy tưởng tượng rằng bạn cần cung cấp cho người dùng chỉ 10 giây để thực hiện một tác vụ. Nếu người dùng thu nhỏ cửa sổ nửa chừng qua bộ đếm, họ có thể mất nhiều thời gian tùy thích và vẫn còn 5 giây khi họ quay lại cửa sổ. Điều này dường như không thể tránh được với các cầu thủ flash mới hơn.

Trong ứng dụng Air có thuộc tính backgroundFrameRate có thể được đặt để ngăn chặn hành vi này, nhưng đây là một phần của lớp WindowedApplication, vì vậy có vẻ như nó không có sẵn trong ứng dụng web. Có ai biết cách giữ tốc độ khung hình không đổi ngay cả khi cửa sổ không hiển thị? Cảm ơn

+0

+1 để thêm nhận xét về thuộc tính trong ứng dụng AIR. Tôi đã không biết rằng đã tồn tại. Tôi cũng ngạc nhiên khi có một cách để làm điều này trong một trình duyệt. – JeffryHouser

+0

Xin chào ông Jay, bạn có thử các bản sửa lỗi có thể không? – Ryan

+0

Chưa, xin lỗi. Tôi đã vô cùng bận rộn nhưng tôi sẽ đăng những gì tôi đã tìm thấy ngay sau khi tôi dùng thử.Tôi đã chạy một số thử nghiệm nhanh chóng và tôi đã có một thời gian khó khăn sao chép sự chậm trễ, dẫn tôi tin rằng có lẽ tôi đã sai về sự giảm tốc độ khung hình ảnh hưởng đến bộ đếm thời gian. Dù bằng cách nào tôi sẽ cố gắng để kiểm tra nó mặc dù tôi không chắc chắn làm thế nào để đo tốc độ khung hình với cửa sổ xem ra (trong trường hợp bộ đếm thời gian không bị ảnh hưởng). Tôi nghĩ tiền thưởng sẽ được trả tự động cho câu trả lời với số điểm cao nhất, nhưng nếu không phải là trường hợp tôi có thể chấp nhận câu trả lời của bạn vì bạn là người đầu tiên trả lời. – JayPea

Trả lời

1

Đặt thông số wmode của swf được nhúng thành mờ sẽ ngăn điều chỉnh tốc độ khung hình.

Brian

0

Tôi đã không cố gắng bản thân mình, nhưng có lẽ bạn có thể thử để buộc các onDeactivate Framerate:

stage.addEventListener(Event.DEACTIVATE, onDeactivate); 

function onDeactivate (e:Event):void 
{ 
    //eg myFrameRate=24 
    stage.frameRate = myFrameRate; 
} 

Hãy cho tôi biết nếu làm việc này.

+0

Cảm ơn, tôi chưa đã có cơ hội để kiểm tra điều này nhưng tôi sẽ trao tiền thưởng ngay khi tôi làm. Nếu cả hai câu trả lời đều hiệu quả, tôi sẽ đưa nó cho Brian kể từ khi anh ấy trả lời trước. – JayPea

+0

@JayPea: không có vấn đề gì với tiền thưởng ;-) – AsTheWormTurns

0

thử nghiệm với:

private var numer:int = 0; 
private var prevNumer:int = 0; 
private var timer:Timer = new Timer(1000, 0) 

[...]

var tf:TextField = new TextField(); 
addChild (tf); 
addEventListener (Event.ENTER_FRAME, onEnterFrame) 
timer.addEventListener (TimerEvent.TIMER, onTimer) 
timer.start() 
function onTimer (e:TimerEvent):void 
{ tf.appendText (' ' + (numer - prevNumer)); prevNumer = numer;} 
function onEnterFrame (e:Event):void { numer++ } 

cho thấy rõ ràng, rằng khi bạn nhìn thấy đèn flash, tf gắn số tương đương với FPS của bạn. Nếu bộ hẹn giờ sẽ bị thay đổi cùng với FPS, bạn sẽ không thấy sự khác biệt khi thu nhỏ cửa sổ. Nhưng, quay lại Bạn thấy 2 2 2 2 2, tức là, FPS đã giảm xuống còn 2.

onDừng giải pháp bởi AsTheWormTurns không hoạt động. Sự kiện được kích hoạt, nhưng khung hình/giây không thay đổi. wmode = giải pháp đục bởi ông Brian Giám Mục không làm việc quá

một cái gì đó rõ ràng để thử: thay đổi chức năng onEnterFrame để thiết lập FPS:

function onEnterFrame (e:Event):void { numer++; stage.frameRate = 30 } 

Rõ ràng Bạn không thể đặt FPS khi flash là không nhìn thấy được! Vâng, Bạn không thể đặt FPS trừ khi Bạn đặt nó là 1.

Giải pháp cho vấn đề của bạn là đơn giản, chỉ cần thực hiện một bộ đếm thời gian tương tự như sau trên nhưng với điều kiện thêm:

function onTimer (e:TimerEvent):void { 
if (numer - prevNumer == 2) adjustOriginalTimer(); 
tf.appendText (' ' + (numer - prevNumer)); prevNumer = numer; 
} 

E: Bạn có thể đọc về điều này tại đây: http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-8000.html

Các vấn đề liên quan