Stundas uzdevums: Apgūt Big O notāciju un optimizēt spēles algoritmus.
Pirms sāc: izmanto iepriekš apgūto un šīs lapas teorijas/koda piemērus. Ja vajadzīga jauna komanda vai rīks, vispirms atrodi tās paraugu teorijas sadaļā.
Big O notācija apraksta, kā algoritma laiks pieaug ar datu apjomu.
| O | Apraksts | Piemērs |
|---|---|---|
| O(1) | Konstants | Direct array access |
| O(log n) | Logaritmisks | Binary search |
| O(n) | Lineārs | Iteration |
| O(n log n) | Linearitmisks | Quicksort, Mergesort |
| O(n²) | Kvadrātisks | Nested loops |
| O(2^n) | Eksponenciāls | Brute force search |
// O(n) - lineārs
for (int i = 0; i < n; i++) {
cout << arr[i];
}
// O(n²) - kvadrātisks (slikti lielam n)
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (arr[i] == arr[j]) ...
}
}
// O(log n) - bināra meklēšana
int binary_search(vector<int>& arr, int target) {
int lo = 0, hi = arr.size() - 1;
while (lo <= hi) {
int mid = (lo + hi) / 2;
if (arr[mid] == target) return mid;
if (arr[mid] < target) lo = mid + 1;
else hi = mid - 1;
}
return -1;
}
Atceries: ar redzamu efektu editorā nepietiek. Paskaidro, kura C++ klase glabā stāvokli, kura metode to maina un kā Godot node struktūra izmanto šo kodu.
Pārbaudi: C++ kods pārbauda failu kļūdas, validē datus, izmanto versijas lauku un pamato algoritmu sarežģītību.
#include <godot_cpp/variant/string.hpp>
using namespace godot;
struct PersistenceCheckpoint {
String lesson = "5.5 Algoritmu efektivitāte";
bool uses_cpp = true;
bool handles_missing_file = true;
bool validates_data = true;
bool documents_complexity = true;
};
Šis ir īss iesildīšanās uzdevums. Nokopē sagatavi, ielīmē to pareizajā koda vietā un palaid. Šeit pietiek droši izmēģināt tēmu 5.5 Algoritmu efektivitāte; detalizētu izpratni veidosi nākamajos uzdevumos.
Kopējamais piemērs vai sagatave: izmanto šo bloku kā starta punktu, nevis kā gala risinājumu.
#include <godot_cpp/variant/string.hpp>
using namespace godot;
struct PersistenceCheckpoint {
String lesson = "5.5 Algoritmu efektivitāte";
bool uses_cpp = true;
bool handles_missing_file = true;
bool validates_data = true;
bool documents_complexity = true;
};
.cpp vai .hpp failā pie šīs stundas klases.Pievieno šīs stundas paņēmienu kā nelielu, strādājošu spēles mehānikas daļu.
PlayerState, velocity, score vai update_ui()._ready(), _process(), _physics_process(), signāla apstrādātāja vai projekta palīgklases.Pārbaudi, vai C++ algoritms darbojas paredzami spēles vidē.
Ja pamatdarbs ir pabeigts, paplašini spēli ar vienu nelielu C++ uzlabojumu.
// Spatial hash priekš ātras kolīzijas
class SpatialHash {
private:
static const int CELL_SIZE = 64;
std::unordered_map<int64_t, std::vector<Node2D*>> grid;
int64_t cell_key(int cx, int cy) {
return ((int64_t)cx << 32) | (uint32_t)cy;
}
public:
void rebuild(const std::vector<Node2D*>& objects) {
grid.clear();
for (Node2D* obj : objects) {
Vector2 pos = obj->get_position();
int cx = pos.x / CELL_SIZE;
int cy = pos.y / CELL_SIZE;
grid[cell_key(cx, cy)].push_back(obj);
}
}
std::vector<Node2D*> get_nearby(Vector2 pos) {
int cx = pos.x / CELL_SIZE;
int cy = pos.y / CELL_SIZE;
std::vector<Node2D*> result;
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
auto it = grid.find(cell_key(cx + dx, cy + dy));
if (it != grid.end()) {
result.insert(result.end(),
it->second.begin(), it->second.end());
}
}
}
return result;
}
};