- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Tôi đang cố gắng tạo bản sao Snake bằng C++ và OpenGL/GLUT. Tuy nhiên, tôi gặp sự cố khi lập trình để cho phép khoảng thời gian ngắn giữa các Hành động đầu vào. Tôi đã thử một số phương pháp tính thời gian và cuối cùng tôi đã tạo được một lớp cho nó (hiển thị bên dưới). Đây có vẻ là cách tốt nhất để lập trình độ trễ đầu vào (thay vì glutTimerFunc() hoặc sleep()), vì bộ hẹn giờ chạy độc lập với vòng lặp trò chơi, thay vì tạm dừng toàn bộ chương trình. Điều này rất quan trọng vì tôi muốn người chơi có thể tạm dừng bất cứ lúc nào. Thật không may, hiện tại tôi cũng đang gặp vấn đề với cách tiếp cận này. Lớp hẹn giờ của tôi dường như bỏ qua giới hạn thời gian gấp đôi mà tôi đưa ra (được biểu thị đơn giản là gấp đôi "giới hạn").
Để kiểm tra lớp này, tôi thiết lập một chương trình bảng điều khiển lặp đơn giản hiển thị đầu vào được chỉ đạo từ người dùng khi bộ hẹn giờ đạt đến giới hạn thời gian. Nó sẽ hiển thị đầu vào cứ sau 0,33 giây. Thay vào đó, nó hiển thị đầu vào ở các khoảng thời gian cố định khoảng 0,8 giây, bất kể giá trị của giới hạn thời gian. Tại sao nó không hiển thị dữ liệu đầu vào ở một khoảng thời gian nhất định và tại sao nó lại có giới hạn thời gian riêng?
Đây cũng là dự án C++/OpenGL lớn đầu tiên của tôi mà không có hướng dẫn, vì vậy mọi nhận xét hoặc đề xuất về mã/cách tiếp cận của tôi đều được hoan nghênh!
#include
#include "timer.h"
// Bao gồm tất cả các file cần thiết cho OpenGL/GLUT tại đây.
using namespace std;
Hẹn giờ hẹn giờ;
// Chèn mã OpenGL/GLUT cần thiết để hiển thị/lặp lại ở đây.
cập nhật void(giá trị int)
{
nếu (timer.checkTime())
{
nếu (GetAsyncKeyState(VK_LEFT))
cout << "Bạn đã nhấn TRÁI!" << endl;
nếu không thì (GetAsyncKeyState(VK_RIGHT))
cout << "Bạn đã nhấn PHẢI!" << endl;
nếu không thì (GetAsyncKeyState(VK_UP))
cout << "Bạn đã nhấn LÊN!" << endl;
nếu không thì (GetAsyncKeyState(VK_DOWN))
cout << "Bạn đã nhấn DOWN!" << endl;
}
glutTimerFunc(1000/60, cập nhật, 0);
glutPostRedisplay();
}
hẹn giờ.h
#pragma một lần
#include
lớp học hẹn giờ
{
public:
Hẹn giờ();
bool checkTime(giới hạn kép = 0,33);
private:
nhân đôi getElapsed();
thời gian_t bắt đầu;
time_t bây giờ;
gấp đôi trôi qua;
chạy bool;
};
hẹn giờ.cpp
#include "timer.h"
Bộ hẹn giờ::Bộ hẹn giờ()
{
đang chạy = sai;
}
bool Hẹn giờ::checkTime (giới hạn gấp đôi)
{
đã trôi qua = getElapsed();
nếu (đã trôi qua < giới hạn)
{
trả về sai;
}
khác nếu (đã trôi qua >= giới hạn)
{
đang chạy = sai;
trả về đúng sự thật;
}
}
Bộ hẹn giờ kép::getElapsed()
{
nếu (! đang chạy)
{
thời gian(&bắt đầu);
đang chạy = đúng;
trả về 0,00;
}
khác
{
thời gian(&bây giờ);
trả về thời gian khác biệt (bây giờ, bắt đầu);
}
}
câu trả lời hay nhất
glutTimer kích hoạt cứ sau 1000/60 mili giây, bạn kiểm tra Time::checkTime, gọi getElapsed. Tất cả các hàm thời gian của bạn được xác định gấp đôi, nhưng bạn đang sử dụng time_t, chỉ có độ phân giải 1 giây.
Vì vậy, bạn sẽ nhận được một cái gì đó trông như thế này (kỹ thuật số tương tự)
thời gian bắt đầu: 1234,5 giây
glutTimer: 1234,516 giây (getElapsed = 0) // checkTime trả về false
glutTimer: 1234,532 giây (getElapsed = 0)
...
glutTimer: 1234,596 giây (getElapsed = 0)
glutTimer: 1235.012 giây (getElapsed = 1) // điều kiện cuối cùng trả về true
...
Vì vậy, độ trễ thực tế phụ thuộc vào thời điểm bạn đặt thời gian bắt đầu so với thời gian bắt đầu thực tế là một giây kể từ kỷ nguyên được sử dụng bởi time();
Tôi nghi ngờ nếu bạn đo lường theo thống kê, thời gian trung bình sẽ gần hơn 0,5 giây.
Trả lời câu hỏi về “Giải pháp”:
Các hàm khác nhau trả về thời gian hiện tại sẽ trả về mức độ chính xác khác nhau. Ví dụ: ngay bây giờ, đồng hồ ở góc dưới bên phải màn hình của tôi ghi "12:14 PM". Chính xác là 12:14 không có giây hay là 12:14 cộng 59 giây? Tôi không thể biết vì "độ phân giải" của màn hình đồng hồ là một phút. Tương tự như vậy, tôi có thể nói bây giờ là 12 giờ 15, nhưng nếu tôi báo thời gian với độ phân giải "một phần tư giờ" thì thực tế là 14 phút trôi qua. Là con người, chúng ta luôn làm điều này mà không cần suy nghĩ. Trong phần mềm, bạn phải chú ý đến những chi tiết này khi gọi bất kỳ chức năng nào.
Nếu đang sử dụng Windows, bạn có thể nhận bộ hẹn giờ có độ phân giải cao thông qua API QueryPerformanceCounter. Trên hầu hết các nền tảng, bộ đếm hiệu suất đều dựa trên phần cứng với độ phân giải trong phạm vi micro giây.
Đây là một ví dụ về cách gọi nó:http://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx#examples_for_acquiring_time_stamps
LARGE_INTEGER Thời gian bắt đầu, Thời gian kết thúc, Micro giây đã trôi qua;
Tần số LARGE_INTEGER;
QueryPerformanceFrequency(&Frequency); // lấy số lượng tích tắc mỗi giây
QueryPerformanceCounter(&StartingTime); // lấy số tích tắc bắt đầu
// Hoạt động được tính thời gian
QueryPerformanceCounter(&EndingTime); // lấy số lượng dấu tích kết thúc
ElapsedMicroseconds.QuadPart = Thời gian kết thúc.QuadPart - Thời gian bắt đầu.QuadPart;
//
// Bây giờ chúng ta có số lượng tích tắc đã trôi qua, cùng với
// số lượng tích tắc mỗi giây Chúng tôi sử dụng các giá trị này.
// để chuyển đổi thành số micro giây đã trôi qua.
// Để tránh mất độ chính xác, chúng tôi chuyển đổi
// đến micro giây *trước* chia cho tích tắc mỗi giây.
//
Đã trôi quaMicroseconds.QuadPart *= 1000000;
ElapsedMicroseconds.QuadPart /= Tần số.QuadPart;
Có thể có những công cụ tương tự trên Linux nhưng tôi không quen với chúng.
Hãy thử điều này:
cập nhật void(giá trị int)
{
nếu (timer.hasTicked())
{
nếu (GetAsyncKeyState(VK_LEFT))
cout << "Bạn đã nhấn TRÁI!" << endl;
nếu không thì (GetAsyncKeyState(VK_RIGHT))
cout << "Bạn đã nhấn PHẢI!" << endl;
nếu không thì (GetAsyncKeyState(VK_UP))
cout << "Bạn đã nhấn LÊN!" << endl;
nếu không thì (GetAsyncKeyState(VK_DOWN))
cout << "Bạn đã nhấn DOWN!" << endl;
}
khác nếu (!timer.isRunning())
{
bộ đếm thời gian.start();
}
glutTimerFunc(1000/60, cập nhật, 0);
glutPostRedisplay();
}
hẹn giờ.h
// lớp này cung cấp một bộ đếm thời gian có thể được thăm dò và sẽ cho phép người dùng biết liệu một khoảng thời gian đã trôi qua hay chưa.
// lưu ý rằng bộ hẹn giờ này KHÔNG gửi bất kỳ sự kiện nào khi hết thời gian chờ.
lớpPollTimer
{
public:
PollTimer();
// giả sử giới hạn thời gian là một số mili giây và vừa với một số nguyên bình thường thay vì 64 bit
// biến thể (đó sẽ là độ trễ DÀI).
void setTimeout(int msDelay);
// Bộ định thời thường hiển thị tính năng bắt đầu/dừng và nói chung không nên tạo một chức năng duy nhất
// làm quá tải các tổ hợp hành vi phức tạp như ở đây cả hoạt động bắt đầu và hoạt động đã trôi qua.
// thừa nhận đây là một trường hợp đơn giản, nhưng nhìn chung nó là một mẫu thiết kế tồi dẫn đến “ác”.
bắt đầu vô hiệu();
làm mất hiệu lực dừng();
bool isRunning();
// Bộ đếm thời gian đã hết hạn kể từ lần thăm dò cuối cùng chưa
bool hasTicked();
private:
LARGE_INTEGER Thời gian bắt đầu;
tần số LARGE_INTEGER; // mỗi giây
độ trễ int; // tính bằng mili giây
chạy bool;
};
hẹn giờ.cpp
#include "timer.h"
PollTimer::PollTimer()
{
// bỏ qua việc kiểm tra lỗi đối với phần cứng không hỗ trợ điều này.
QueryPerformanceFrequency(& Frequency); // lấy số lượng tích tắc mỗi giây
đang chạy = sai;
}
void PollTimer::setTimeout(int msDelay)
{
độ trễ = msDelay;
}
void PollTimer::start()
{
QueryPerformanceCounter(&startTime);
đang chạy = đúng;
}
void PollTimer::stop()
{
đang chạy = sai;
}
bool PollTimer::isRunning()
{
chạy trở lại;
}
bool PollTimer::hasTicked()
{
nếu (!đang chạy)
trả về sai;
LARGE_INTEGER bây giờ;
QueryPerformanceCounter(&now);
LARGE_INTEGER Đã trôi quaMili giây;
Đã trôi quaMilli giây.QuadPart = now.QuadPart - startTime.QuadPart;
Đã trôi quaMilli giây.QuadPart *= 1000000;
Đã trôi quaMilliseconds.QuadPart /= tần số.QuadPart // bây giờ là micro giây;
Đã trôi quaMilliseconds.QuadPart /= 1000; // mili giây
bool fExpired = ( ElapsedMilliseconds.HighPart > 0 || ElapsedMilliseconds.LowPart >= delay ) ;
nếu(fĐã hết hạn)
{
// đặt lại thời gian bắt đầu
start(); // không sao chép/dán mã bạn có thể gọi.
}
trả lại fĐã hết hạn;
}
Về nhân bản rắn C++: chức năng hẹn giờ bỏ qua thời gian dừng nhất định và dừng tại thời điểm cố định của chính nó, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/24846663/
Trong khi thử triển khai thời gian bằng python, tôi nhận thấy hành vi kỳ lạ khi gọi time.time() hai lần trong một câu lệnh. Có một độ trễ xử lý rất nhỏ khi nhận được time.time() trong quá trình thực thi câu lệnh. Ví dụ: time.ti
Tôi đang phát điên. Đối với cuộc sống của tôi, tôi không thể hiểu tại sao đoạn mã sau lại khiến Unity bị treo ngay khi tôi nhấn play. Đây là một dự án trống có tập lệnh được đính kèm với một đối tượng trò chơi trống. Trong bảng điều khiển, không có gì xuất hiện, thậm chí cả Debug ban đầu
Tôi đang phát điên. Đối với cuộc sống của tôi, tôi không thể hiểu tại sao đoạn mã sau lại khiến Unity bị treo ngay khi tôi nhấn play. Đây là một dự án trống có tập lệnh được đính kèm với một đối tượng trò chơi trống. Trong bảng điều khiển, không có gì xuất hiện, thậm chí cả Debug ban đầu
Tôi không hiểu tại sao kết quả bên dưới lại giống nhau. Tôi mong đợi kết quả đầu tiên là địa chỉ con trỏ. func print(t *time.Time) { fmt.Println(t) // 10-11-2009 23:00:00
Python 3.6.4 (v3.6.4:d48eceb, ngày 19 tháng 12 năm 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)] trên win32 Nhập "trợ giúp
Khi tôi có time.Time: // Tháng 1, ngày 29 t, _ := time.Parse("2006-01-02", "2016-01-29") Làm thế nào để lấy ti đại diện cho ngày 31 tháng 1
Đầu tiên, tôi nhận ra rằng việc sử dụng thời gian với múi giờ không được chấp nhận. Tôi muốn sử dụng điều này vì tôi đang so sánh nhiều giá trị thời gian với múi giờ với thời gian hệ thống hiện tại của mình bất kể ngày nào. tức là. Người dùng nói 0 mỗi ngày
Cách tiêu chuẩn lâu đời để đo thời gian chính xác trong Rust là thùng thời gian và hàm time::precise_time_ns của nó. Tuy nhiên, khung thời gian hiện không được dùng nữa và thư viện std có std::tim
Tôi đang thực hiện chương trình sai phân hữu hạn của mình trên một cụm khoa học ở trường. Chương trình này sử dụng openmpi để song song mã. Khi chương trình chạy liên tục, tôi nhận được: người dùng 78m40.592s thực 78m34.920s s
Mặc dù chúng không được dùng nữa và có các mô-đun tốt hơn thời gian (cụ thể là timeit), tôi muốn biết sự khác biệt giữa hai hàm time.clock() và time.time(). Bắt đầu từ cái sau (time.time()),
Câu hỏi này đã có câu trả lời ở đây: Độ chính xác của time.clock() so với time.time() của Python? (16 câu trả lời) Đã đóng 6 năm trước. Tôi nghĩ cả hai đều đo lượng thời gian? nhưng họ quay lại
Tôi đang thử kiểm tra xem khối mã xử lý yêu cầu http mất bao lâu trong Bộ điều khiển Flask của tôi, đây là mã mẫu tôi đang sử dụng: cancel = [] t0 = time.time() t1 = ti
Điều gì xảy ra khi đồng hồ của máy tính (Windows hoặc Linux) chạy python tự động thay đổi và gọi time.time()? Tôi đọc được rằng khi đồng hồ được thay đổi thủ công thành một giá trị nào đó trong quá khứ, giá trị của time.time() sẽ nhỏ hơn. hầu hết
Tôi có một cấu trúc có thể không đặt được giá trị time.Time trên một trong các trường của nó. Khi kiểm tra tính không hợp lệ, tôi không thể sử dụng nil hoặc 0. time.Unix(0,0) cũng khác. Tôi đã nghĩ ra điều này: var EmptyTime time.
Tôi có một cấu trúc mà tôi định điền các bản ghi cơ sở dữ liệu, một trong các cột ngày giờ có thể rỗng: type Reminder struct { Id int CreatedAt time.Time
Báo cáo vấn đề: Thực hiện ngẫu nhiên các lệnh khác nhau bằng cách khớp tỷ lệ phần trăm của chúng. Ví dụ: nếu CommandA được thực thi 50% thời gian, commandB 25% thời gian, commandC 15% thời gian, v.v. thì tổng tỷ lệ phần trăm phải là 100%. câu hỏi của tôi
Tôi đang sử dụng laravel 6. Tôi có Bộ điều khiển tương tự và Chế độ xem tương tự trong cùng một ứng dụng và nó hoạt động tốt. Sau khi so sánh, không tìm thấy lỗi nào. Mặt tiền\Đánh lửa\Ngoại lệ\V
Tôi cần biểu thị thời gian ở định dạng ("%m/%d/%Y %H:%M:%S") và giá trị dấu phẩy động tôi nhận được là time.time(). ) giá trị trong biểu mẫu. Ví dụ: tôi đã có một giá trị mà tôi sử dụng cứ sau 0,3 giây
Tôi đang nhận được datetime utc bằng cách sử dụng: import datetime import time from pytz import timezone now_utc = datetime.datet
Tôi đang sử dụng time.clock và time.time để tính thời gian cho một đoạn mã python trên Ubuntu: thời gian đã trôi qua của đồng hồ: thời gian đã trôi qua là 8,770 giây
Tôi là một lập trình viên xuất sắc, rất giỏi!