One of the most notorious challenges of default OpenGL is its stateful nature. Setting a texture, shader, or blend mode has global side effects. A well-structured OpenGL application must meticulously save and restore state, sort draw calls by material to minimize pipeline changes, and manually implement batching. A naive OpenGL implementation drawing hundreds of distinct UI elements (buttons, text, icons) would issue hundreds of draw calls, each potentially switching shaders and textures, leading to severe CPU overhead and driver stalls.
Conversely, Skia is a 2D graphics library. It abstracts away the underlying graphics API (which can be OpenGL, Vulkan, Metal, or a software rasterizer). The developer works with high-level objects: SkCanvas , SkPaint , SkPath , SkImage , and SkTextBlob . To draw a rounded rectangle with a gradient, one simply calls canvas->drawRRect() with a paint object. Skia then decomposes this high-level command into lower-level GPU primitives, manages batching, handles clipping and transformation, and efficiently flushes the commands to the GPU via a backend (e.g., OpenGL). Thus, OpenGL is a tool for building a renderer, while Skia is a renderer for 2D content. opengl default vs skia
The choice between using raw OpenGL and adopting Skia is fundamentally a choice between control and productivity. One of the most notorious challenges of default
Skia completely eliminates this burden. The developer issues a sequence of drawRect , drawPath , and drawImage calls. Skia records these into an internal display list, automatically coalescing operations with similar state, reordering draws to reduce texture binds, and triangulating paths on the fly. For example, drawing 1,000 colored circles in Skia results in a few large batches of geometry sent to the GPU, whereas a naive OpenGL implementation would issue 1,000 separate draw calls. This automatic batching is a monumental productivity and performance advantage for 2D interfaces. A naive OpenGL implementation drawing hundreds of distinct
OpenGL runs on virtually every desktop and mobile platform (Windows, macOS via legacy compatibility, Linux, Android, iOS). However, it is a deprecated API on macOS (replaced by Metal) and has been superseded by Vulkan on many high-performance systems. Maintaining an OpenGL backend across platforms increasingly requires fallbacks to Angle (OpenGL on top of DirectX) or other compatibility layers.
Rendering high-quality text and smooth vector paths is notoriously difficult in raw OpenGL. One must load fonts, rasterize glyphs into textures, manage a glyph atlas, handle kerning and subpixel positioning, and write shaders for gamma correction and hinting. Similarly, drawing a Bezier path requires tessellating it into triangles (using libraries like libtess2) or implementing GPU-side path rendering (using NV_path_rendering, which is not standard OpenGL). This is weeks or months of engineering work.
Copyright © 2019 Spreekbuis